ESH

Executive Shell
git clone http://git.omkov.net/ESH
Log | Tree | Refs | README | Download

ESH/src/builtin/cd.c (57 lines, 1.3 KiB) -rw-r--r-- file download

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