source: mainline/uspace/app/bdsh/cmds/builtins/cd/cd.c@ a56f4b2

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a56f4b2 was 216d6fc, checked in by Tim Post <echo@…>, 17 years ago

Merge with shell @ 3241 for bdsh

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/* Copyright (c) 2008, Tim Post <tinkertim@gmail.com>
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of the original program's authors nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <unistd.h>
34#include <string.h>
35#include <errno.h>
36
37#include "util.h"
38#include "errors.h"
39#include "entry.h"
40#include "cmds.h"
41#include "cd.h"
42
43static char * cmdname = "cd";
44
45void * help_cmd_cd(unsigned int level)
46{
47 if (level == HELP_SHORT) {
48 printf("`%s' changes the current working directory.\n", cmdname);
49 } else {
50 printf(
51 " %s <directory>\n"
52 " Change directory to <directory>, e.g `%s /sbin'\n",
53 cmdname, cmdname);
54 }
55
56 return CMD_VOID;
57}
58
59/* This is a very rudamentary 'cd' command. It is not 'link smart' (yet) */
60
61int * cmd_cd(char **argv, cliuser_t *usr)
62{
63 int argc, rc = 0;
64
65 for (argc = 0; argv[argc] != NULL; argc ++);
66
67 /* We don't yet play nice with whitespace, a getopt implementation should
68 * protect "quoted\ destination" as a single argument. Its not our job to
69 * look for && || or redirection as the tokenizer should have done that
70 * (currently, it does not) */
71
72 if (argc > 2) {
73 cli_error(CL_EFAIL, "Too many arguments to `%s'", cmdname);
74 return CMD_FAILURE;
75 }
76
77 if (argc < 2) {
78 printf("%s - no directory specified. Try `help %s extended'\n",
79 cmdname, cmdname);
80 return CMD_FAILURE;
81 }
82
83 /* We have the correct # of arguments
84 * TODO: handle tidle (~) expansion? */
85
86 rc = chdir(argv[1]);
87
88 if (rc == 0) {
89 return CMD_SUCCESS;
90 } else {
91 switch (rc) {
92 case ENOMEM:
93 cli_error(CL_EFAIL, "Destination path too long");
94 break;
95 case ENOENT:
96 cli_error(CL_ENOENT, "Invalid directory `%s'", argv[1]);
97 break;
98 default:
99 cli_error(CL_EFAIL, "Unable to change to `%s'", argv[1]);
100 break;
101 }
102 }
103
104 return CMD_FAILURE;
105}
Note: See TracBrowser for help on using the repository browser.