Guest User

Untitled

a guest
Jun 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 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. char temp_pwd[BUFFER_SIZE];
  47. int flag = 0;
  48.  
  49. setenv("PWD", getenv("HOME"), 1);
  50. setenv("OLDPWD", getenv("HOME"), 1);
  51.  
  52. for(;;) {
  53. printf("%s$ ", getenv("PWD"));
  54. puts(getenv("OLDPWD"));
  55. fgets(buffer, BUFFER_SIZE, stdin);
  56. parse_args(buffer, args, ARR_SIZE, &nargs);
  57.  
  58. if (nargs == 0) continue;
  59. if (!strcmp(args[0], "quit") || !strcmp(args[0], "exit")) exit(0);
  60. if (!strcmp(args[0], "chdir")) {
  61. if (args[1] != NULL) {
  62. if (!strcmp(args[1], "-")) {
  63. chdir(getenv("OLDPWD"));
  64. } else
  65. if (opendir(args[1]) != NULL) {
  66. chdir(args[1]);
  67. setenv("PWD", args[1], 1);
  68. if (!flag) strcpy(temp_pwd, args[1]);
  69. if (flag) {
  70. setenv("OLDPWD", temp_pwd, 1);
  71. flag = 0;
  72. }
  73. flag = 1;
  74. } else
  75. puts(strerror(errno));
  76. } else
  77. chdir(getenv("HOME"));
  78. } else {
  79. pid = fork();
  80. if (pid) {
  81. printf("Czekam na proces potomny (%d)\n", pid);
  82. pid = wait(ret_status);
  83. printf("Proces potomny (%d) zakonczony\n", pid);
  84. } else {
  85. if (execvp(args[0], args)) {
  86. puts(strerror(errno));
  87. exit(127);
  88. }
  89. }
  90. }
  91. }
  92. return 0;
  93. }
Add Comment
Please, Sign In to add comment