#include #include #include #include #include #include #include #include #include #include #include extern int errno; typedef void (*sighandler_t)(int); static char *my_argv[100], *my_envp[100]; static char *search_path[10]; void handle_signal(int signo) { printf("\n[MY_SHELL ] "); 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++; /*printf("foo is %c\n", *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("cmd is %s\n", cmd); if(fork() == 0) { i = execve(cmd, my_argv, my_envp); printf("errno is %d\n", errno); if(i < 0) { printf("%s: %s\n", cmd, "command not found"); 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); } printf("[MY_SHELL ] "); fflush(stdout); while(c != EOF) { c = getchar(); switch(c) { case '\n': if(tmp[0] == '\0') { printf("[MY_SHELL ] "); } 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("[MY_SHELL ] "); bzero(cmd, 100); } bzero(tmp, 100); break; default: strncat(tmp, &c, 1); break; } } 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; }