Changes in uspace/app/bdsh/cmds/builtins/cd/cd.c [35a35651:36ab7c7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/cmds/builtins/cd/cd.c
r35a35651 r36ab7c7 41 41 static const char *cmdname = "cd"; 42 42 43 /* Previous directory variables.44 *45 * Declaring them static to avoid many "== NULL" checks.46 * PATH_MAX is not that big to cause any problems with memory overhead.47 */48 static char previous_directory[PATH_MAX] = "";49 static char previous_directory_tmp[PATH_MAX];50 static bool previous_directory_valid = true;51 static bool previous_directory_set = false;52 53 static int chdir_and_remember(const char *new_dir) {54 55 char *ok = getcwd(previous_directory_tmp, PATH_MAX);56 previous_directory_valid = ok != NULL;57 previous_directory_set = true;58 59 int rc = chdir(new_dir);60 if (rc != EOK) {61 return rc;62 }63 64 str_cpy(previous_directory, PATH_MAX, previous_directory_tmp);65 return EOK;66 }67 68 43 void help_cmd_cd(unsigned int level) 69 44 { … … 80 55 } 81 56 82 83 57 /* This is a very rudamentary 'cd' command. It is not 'link smart' (yet) */ 84 58 … … 88 62 89 63 argc = cli_count_args(argv); 90 91 /* Handle cd -- -. Override to switch to a directory named '-' */92 bool hyphen_override = false;93 char *target_directory = argv[1];94 if (argc == 3) {95 if (!str_cmp(argv[1], "--")) {96 hyphen_override = true;97 argc--;98 target_directory = argv[2];99 }100 }101 64 102 65 /* We don't yet play nice with whitespace, a getopt implementation should … … 116 79 } 117 80 118 /* We have the correct # of arguments */119 //TODO: handle tidle (~) expansion? */81 /* We have the correct # of arguments 82 * TODO: handle tidle (~) expansion? */ 120 83 121 /* Handle 'cd -' first. */ 122 if (!str_cmp(target_directory, "-") && !hyphen_override) { 123 if (!previous_directory_valid) { 124 cli_error(CL_EFAIL, "Cannot switch to previous directory"); 125 return CMD_FAILURE; 126 } 127 if (!previous_directory_set) { 128 cli_error(CL_EFAIL, "No previous directory to switch to"); 129 return CMD_FAILURE; 130 } 131 char *prev_dup = str_dup(previous_directory); 132 if (prev_dup == NULL) { 133 cli_error(CL_ENOMEM, "Cannot switch to previous directory"); 134 return CMD_FAILURE; 135 } 136 rc = chdir_and_remember(prev_dup); 137 free(prev_dup); 138 } else { 139 rc = chdir_and_remember(target_directory); 140 } 84 rc = chdir(argv[1]); 141 85 142 86 if (rc == 0) { … … 149 93 break; 150 94 case ENOENT: 151 cli_error(CL_ENOENT, "Invalid directory `%s'", target_directory);95 cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]); 152 96 break; 153 97 default: 154 cli_error(CL_EFAIL, "Unable to change to `%s'", target_directory);98 cli_error(CL_EFAIL, "Unable to change to `%s'", argv[1]); 155 99 break; 156 100 }
Note:
See TracChangeset
for help on using the changeset viewer.