Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. /** @file shell.c */
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <unistd.h>
  9. #include "log.h"
  10. #include <sys/time.h>
  11. #include "signal.h"
  12.  
  13. log_t *Log;
  14. extern char ** environ;
  15. char * str;
  16. int am;
  17. pid_t id2;
  18. void ignoreExit(int signal)
  19. {
  20. (void)signal;
  21. return;
  22. }
  23.  
  24. void cleanZombie(int signal)
  25. {
  26. (void)signal;
  27. int status;
  28. while (waitpid((pid_t)(-1), &status, WNOHANG) > 0) {}
  29. }
  30.  
  31. void printHistory()
  32. {
  33. int i = 0;
  34. while(i < Log -> counter)
  35. {
  36. printf("%s\n", (Log -> data)[i]);
  37. i++;
  38. }
  39. }
  40.  
  41. void forkStuff(int ti, char * st)
  42. {
  43. int arg = 0;
  44. int counter = 0;
  45. while(1)
  46. {
  47. if(st[counter] == ' ')
  48. arg++;
  49. else if(st[counter] == '\0')
  50. {
  51. arg++;
  52. break;
  53. }
  54. counter++;
  55. }
  56. char ** argv = (char **) malloc((arg + 1)*sizeof(char*));
  57. char * delim = " ";
  58. char * first = strtok(st, delim);
  59. argv[0] = strdup(first);
  60. char * ptr;
  61. int g = 1;
  62. while ((ptr = strtok(NULL, delim)) != NULL) {
  63. argv[g] = strdup(ptr);
  64. g++;
  65. }
  66. argv[arg] = NULL;
  67. struct timeval start;
  68. struct timeval end;
  69. if(ti == 1)
  70. gettimeofday(&start, 0);
  71. id2 = fork();
  72. if(id2 == -1)
  73. exit(EXIT_FAILURE);
  74. else if(id2 == 0)
  75. {
  76. execvp(argv[0], argv);
  77. printf("%s: Command not found\n", argv[0]);
  78. int k = 0;
  79. while(k <= arg)
  80. {
  81. free(argv[k]);
  82. k++;
  83. }
  84. free(argv);
  85. log_destroy(Log);
  86. free(st);
  87. exit(0);
  88. }
  89. else
  90. {
  91. if(am == 0)
  92. {
  93. printf("Command executed by pid = %d\n", id2);
  94. int status;
  95. waitpid(id2, &status, 0);
  96. }
  97. else if(am == 1)
  98. {
  99. printf("Command executed by pid = %d\n", id2);
  100. signal(SIGCHLD, cleanZombie);
  101. }
  102. }
  103. if(ti == 1)
  104. {
  105. gettimeofday(&end, 0);
  106. long el = (end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec;
  107. printf("Execution took %ld microseconds.\n", el) ;
  108. }
  109. int k = 0;
  110. while(k <= arg)
  111. {
  112. free(argv[k]);
  113. k++;
  114. }
  115. free(argv);
  116.  
  117. }
  118.  
  119. void changeDirectory(char * s)
  120. {
  121. char * dir = (char *)malloc((strlen(s) - 1)*sizeof(char)) ;
  122. strcpy(dir, s + 3);
  123. int sd = chdir(dir);
  124. if(sd == -1)
  125. printf("%s: No such file or directory\n", dir);
  126. free(dir);
  127. }
  128. /**
  129. * * Starting point for shell.
  130. * */
  131. int main(int argc, char ** argv) {
  132. /**
  133. * * Analyze command line arguments
  134. * */
  135. Log = malloc(sizeof(log_t));
  136. log_init(Log);
  137. int tz = 0;
  138. if(argc > 1)
  139. {
  140. if(strcmp(argv[1], "-h") == 0)
  141. printf("Shell by vinhha2\n");
  142. else if(strcmp(argv[1], "=") == 0)
  143. {
  144. char ** ptr = environ;
  145. while(*ptr)
  146. {
  147. printf("%s\n", *ptr);
  148. ptr++;
  149. }
  150. }
  151. else if(strcmp(argv[1], "-f") == 0)
  152. {
  153. FILE* f = fopen(argv[2], "r");
  154. if(f != NULL)
  155. {
  156. char* str1 = NULL;
  157. size_t size1 = 0;
  158. while(!feof(f)){
  159. getline(&str1, &size1, f);
  160. system(str1);
  161. }
  162. free(str1);
  163. }
  164. fclose(f);
  165. }
  166. else if(strcmp(argv[1], "-t") == 0)
  167. tz = 1;
  168. }
  169. signal(SIGINT, ignoreExit);
  170. while(1)
  171. {
  172. /**
  173. * * Print a command prompt
  174. * */
  175. am = 0;
  176. int id = getpid();
  177. char wd[1024];
  178. getcwd(wd, sizeof(wd));
  179. printf("(pid=%d)%s$ ", id, wd);
  180. /**
  181. * * Read the commands
  182. * */
  183. str = NULL;
  184. size_t size = 0;
  185. getline(&str, &size, stdin);
  186. if(strcmp(str, "\n") == 0)
  187. {
  188. free(str);
  189. continue;
  190. }
  191. signal(SIGINT, ignoreExit);
  192. char * lol = strndup(str, strlen(str) - 1);
  193. free(str);
  194. str = strdup(lol);
  195. free(lol);
  196. if(strstr(str, "!") == NULL)
  197. log_push(Log, str);
  198. /**
  199. * * Print the PID of the process executing the command
  200. * */
  201.  
  202. /**
  203. * * Decide which actions to take based on the command (exit, run program, etc.)
  204. * */
  205. if(strstr(str, "cd ") != NULL && str[0] == 'c')
  206. {
  207. changeDirectory(str);
  208. }
  209. else if(strcmp(str, "exit") == 0)
  210. {
  211. log_destroy(Log);
  212. free(str);
  213. exit(0);
  214. }
  215. else if(strcmp(str, "!#") == 0)
  216. {
  217. printHistory();
  218. }
  219. else if(str[0] == '!')
  220. {
  221. if(strlen(str) == 1)
  222. {
  223. free(str);
  224. printf("No Match\n");
  225. continue;
  226. }
  227. char * abc = str + 1;
  228. char * s = strdup(abc);
  229. char * argg = log_search(Log, s);
  230. if(argg == NULL)
  231. {
  232. printf("No Match\n");
  233. free(s);
  234. free(str);
  235. continue;
  236. }
  237. else
  238. {
  239. printf("%s matches %s\n", s, argg);
  240. free(str);
  241. str = strdup(argg);
  242. free(argg);
  243. free(s);
  244.  
  245. if(strstr(str, "cd ") != NULL)
  246. {
  247. changeDirectory(str);
  248. }
  249. else if(strstr(str, "&") != NULL)
  250. {
  251. char * ok;
  252. if(strstr(str, " &") != NULL)
  253. ok = strndup(str, strlen(str) - 2);
  254. else
  255. ok = strndup(str, strlen(str) - 1);
  256. free(str);
  257. str = strdup(ok);
  258. free(ok);
  259. am = 1;
  260. forkStuff(tz, str);
  261. }
  262. else
  263. {
  264. forkStuff(tz, str);
  265. }
  266. }
  267. }
  268. else if(strstr(str, "&") != NULL)
  269. {
  270. char * ok;
  271. int k = 1;
  272. int abcd = 0;
  273. int le = strlen(str);
  274. while(abcd < le - 1)
  275. {
  276. if(str[abcd] == ' ')
  277. k++;
  278. else
  279. k = 1;
  280. lol++;
  281. abcd++;
  282. }
  283. ok = strndup(str, strlen(str) - k);
  284. free(str);
  285. str = strdup(ok);
  286. free(ok);
  287. am = 1;
  288. forkStuff(tz, str);
  289. }
  290. else
  291. {
  292. forkStuff(tz, str);
  293. }
  294. free(str);
  295. }
  296. return 0;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement