Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. /**
  2. * Utilities Unleashed
  3. * CS 241 - Fall 2019
  4. */
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12. #include "format.h"
  13.  
  14. char **split(char * str, char * delim, int * size) {
  15. char * s = strdup(str);
  16. int tokens_alloc = 1;
  17. int i = 0;
  18. char ** tokens = malloc(tokens_alloc * sizeof(char*));
  19. char *token;
  20. token = strsep(&s, delim);
  21. if (token == NULL) {
  22. free(tokens);
  23. tokens = NULL;
  24. }
  25. while (token) {
  26. //printf("here%s\n", token);
  27. if (i == tokens_alloc) {
  28. tokens_alloc *= 2;
  29. tokens = realloc(tokens, tokens_alloc * sizeof(char*));
  30. }
  31. tokens[i] = strdup(token);
  32. i++;
  33. token = strsep(&s, delim);
  34. }
  35. tokens = realloc(tokens, i * sizeof(char*));
  36. *size = i;
  37. //printf("almost done\n");
  38. free(s);
  39. //printf("done\n");
  40. return tokens;
  41. }
  42.  
  43.  
  44. int main(int argc, char *argv[]) {
  45. if (argc < 3) {
  46. print_env_usage();
  47. return 0;
  48. }
  49. pid_t pid = fork();
  50. if (pid < 0) {
  51. print_fork_failed();
  52. return 0;
  53. }
  54. if (pid == 0) {
  55. //set up env
  56. int argidx = 1;
  57. //printf("child start %i\n", strcmp(argv[argidx],"--"));
  58. while ((strcmp(argv[argidx],"--")) != 0) {
  59.  
  60. //printf("arg: %s\n", argv[argidx]);
  61. //expect env variable
  62.  
  63. int size = 0;
  64. char ** parsed_env = split(argv[argidx], "=", &size);
  65. //printf("%s, %s\n", parsed_env[0], parsed_env[1]);
  66. //printf("%i\n", size);
  67. if (size != 2) {
  68. print_env_usage();
  69. return 0;
  70. } else {
  71. //valid format
  72. //printf("parsing env\n");
  73. char * name = parsed_env[0];
  74. char * value = parsed_env[1];
  75. if (name == NULL || value == NULL) {
  76. print_env_usage();
  77. }
  78. for (int i = 0; i < (int)strlen(name); i++) {
  79. //ensure valid name
  80. if (isalnum(name[i]) || name[i] == '_') {
  81. continue;
  82. }
  83. print_env_usage();
  84. return 0;
  85. }
  86. //printf("name valid\n");
  87. if (value[0] == '%') {
  88. char * setvalue = getenv(value + 1);
  89. if (setvalue == NULL) {
  90. print_environment_change_failed();
  91. }
  92. if (setenv(name, setvalue, 1) != 0) {
  93. print_environment_change_failed();
  94. //free
  95. return 0;
  96. }
  97. } else {
  98. if (setenv(name, value, 1) != 0) {
  99. print_environment_change_failed();
  100. //free
  101. return 0;
  102. }
  103. }
  104. }
  105. argidx++;
  106. if (argv + argidx == NULL) {
  107. print_env_usage();
  108. return 0;
  109. }
  110. }
  111. argidx++;
  112. if (argv + argidx == NULL) {
  113. print_env_usage();
  114. return 0;
  115. }
  116. execvp(argv[argidx], &argv[argidx]);
  117. print_exec_failed();
  118. exit(1);
  119. } else {
  120. int status = 0;
  121. waitpid(pid, &status, 0);
  122. //parent
  123. }
  124.  
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement