Ignore:
Timestamp:
2012-07-20T13:51:28Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8fccd42
Parents:
c5bff3c (diff), 7030bc9 (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.
Message:

More mainline changes.

File:
1 edited

Legend:

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

    rc5bff3c r8013637  
    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 */
     48static char previous_directory[PATH_MAX] = "";
     49static char previous_directory_tmp[PATH_MAX];
     50static bool previous_directory_valid = true;
     51static bool previous_directory_set = false;
     52
     53static 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
    4368void help_cmd_cd(unsigned int level)
    4469{
     
    5580}
    5681
     82
    5783/* This is a very rudamentary 'cd' command. It is not 'link smart' (yet) */
    5884
     
    6288
    6389        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        }
    64101
    65102        /* We don't yet play nice with whitespace, a getopt implementation should
     
    79116        }
    80117
    81         /* We have the correct # of arguments
    82      * TODO: handle tidle (~) expansion? */
     118        /* We have the correct # of arguments */
     119        // TODO: handle tidle (~) expansion? */
    83120
    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        }
    85141
    86142        if (rc == 0) {
     
    93149                        break;
    94150                case ENOENT:
    95                         cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]);
     151                        cli_error(CL_ENOENT, "Invalid directory `%s'", target_directory);
    96152                        break;
    97153                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);
    99155                        break;
    100156                }
Note: See TracChangeset for help on using the changeset viewer.