Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Utilities Unleashed
- * CS 241 - Fall 2019
- */
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include "format.h"
- char **split(char * str, char * delim, int * size) {
- char * s = strdup(str);
- int tokens_alloc = 1;
- int i = 0;
- char ** tokens = malloc(tokens_alloc * sizeof(char*));
- char *token;
- token = strsep(&s, delim);
- if (token == NULL) {
- free(tokens);
- tokens = NULL;
- }
- while (token) {
- //printf("here%s\n", token);
- if (i == tokens_alloc) {
- tokens_alloc *= 2;
- tokens = realloc(tokens, tokens_alloc * sizeof(char*));
- }
- tokens[i] = strdup(token);
- i++;
- token = strsep(&s, delim);
- }
- tokens = realloc(tokens, i * sizeof(char*));
- *size = i;
- //printf("almost done\n");
- free(s);
- //printf("done\n");
- return tokens;
- }
- int main(int argc, char *argv[]) {
- if (argc < 3) {
- print_env_usage();
- return 0;
- }
- pid_t pid = fork();
- if (pid < 0) {
- print_fork_failed();
- return 0;
- }
- if (pid == 0) {
- //set up env
- int argidx = 1;
- //printf("child start %i\n", strcmp(argv[argidx],"--"));
- while ((strcmp(argv[argidx],"--")) != 0) {
- //printf("arg: %s\n", argv[argidx]);
- //expect env variable
- int size = 0;
- char ** parsed_env = split(argv[argidx], "=", &size);
- //printf("%s, %s\n", parsed_env[0], parsed_env[1]);
- //printf("%i\n", size);
- if (size != 2) {
- print_env_usage();
- return 0;
- } else {
- //valid format
- //printf("parsing env\n");
- char * name = parsed_env[0];
- char * value = parsed_env[1];
- if (name == NULL || value == NULL) {
- print_env_usage();
- }
- for (int i = 0; i < (int)strlen(name); i++) {
- //ensure valid name
- if (isalnum(name[i]) || name[i] == '_') {
- continue;
- }
- print_env_usage();
- return 0;
- }
- //printf("name valid\n");
- if (value[0] == '%') {
- char * setvalue = getenv(value + 1);
- if (setvalue == NULL) {
- print_environment_change_failed();
- }
- if (setenv(name, setvalue, 1) != 0) {
- print_environment_change_failed();
- //free
- return 0;
- }
- } else {
- if (setenv(name, value, 1) != 0) {
- print_environment_change_failed();
- //free
- return 0;
- }
- }
- }
- argidx++;
- if (argv + argidx == NULL) {
- print_env_usage();
- return 0;
- }
- }
- argidx++;
- if (argv + argidx == NULL) {
- print_env_usage();
- return 0;
- }
- execvp(argv[argidx], &argv[argidx]);
- print_exec_failed();
- exit(1);
- } else {
- int status = 0;
- waitpid(pid, &status, 0);
- //parent
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement