59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
0
|
// Copyright (C) 2023, Jakob Wakeling |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
1
|
// All rights reserved. |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
2
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
3
|
#include "../util/optget.h" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
4
|
#include "../util/util.h" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
5
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
6
|
#include <unistd.h> |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
7
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
8
|
#include <errno.h> |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
9
|
#include <stdio.h> |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
10
|
#include <stdlib.h> |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
11
|
#include <string.h> |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
12
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
13
|
static const char *const help; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
14
|
extern const char *const version; /* main.c */ |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
15
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
16
|
int bltn_cd(int, char *av[]) { |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
17
|
struct opt opt = OPTGET_INIT; opt.str = "LP"; opt.lops = (struct lop[]){ |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
18
|
{ "help", ARG_NUL, 256 }, |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
19
|
{ "version", ARG_NUL, 257 }, |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
20
|
{ NULL, 0, 0 }, |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
21
|
}; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
22
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
23
|
struct { s32 mode; } args = {}; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
24
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
25
|
for (int c; (c = optget(&opt, av, 1)) != -1;) { |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
26
|
switch (c) { |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
27
|
case 'L': { args.mode = 0; } break; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
28
|
case 'P': { args.mode = 1; } break; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
29
|
case 256: { fputs(help, stdout); } return 0; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
30
|
case 257: { fputs(version, stdout); } return 0; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
31
|
default: {} return -1; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
32
|
} |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
33
|
} |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
34
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
35
|
char *path = av[opt.ind] ? av[opt.ind] : getenv("HOME"); |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
36
|
if (chdir(path)) { |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
37
|
fprintf(stderr, "%s: %s: %s\n", av[0], path, strerror(errno)); |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
38
|
errno = 0; return -1; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
39
|
} |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
40
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
41
|
path = getcwd(NULL, 0); setenv("PWD", path, 1); |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
42
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
43
|
free(path); return 0; |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
44
|
} |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
45
|
|
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
46
|
static const char *const help = |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
47
|
"cd - change directory\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
48
|
"Usage:\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
49
|
" cd [-L|-P] [directory]\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
50
|
"Options:\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
51
|
" -L Handle the operand dot-dot logically\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
52
|
" -P Handle the operand dot-dot physically\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
53
|
" --help Display help information\n" |
4a1246f |
Jakob Wakeling |
2023-12-28 14:53:40 |
54
|
" --version Display version information\n" |
59a2eec |
Jakob Wakeling |
2023-12-28 14:17:38 |
55
|
; |
|
|
|
56
|
|