Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <sys/wait.h>
  6. #include <sys/types.h>
  7. #include <string.h>
  8. #include <readline/history.h>
  9. #include <readline/readline.h>
  10.  
  11. enum PIPES
  12. {
  13. READ, WRITE
  14. };
  15.  
  16. typedef void sigfunc(int);
  17. sigfunc *signal(int, sigfunc*);
  18. #define MAX 100
  19. #define MAXCOM 1000 // max number of letters to be supported
  20. #define MAXLIST 100 // max number of commands to be supported
  21. char *filename;
  22.  
  23. void getArgs(char* line,char** argsList)
  24. {
  25. int i;
  26. for (i = 0; i < MAXLIST; i++)
  27. {
  28. argsList[i] = strsep(&line, " ");
  29.  
  30. if (argsList[i] == NULL)
  31. break;
  32. if (strlen(argsList[i]) == 0)
  33. i--;
  34. }
  35. }
  36.  
  37. int inputLine(char* line)
  38. {
  39. char* help;
  40.  
  41. help = readline("\n$ ");
  42. if (strlen(help) != 0)
  43. {
  44. add_history(help);
  45. strcpy(line, help);
  46. return 0;
  47. }
  48. else
  49. {
  50. return 1;
  51. }
  52. }
  53.  
  54. int checkForPipes(char* str, char** argsLines)
  55. {
  56. int i;
  57. int count=0;
  58. for (i = 0; i < MAXLIST; i++)
  59. {
  60. argsLines[i] = strsep(&str, "|");
  61. if (argsLines[i] == NULL)
  62. break;
  63. }
  64. while (argsLines[count + 1] != NULL)
  65. count++;
  66. return count;
  67. }
  68.  
  69.  
  70. void printDir()
  71. {
  72. char cwd[1024];
  73. getcwd(cwd, sizeof(cwd));
  74. printf("\nDir: %s", cwd);
  75. }
  76.  
  77. void editPath(char* str)
  78. {
  79. int i;
  80. char help[MAXCOM];
  81. char help2[MAXCOM]="./";
  82. if(str!=NULL)
  83. {
  84. if(str[0]=='/')
  85. {
  86. for(i=0; i<strlen(str); i++)
  87. {
  88. if(str[strlen(str)-1-i]=='/')
  89. {
  90. strncpy(help,str,strlen(str)-i);
  91. strcat(help,"./");
  92. strcat(help,str+(strlen(str)-i));
  93. str=help;
  94. }
  95. }
  96. }
  97. else
  98. {
  99. strcat(help2,str);
  100. strcpy(str,help2);
  101. }
  102. }
  103. }
  104.  
  105. void loadHistory(const char *filename)
  106. {
  107. using_history();
  108. read_history(filename);
  109. }
  110.  
  111. void printHistory(void)
  112. {
  113. HISTORY_STATE *commandHistory = history_get_history_state();
  114. HIST_ENTRY **commandList = history_list();
  115. printf("\n**********Shell History**********\n\n");
  116. for(int i = 0; i < commandHistory->length; i++)
  117. {
  118. printf("Command: %d ",i+1);
  119. printf("%8s %s\n ", commandList[i]->line, commandList[i]->timestamp);
  120. }
  121. }
  122.  
  123. void writeHistory(const char *filename)
  124. {
  125. write_history(filename);
  126. }
  127.  
  128. void deleteHistory(const char *filename)
  129. {
  130. FILE *file = fopen(filename, "r+");
  131. int temp = remove(filename);
  132. clear_history();
  133. }
  134.  
  135. void sigHandler(int signo)
  136. {
  137. if(signo == SIGQUIT) printHistory();
  138. }
  139.  
  140. int lineInMenu(char* line, char** argsList)
  141. {
  142. if(strcmp(line, "exit")==0)
  143. {
  144. writeHistory(filename);
  145. exit(0);
  146. }
  147. else if(strcmp(line, "history") ==0)
  148. {
  149. printHistory();
  150. return 1;
  151. }
  152. else if(strcmp(line, "delete") ==0)
  153. {
  154. deleteHistory(filename);
  155. return 1;
  156. }
  157. else if(strcmp(argsList[0],"cd")==0)
  158. {
  159. chdir(argsList[1]);
  160. return 1;
  161. }
  162. else return 0;
  163. }
  164.  
  165. char* getUsername(void)
  166. {
  167. char *username;
  168. username = malloc(MAX*sizeof(char));
  169. username = getlogin();
  170. return username;
  171. }
  172.  
  173. void setFilepath()
  174. {
  175. char *temp;
  176. temp = malloc(MAX*sizeof(char));
  177. char *username;
  178. username = malloc(MAX*sizeof(char));
  179. username = getUsername();
  180. char first[] = "/home/";
  181. char second[] = "/historyfile.txt";
  182. strcat(temp, first);
  183. strcat(temp, username);
  184. strcat(temp, second);
  185. filename = malloc(strlen(temp));
  186. filename = temp;
  187. printf("FILENAME: %s\n", filename);
  188.  
  189. }
  190.  
  191. void interpretExecution(char** argsList)
  192. {
  193. pid_t pid = fork();
  194. int i = 0;
  195. while (argsList[i + 1] != NULL)
  196. i++;
  197. if (strcmp(argsList[i], "&") == 0)
  198. {
  199. if (pid == 0)
  200. {
  201. argsList[i] = NULL;
  202. if ((execvp(argsList[0], argsList)) < 0)
  203. {
  204. editPath(argsList[0]);
  205. execvp(argsList[0], argsList);
  206. }
  207. exit(0);
  208. }
  209. }
  210. else
  211. {
  212. if (strcmp(argsList[i], "&") != 0 && pid == 0) //Child
  213. {
  214. if ((execvp(argsList[0], argsList)) < 0)
  215. {
  216. editPath(argsList[0]);
  217. execvp(argsList[0], argsList);
  218. }
  219. exit(0);
  220. }
  221. else //Parent
  222. {
  223. wait(NULL);
  224. }
  225. }
  226. }
  227.  
  228. void interpretExecutionWithPipes(char*** extendedArgsList,int execCounter)
  229. {
  230. int i;
  231. int filedes[execCounter-1][2];
  232. for(i=0; i<execCounter-1; i++)
  233. {
  234. pipe(filedes[i]);
  235. }
  236.  
  237. pid_t pid = fork();
  238. puts(extendedArgsList[0][0]);
  239. puts(extendedArgsList[0][1]);
  240. puts(extendedArgsList[1][0]);
  241. if (pid == 0)
  242. {
  243. dup2(filedes[0][WRITE], 1);
  244. execvp(extendedArgsList[i][0], extendedArgsList[i]);
  245. exit(0);
  246. }
  247. else
  248. {
  249. close(filedes[0][1]);
  250. }
  251. for(i=0; i<execCounter-2; i++)
  252. {
  253. pid = fork();
  254. if (pid == 0)
  255. {
  256. dup2(filedes[i][READ], 0);
  257. dup2(filedes[i+1][WRITE], 1);
  258. execvp(extendedArgsList[i][0], extendedArgsList[i]);
  259. }
  260. else
  261. {
  262. close(filedes[i][1]);
  263. }
  264. }
  265.  
  266. pid = fork();
  267. if (pid == 0)
  268. {
  269. dup2(filedes[execCounter-2][READ], 0);
  270. execvp(extendedArgsList[i][0], extendedArgsList[i]);
  271. }
  272. wait(NULL);
  273. }
  274.  
  275. int main(void)
  276. {
  277. setFilepath();
  278. if (signal(SIGQUIT, sigHandler) == SIG_ERR)
  279. printf("SIGQUIT ERROR");
  280. loadHistory(filename);
  281. char line[MAXCOM];
  282. char *argsList[MAXLIST];
  283. char*** extendedArgsList;
  284. puts("nowy program");
  285. int execCounter;
  286. int i,j;
  287. while(1)
  288. {
  289. printDir();
  290. if (inputLine(line))
  291. continue;
  292. execCounter=checkForPipes(line,argsList);
  293. if(execCounter)
  294. {
  295. extendedArgsList= (char ***)malloc(execCounter*sizeof(char**));
  296. for (i = 0; i< MAXLIST; i++)
  297. {
  298. extendedArgsList[i] = (char **) malloc(MAXLIST*sizeof(char *));
  299. for (j = 0; j < MAXCOM; j++)
  300. {
  301. extendedArgsList[i][j] = (char *)malloc(MAXCOM*sizeof(char));
  302. }
  303. }
  304.  
  305. for(i=0; i<execCounter; i++)
  306. {
  307. getArgs(argsList[i],extendedArgsList[i]);
  308. }
  309. interpretExecutionWithPipes(extendedArgsList,execCounter);
  310.  
  311. }
  312.  
  313.  
  314.  
  315. else
  316. {
  317. getArgs(line,argsList);
  318. if (lineInMenu(line,argsList))
  319. continue;
  320. interpretExecution(argsList);
  321. }
  322.  
  323. }
  324. return 0;
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement