Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/builtins/cd/cd.c

    r35a35651 r36ab7c7  
    4141static const char *cmdname = "cd";
    4242
    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 
    6843void help_cmd_cd(unsigned int level)
    6944{
     
    8055}
    8156
    82 
    8357/* This is a very rudamentary 'cd' command. It is not 'link smart' (yet) */
    8458
     
    8862
    8963        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         }
    10164
    10265        /* We don't yet play nice with whitespace, a getopt implementation should
     
    11679        }
    11780
    118         /* We have the correct # of arguments */
    119         // TODO: handle tidle (~) expansion? */
     81        /* We have the correct # of arguments
     82     * TODO: handle tidle (~) expansion? */
    12083
    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]);
    14185
    14286        if (rc == 0) {
     
    14993                        break;
    15094                case ENOENT:
    151                         cli_error(CL_ENOENT, "Invalid directory `%s'", target_directory);
     95                        cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]);
    15296                        break;
    15397                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]);
    15599                        break;
    156100                }
Note: See TracChangeset for help on using the changeset viewer.