Merge pull request #35 from DevManu-de/dev-redirect-handle
[psh.git] / src / builtins / pwd.c
blobbe21a860f91e12bf4beefcb773bc29fcb3983c33
1 /*
2 pwd.c - builtin pwd
3 Copyright 2020 Zhang Maiyun.
5 This file is part of Psh, P shell.
7 Psh is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Psh is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <https://www.gnu.org/licenses/>.
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
29 #include "backend.h"
30 #include "builtin.h"
31 #include "libpsh/util.h"
32 #include "libpsh/xmalloc.h"
33 #include "variable.h"
35 int builtin_pwd(int argc, char **argv, psh_state *state)
37 int flag = 0;
38 char *path = NULL;
39 /* Ignore any args after [1]
40 unless it is started by '-' as in bash */
42 int arg_count;
43 for (arg_count = 1; argv[arg_count] && argv[arg_count][0] == '-';
44 ++arg_count)
46 switch (argv[arg_count][1])
48 case 'P':
49 flag = 1;
50 break;
51 case 'L':
52 break;
53 default: /* Invalid option */
54 OUT2E("%s: %s: -%c: invalid option\n", state->argv0,
55 argv[0], argv[arg_count][1]);
56 return 1;
60 if (!flag) /* No -P */
62 char *path = (char *)psh_vf_getstr(state, "PWD"), *p;
64 if (!path || path[0] != '/')
65 goto use_p;
66 p = path;
67 while ((p = strstr(p, "/.")))
69 if (!p[2] || p[2] == '/' || (p[2] == '.' && (!p[3] || p[3] == '/')))
70 goto use_p;
71 ++p;
73 puts(path);
74 return 0;
76 use_p:
77 path = psh_backend_getcwd_dm();
78 puts(path);
79 xfree(path);
80 return 0;