Changeset 6843a9c in mainline for uspace/app/bdsh/cmds/builtins/cd/cd.c
- Timestamp:
- 2012-06-29T13:02:14Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 722912e
- Parents:
- ba72f2b (diff), 0bbd13e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/cmds/builtins/cd/cd.c
rba72f2b r6843a9c 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 43 68 void help_cmd_cd(unsigned int level) 44 69 { … … 55 80 } 56 81 82 57 83 /* This is a very rudamentary 'cd' command. It is not 'link smart' (yet) */ 58 84 … … 62 88 63 89 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 } 64 101 65 102 /* We don't yet play nice with whitespace, a getopt implementation should … … 79 116 } 80 117 81 /* We have the correct # of arguments 82 *TODO: handle tidle (~) expansion? */118 /* We have the correct # of arguments */ 119 // TODO: handle tidle (~) expansion? */ 83 120 84 rc = chdir(argv[1]); 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 } 85 141 86 142 if (rc == 0) { … … 93 149 break; 94 150 case ENOENT: 95 cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]);151 cli_error(CL_ENOENT, "Invalid directory `%s'", target_directory); 96 152 break; 97 153 default: 98 cli_error(CL_EFAIL, "Unable to change to `%s'", argv[1]);154 cli_error(CL_EFAIL, "Unable to change to `%s'", target_directory); 99 155 break; 100 156 }
Note:
See TracChangeset
for help on using the changeset viewer.