Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.89 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <signal.h>
  10. #include <locale.h>
  11. #include <ctype.h>
  12.  
  13. int flag_backgroud = 0;
  14. int flag_script = 0;
  15. int flag_output = 0;
  16. char output[30];
  17.  
  18. char **sepstrs(char *cmd_line, int *strs_num)
  19. {
  20. if(cmd_line == NULL) return NULL;
  21. else if(cmd_line[0] == 0) return NULL;
  22.  
  23. int i = 0, j = 0, c = 0;
  24. (*strs_num) = 0;
  25.  
  26. int cmd_line_lenght = strlen(cmd_line);
  27. i = cmd_line_lenght - 1;
  28. while(cmd_line[i] == 32) --i;
  29. if(cmd_line[i] == '&' && cmd_line[i-1] == 32)
  30. {
  31. flag_backgroud = 1;
  32. --i;
  33. }
  34. while(cmd_line[i] == 32 || cmd_line[i] == '|' || cmd_line[i] == '>') --i;
  35. cmd_line_lenght = i + 1;
  36.  
  37. i = 0;
  38. while(cmd_line[i])
  39. {
  40. if(cmd_line[i] == '>')
  41. {
  42. cmd_line[i] = 32;
  43. j = i;
  44. while(cmd_line[j] == 32 && j > 0) --j;
  45. cmd_line_lenght = j+1;
  46.  
  47. ++i;
  48. if(cmd_line[i] == '>')
  49. {
  50. flag_output = 1;
  51. ++i;
  52.  
  53. while(cmd_line[i] == 32 || cmd_line[i] == '>') ++i;
  54. j = 0;
  55. while(cmd_line[i] && j < 29)
  56. {
  57. output[j] = cmd_line[i];
  58. ++i;
  59. ++j;
  60. }
  61. output[j] = 0;
  62. break;
  63. }
  64. else break;
  65. }
  66.  
  67. ++i;
  68. }
  69.  
  70. i = 0;
  71. while(cmd_line[i] == 32) ++i;
  72. while(i < cmd_line_lenght)
  73. {
  74. if(cmd_line[i] == 32)
  75. {
  76. while(cmd_line[i] == 32) ++i;
  77. if(cmd_line[i] == '|')
  78. {
  79. ++c;
  80. while(cmd_line[i] == 32 || cmd_line[i] == '|') ++i;
  81. }
  82. else
  83. {
  84. c += 2;
  85. ++i;
  86. }
  87. }
  88. else
  89. {
  90. if(cmd_line[i] == '|')
  91. {
  92. ++c;
  93. while(cmd_line[i] == 32 || cmd_line[i] == '|') ++i;
  94. }
  95. else
  96. {
  97. ++i;
  98. ++c;
  99. }
  100. }
  101. }
  102.  
  103. if(c == 0) return NULL;
  104. char *fcmd_line = (char*)malloc((c+1) * sizeof(char));
  105.  
  106. i = 0; j = 0;
  107. ++(*strs_num);
  108. while(cmd_line[i] == 32) ++i;
  109. while(i < cmd_line_lenght)
  110. {
  111. if(cmd_line[i] == 32)
  112. {
  113. while(cmd_line[i] == 32) ++i;
  114. if(cmd_line[i] == '|')
  115. {
  116. fcmd_line[j++] = cmd_line[i];
  117. while(cmd_line[i] == 32 || cmd_line[i] == '|') ++i;
  118. }
  119. else
  120. {
  121. fcmd_line[j++] = 32;
  122. fcmd_line[j++] = cmd_line[i++];
  123. }
  124. }
  125. else
  126. {
  127. if(cmd_line[i] == '|')
  128. {
  129. fcmd_line[j++] = cmd_line[i];
  130. while(cmd_line[i] == 32 || cmd_line[i] == '|') ++i;
  131. }
  132. else
  133. {
  134. fcmd_line[j] = cmd_line[i];
  135. ++j;
  136. ++i;
  137. }
  138. }
  139. }
  140. fcmd_line[j] = 0;
  141. i = 0;
  142.  
  143. while(fcmd_line[i])
  144. {
  145. if(fcmd_line[i] == '|') ++(*strs_num);
  146. ++i;
  147. }
  148.  
  149. //printf("fcmd_line = \"%s\"\n", fcmd_line);
  150. //printf("strs_num = %i\n", (*strs_num));
  151. //printf("fcmd_line_lenght = %i\n", c);
  152.  
  153. char **strs = (char**)malloc((*strs_num) * sizeof(char*));
  154. int s = (*strs_num);
  155.  
  156. int n = 0;;
  157. i = 0;
  158. for(; n < s - 1; ++n)
  159. {
  160. c = 0;
  161. while(fcmd_line[i] != '|')
  162. {
  163. ++i;
  164. ++c;
  165. }
  166. ++i;
  167. strs[n] = (char*)malloc(c * sizeof(char));
  168. }
  169. c = 0;
  170. while(fcmd_line[i])
  171. {
  172. ++i;
  173. ++c;
  174. }
  175.  
  176. strs[n] = (char*)malloc(c * sizeof(char));
  177.  
  178. i = 0;
  179. for(n = 0; n < s - 1; ++n)
  180. {
  181. j = 0;
  182. while(fcmd_line[i] != '|')
  183. {
  184. strs[n][j] = fcmd_line[i];
  185. ++i;
  186. ++j;
  187. }
  188. strs[n][j] = 0;
  189. ++i;
  190. }
  191. j = 0;
  192. while(fcmd_line[i])
  193. {
  194. strs[n][j] = fcmd_line[i];
  195. ++i;
  196. ++j;
  197. }
  198. strs[n][j] = 0;
  199.  
  200. //puts("");
  201. //for(i=0;i<(*strs_num); ++i) printf("\"%s\"\n", strs[i]);
  202. strcpy(cmd_line, fcmd_line);
  203. free(fcmd_line);
  204. return strs;
  205. }
  206.  
  207. char **getargs(const char *cmd_line, int *args_num)
  208. {
  209. if(cmd_line == NULL) return NULL;
  210. else if(cmd_line[0] == 0) return NULL;
  211.  
  212. int i = 0;
  213. (*args_num) = 0;
  214.  
  215. while(cmd_line[i] != 0)
  216. {
  217. if(cmd_line[i] == 32) ++i;
  218. else
  219. {
  220. ++(*args_num);
  221. while(cmd_line[i] != 32 && cmd_line[i] != 0) ++i;
  222. }
  223. }
  224.  
  225. if((*args_num) == 0) return NULL;
  226.  
  227. char **args = (char**)malloc((*args_num+1) * sizeof(char*));
  228.  
  229. i = 0;
  230. int j = 0, n = 0;
  231. while(cmd_line[i] != 0 )
  232. {
  233. while(cmd_line[i] == 32) ++i;
  234. while(cmd_line[i+j] != 32 && cmd_line[i+j] != 0) ++j;
  235. args[n] = (char*)malloc((j+1) * sizeof(char));
  236. //printf("%i\n", j);
  237. j = 0;
  238.  
  239. while(cmd_line[i] != 32 && cmd_line[i] != 0)
  240. {
  241. args[n][j] = cmd_line[i];
  242. ++j;
  243. ++i;
  244. }
  245.  
  246. args[n][j] = 0;
  247. j = 0;
  248. ++n;
  249. }
  250. args[n] = NULL;
  251. return args;
  252. }
  253.  
  254. unsigned long int hash(char *str)
  255. {
  256. unsigned long int hashval = 0, G;
  257. while (*str)
  258. {
  259. hashval = ( hashval << 4 ) + *str++;
  260. if (G = hashval & 0xF0000000L)
  261. {
  262. hashval ^= G >> 24;
  263. }
  264. hashval &= ~G;
  265. }
  266. return hashval;
  267. }
  268.  
  269. void show_history(int sig)
  270. {
  271. if(sig == SIGUSR1)
  272. {
  273. puts("");
  274. int f = open("bash_history.txt", O_RDONLY);
  275. char buf[100];
  276. while(read(f, buf, 100)) write(1, buf, strlen(buf));
  277. puts("");
  278. }
  279. }
  280.  
  281. int main(int argc, char *argv[])
  282. {
  283. setlocale(LC_ALL, "Polish");
  284. const unsigned long int command[] =
  285. {
  286. hash("exit"),
  287. hash("quit"),
  288. hash("help"),
  289. hash("history"),
  290. hash("about"),
  291. hash("fifo")
  292. };
  293.  
  294. char cmd[100];
  295. char **sstrs = NULL, **args = NULL;
  296.  
  297. char hisloc[] = "bash_history.txt";
  298. char tmpname[] = "histmp";
  299.  
  300. int strs_num = 0, args_num = 0, proc, i, j;
  301.  
  302. int hisdes, tmpdes;
  303. int customout = 0;
  304.  
  305. unsigned long int hashed_command;
  306.  
  307. signal(SIGUSR1, show_history);
  308. int sigusr_handler = fork();
  309. if(sigusr_handler == 0) while(1) sleep(1);
  310.  
  311. puts("My simple bash.\n");
  312. if(argc >= 3)
  313. {
  314. for(i=0; i<100; ++i) cmd[i]=0;
  315. strcat(cmd, argv[1]);
  316. flag_script = 1;
  317. }
  318. else puts("Type \"help\" to see a list of commands.\n");
  319.  
  320. while(1)
  321. {
  322. if(!flag_script)
  323. {
  324. //printf(">> ");
  325. fgets(cmd, 100, stdin);
  326. cmd[strlen(cmd)-1] = 0;
  327. }
  328.  
  329. flag_output = 0;
  330. sstrs = sepstrs(cmd, &strs_num);
  331. if(flag_script) printf("%s\n", cmd);
  332. if(flag_output) printf("Saved in %s\n", output);
  333.  
  334. if(sstrs != NULL)
  335. {
  336. char c[1];
  337. hisdes = open(hisloc, O_RDONLY);
  338. if(hisdes != -1)
  339. {
  340. tmpdes = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  341. i = 0;
  342. while(read(hisdes, c, 1) && i < 19)
  343. {
  344. if(c[0] == '\n') ++i;
  345. write(tmpdes, c, 1);
  346. }
  347. close(hisdes);
  348. close(tmpdes);
  349.  
  350. hisdes = open(hisloc, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  351. write(hisdes, cmd, strlen(cmd));
  352. write(hisdes, "\n", 1);
  353. tmpdes = open(tmpname, O_RDONLY);
  354. i = 0;
  355. while(read(tmpdes, c, 1))
  356. {
  357. write(hisdes, c, 1);
  358. }
  359. close(tmpdes);
  360. close(hisdes);
  361. remove(tmpname);
  362. }
  363. else
  364. {
  365. hisdes = open(hisloc, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  366. write(hisdes, cmd, strlen(cmd));
  367. write(hisdes, "\n", 1);
  368. close(hisdes);
  369. }
  370.  
  371. args = getargs(sstrs[0], &args_num);
  372. for(i=0; i<strlen(args[0]); ++i) args[0][i] = tolower(args[0][i]);
  373. hashed_command = hash(args[0]);
  374. if((hashed_command == command[0] || hashed_command == command[1]) && args_num == 1) return 0;
  375. else if(hashed_command == command[2] && args_num == 1)
  376. {
  377. puts("\n exit, quit - closes bash");
  378. puts(" help - displays this help message");
  379. puts(" about - displays information about bash");
  380. puts("");
  381. }
  382. else if(hashed_command == command[3] && args_num == 1) kill(sigusr_handler, SIGUSR1);
  383. else if(hashed_command == command[4] && args_num == 1)
  384. puts("\nSimple bash developed by Karolina Poplawska and Karolina Toczydlowska. [version 1.0]\n");
  385. else if(hashed_command == command[5] && args_num == 1)
  386. {
  387. mkfifo("fifoexample", 0666);
  388. if(fork() == 0)
  389. {
  390. int p = open("fifoexample", O_WRONLY);
  391. write(p, "THIS IS FIFO!\n\0", 16);
  392. exit(0);
  393. }
  394. int p = open("fifoexample", O_RDONLY);
  395. wait(NULL);
  396. char tmpbuf[16];
  397. read(p, tmpbuf, 16);
  398. write(1, tmpbuf, 16);
  399. unlink("fifoexample");
  400. }
  401. else
  402. {
  403. for(i=0; i<args_num; ++i) free(args[i]);
  404. free(args);
  405. args = NULL;
  406.  
  407. proc = fork();
  408. if(proc == 0)
  409. {
  410. customout = flag_output;
  411. int p1[2], p2[2];
  412. pipe(p1);
  413. pipe(p2);
  414. for(j = 0; j < strs_num; ++j)
  415. {
  416. proc = fork();
  417. if(proc == 0)
  418. {
  419. args = getargs(sstrs[j], &args_num);
  420.  
  421. if(j < strs_num-1)
  422. {
  423. if(j%2 == 0)
  424. {
  425. dup2(p1[1],1);
  426. dup2(p2[0],0);
  427. close(p1[0]);
  428. close(p2[1]);
  429. }
  430. else
  431. {
  432. dup2(p1[0],0);
  433. dup2(p2[1],1);
  434. close(p1[1]);
  435. close(p2[0]);
  436. }
  437. }
  438. else
  439. {
  440. if(customout)
  441. {
  442. int out = open(output, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  443. dup2(out, 1);
  444. close(out);
  445. }
  446.  
  447. if(j%2 == 0)
  448. {
  449. dup2(p2[0],0);
  450. close(p1[0]);
  451. close(p1[1]);
  452. close(p2[1]);
  453. }
  454. else
  455. {
  456. dup2(p1[0],0);
  457. close(p1[1]);
  458. close(p2[0]);
  459. close(p2[1]);
  460. }
  461. }
  462.  
  463. execvp(args[0], args);
  464. printf("%s\n", strerror(errno));
  465. exit(0);
  466. }
  467. }
  468. exit(0);
  469. }
  470. if(flag_backgroud == 0) wait(NULL);
  471. else flag_backgroud = 0;
  472. }
  473. for(i=0; i<strs_num; ++i) free(sstrs[i]);
  474. free(sstrs);
  475. sstrs = NULL;
  476. strs_num = 0;
  477. args_num = 0;
  478. }
  479.  
  480. if(flag_script)
  481. {
  482. getchar();
  483. return 0;
  484. }
  485. }
  486. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement