Changeset 35a35651 in mainline for uspace/app/bdsh/cmds/builtins/cd/cd.c
- Timestamp:
- 2012-05-04T11:31:47Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b00255a
- Parents:
- f2b3d3e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/cmds/builtins/cd/cd.c
rf2b3d3e r35a35651 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 … … 65 91 /* Handle cd -- -. Override to switch to a directory named '-' */ 66 92 bool hyphen_override = false; 93 char *target_directory = argv[1]; 67 94 if (argc == 3) { 68 if (!str_cmp(argv[1], "--")) {95 if (!str_cmp(argv[1], "--")) { 69 96 hyphen_override = true; 70 97 argc--; 98 target_directory = argv[2]; 71 99 } 72 100 } … … 92 120 93 121 /* Handle 'cd -' first. */ 94 if (!str_cmp(argv[1], "-") && !hyphen_override) { 95 char *buffer = (char *) malloc(PATH_MAX); 96 if (!buffer) { 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) { 97 133 cli_error(CL_ENOMEM, "Cannot switch to previous directory"); 98 134 return CMD_FAILURE; 99 135 } 100 memset(buffer, 0, PATH_MAX); 101 getprevwd(buffer, PATH_MAX); 102 if (*buffer == '\0') { 103 cli_error(CL_EFAIL, "No previous directory to switch to"); 104 free(buffer); 105 return CMD_FAILURE; 106 } else { 107 rc = chdir(buffer); 108 free(buffer); 109 } 110 } else if (hyphen_override) { 111 /* Handles 'cd -- <dirname>'. 112 * Override for directory named '-'. 113 */ 114 rc = chdir(argv[2]); 136 rc = chdir_and_remember(prev_dup); 137 free(prev_dup); 115 138 } else { 116 rc = chdir (argv[1]);139 rc = chdir_and_remember(target_directory); 117 140 } 118 141 … … 126 149 break; 127 150 case ENOENT: 128 cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]);151 cli_error(CL_ENOENT, "Invalid directory `%s'", target_directory); 129 152 break; 130 153 default: 131 cli_error(CL_EFAIL, "Unable to change to `%s'", argv[1]);154 cli_error(CL_EFAIL, "Unable to change to `%s'", target_directory); 132 155 break; 133 156 }
Note:
See TracChangeset
for help on using the changeset viewer.