#include #include #include #include #include #include #include #include #include #include #include const int max = 1000; void cut(char **argv, char *command){ int w = 0; char sep[] = " "; char *ptr = strtok(command, sep); while (ptr != NULL){ argv[w]=ptr; w+=1; ptr = strtok(NULL, sep); } argv[w]=NULL; } void cd (char **argv){ if(argv[1] == NULL){ printf("Add arguments\n"); return; } else if(argv[2] != NULL){ printf("Too many arguments\n"); return; } else{ if (chdir(argv[1]) != 0) perror("chdir error"); return; } } void spathf (char **argv, int *spath){ int l; if (argv[1] == NULL){ printf("Add arguments\n"); return; } else if (argv[2] != NULL){ printf("Too many arguments\n"); return; } else if (!strcmp(argv[1], "help")){ printf("Arguments:\n0 turns off path showing\n1 turns on path showing\n"); return; } l = argv[1][0] - '0'; if (argv[1][1] != 0 || l < 0 || l > 1){ printf("Wrong number\n"); return; } else *spath = l; } int main (){ int spath = 1; using_history(); while (1){ char* argv[100]; char *komenda, *prompt, directory[max]; if (getcwd(directory, sizeof(directory)) == NULL){ perror("getcwd() error"); return -1; } struct passwd *p = getpwuid(getuid()); if (spath){ prompt = (char*)malloc(strlen(directory)+strlen(p->pw_name)+22 *sizeof(char)); prompt[0]='\0'; strcat(prompt, "\033[1;32m"); strcat(prompt, "["); strcat(prompt, directory); strcat(prompt, "]\033[0m"); strcat(prompt, p->pw_name); } else{ prompt = (char*)malloc(strlen(p->pw_name)+3 *sizeof(char)); strcat(prompt, p->pw_name); } strcat(prompt, "$ "); if (!(komenda = readline(prompt))) break; if (komenda[0] == 0) continue; add_history(komenda); cut(argv, komenda); if (argv[0]==NULL) continue; else if (!strcmp(argv[0], "spath")){ spathf(argv, &spath); continue; } else if (!strcmp(argv[0], "cd")){ cd(argv); continue; } else if (!strcmp(argv[0], "help")){ if (fork() == 0){ execlp("less", "less", "help", NULL); perror("execlp"); exit(EXIT_FAILURE); } else wait(NULL); } else if (!strcmp(argv[0], "exit")) break; else if (fork() == 0){ execvp(argv[0], argv); perror("execvp"); exit(EXIT_FAILURE); } else wait(NULL); free(komenda); free(prompt); } return 0; }