Code:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<ctype.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
#define NUM1 10
#define NUM2 100
#define NUM3 256
extern int errno;
typedef void(*sighandler_t)(int);
static char buf[NUM3];
static char *my_argv[NUM2],*my_envp[NUM2];
static char *search_path[NUM1];
void show_prompt()
{
getcwd(buf,sizeof buf);
printf("%s:* ",buf);
}
void handle_signal(int signo) /
{
printf("\n");
show_prompt();
fflush(stdout);
}
void fill_argv(char *tmp_argv)
char *foo = tmp_argv;
int index = 0;
char ret[100];
bzero(ret,100);
while(*foo != '\0')
{
if(index == 10)
break;
if(*foo == ' ')
{
if(my_argv[index] == NULL)
my_argv[index]=(char*)malloc(sizeof(char)*strlen(ret)+1);
else
{
bzero(my_argv[index],strlen(my_argv[index]));
}
strncpy(my_argv[index],ret,strlen(ret));
strncat(my_argv[index],"\0",1);
bzero(ret,100);
index++;
}
else
{
strncat(ret,foo,1);
}
foo++;
}
my_argv[index]=(char*)malloc(sizeof(char)*strlen(ret)+1);
strncpy(my_argv[index],ret,strlen(ret));
strncat(my_argv[index],"\0",1);
}
void copy_envp(char **envp)
{
int index = 0;
for(;envp[index]!=NULL;index++)
{
my_envp[index]=(char*)malloc(sizeof(char)*(strlen(envp[index])+1));
memcpy(my_envp[index],envp[index],strlen(envp[index]));
}
}
void get_path_string(char **tmp_envp,char *bin_path)
{
int count = 0;
char *tmp;
while(1)
{
tmp = strstr(tmp_envp[count], "PATH");
if(tmp == NULL)
{
count++;
}
else
{
break;
}
}
strncpy(bin_path,tmp,strlen(tmp));
}
void insert_path_str_to_search(char *path_str)
{
int index = 0;
char *tmp = path_str;
char ret[100];
while(*tmp != '=')
tmp++;
tmp++;
while(*tmp != '\0')
{
if(*tmp==':')
{
strncat(ret,"/",1);
search_path[index]=(char*)malloc(sizeof(char)*(strlen(ret)+1));
strncat(search_path[index],ret,strlen(ret));
strncat(search_path[index],"\0",1);
index++;
bzero(ret,100);
}
else
{
strncat(ret,tmp,1);
}
tmp++;
}
}
int attach_path(char *cmd)
{
char ret[100];
int index;
int fd;
bzero(ret,100);
for(index=0;search_path[index]!=NULL;index++)
{
strcpy(ret,search_path[index]);
strncat(ret,cmd,strlen(cmd));
if((fd=open(ret,O_RDONLY))>0)
{
strncpy(cmd,ret,strlen(ret));
close(fd);
return(0);
}
}
return(0);
}
void call_execve(char *cmd)
{
int i;
printf("\n");
if(fork() == 0)
{
i = execve(cmd,my_argv,my_envp);
if(i<0)
{
printf("%s:command not found\n",cmd);
exit(1);
}
}
else
{
wait(NULL);
}
}
void free_argv()
{
int index;
for(index=0;my_argv[index]!=NULL;index++)
{
bzero(my_argv[index],strlen(my_argv[index])+1);
my_argv[index]=NULL;
free(my_argv[index]);
}
}
int main(int argc, char *argv[], char *envp[])
{
char c;
int i,fd;
char *tmp=(char*)malloc(sizeof(char)*100);
char *path_str=(char*)malloc(sizeof(char)*256);
char *cmd=(char*)malloc(sizeof(char)*100);
signal(SIGINT,SIG_IGN);
signal(SIGINT,handle_signal);
copy_envp(envp);
get_path_string(my_envp,path_str);
insert_path_str_to_search(path_str);
if(fork() == 0)
{
execve("/usr/bin/clear",argv,my_envp);
exit(1);
}
else
{
wait(NULL);
}
show_prompt();
fflush(stdout);
while(c!=EOF)
{
c=getchar();
switch(c){
case '\n':if(tmp[0]=='\0'){
show_prompt();
}else{
fill_argv(tmp);
strncpy(cmd,my_argv[0],strlen(my_argv[0]));
strncat(cmd,"\0",1);
if(index(cmd,'/')==NULL){
if(attach_path(cmd)==0){
call_execve(cmd);
}else{
printf("%s:command not found\n",cmd);
}
}else{
if((fd=open(cmd,O_RDONLY))>0){
close(fd);
call_execve(cmd);
}else{
printf("%s:command not found\n",cmd);
}
}
free_argv();
printf("\n");
show_prompt();
bzero(cmd,100);
}
bzero(tmp,100);
break;
default:strncat(tmp,&c,1);
}
}
free(tmp);
free(path_str);
for(i=0;my_envp[i]!=NULL;i++)
free(my_envp[i]);
for(i=0;i<10;i++)
free(search_path[i]);
printf("\n");
return(0);
}