#include #include #include #include #include "builtins.h" #include "utils/env.h" int cd_pointpoint(char *path, char *old) { char *current = strrchr(path, '/'); size_t len = current - path; if (len == 0) { fprintf(stderr, "cd: error with ..\n"); return 2; } char *parent = malloc(len + 1); memcpy(parent, current, len); parent[len] = '\0'; old = path; path = parent; env_set("OLDPWD", old); env_set("PWD", path); free(parent); return 0; } int cd(struct string **args) { if (args[0] == NULL || args[1] != NULL) { fprintf(stderr, "cd: error too many arguments\n"); fflush(stdout); return 2; } if (strcmp(env_get("PWD"), "") == 0) { fprintf(stderr, "cd: error with PWD\n"); fflush(stdout); return 2; } char *old = env_get("OLDPWD"); char *path = env_get("PWD"); char *tmp = old; if (strcmp(args[0]->data, "-") == 0) { if (strcmp(old, "") == 0) { fprintf(stderr, "cd: error with OLDPWD\n"); fflush(stdout); return 2; } printf("%s\n", old); old = path; path = tmp; } else if (strcmp(args[0]->data, "..") == 0) { int res = cd_pointpoint(path, old); fflush(stdout); return res; } else { old = path; path = args[0]->data; } env_set("OLDPWD", old); env_set("PWD", path); fflush(stdout); return 0; }