Guest User

Untitled

a guest
Jun 21st, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8. #define BUFFER_SIZE 65536
  9. #define ARR_SIZE 65536
  10.  
  11. void parse_args(char *buffer, char** args,
  12. size_t args_size, size_t *nargs)
  13. {
  14. char *buf_args[args_size];
  15. char **cp;
  16. char *wbuf;
  17. size_t i, j;
  18.  
  19. wbuf = buffer;
  20. buf_args[0] = buffer;
  21. args[0] = buffer;
  22.  
  23. for(cp = buf_args; (*cp = strsep(&wbuf, " \n\t")) != NULL ;) {
  24. if ((*cp != '\0') && (++cp >= &buf_args[args_size]))
  25. break;
  26. }
  27.  
  28. for (j = i = 0; buf_args[i] != NULL; i++){
  29. if (strlen(buf_args[i])>0)
  30. args[j++]=buf_args[i];
  31. }
  32.  
  33. *nargs = j;
  34. args[j] = NULL;
  35. }
  36.  
  37.  
  38. int main(int argc, char *argv[])
  39. {
  40. char buffer[BUFFER_SIZE];
  41. char *args[ARR_SIZE];
  42.  
  43. int *ret_status;
  44. size_t nargs;
  45. pid_t pid;
  46.  
  47. for(;;) {
  48. printf("$ ");
  49. fgets(buffer, BUFFER_SIZE, stdin);
  50. parse_args(buffer, args, ARR_SIZE, &nargs);
  51.  
  52. if (nargs == 0) continue;
  53. if (!strcmp(args[0], "quit") || !strcmp(args[0], "exit")) exit(0);
  54. if (!strcmp(args[0], "chdir")) {
  55. if (args[1] != NULL) {
  56. if (opendir(args[1]) != NULL)
  57. chdir(args[1]);
  58. else
  59. puts(strerror(errno));
  60. } else
  61. chdir(getenv("HOME"));
  62. } else {
  63. pid = fork();
  64. if (pid) {
  65. printf("Czekam na proces potomny (%d)\n", pid);
  66. pid = wait(ret_status);
  67. printf("Proces potomny (%d) zakonczony\n", pid);
  68. } else {
  69. if (execvp(args[0], args)) {
  70. puts(strerror(errno));
  71. exit(127);
  72. }
  73. }
  74. }
  75. }
  76. return 0;
  77. }
Add Comment
Please, Sign In to add comment