summaryrefslogtreecommitdiff
path: root/archive/st/patch/newterm.c
blob: d4a17353288b9cd065154f4eeeb12e8f92d1665b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void
newterm(const Arg* a)
{
	int res;
	switch (fork()) {
	case -1:
		die("fork failed: %s\n", strerror(errno));
		break;
	case 0:
		switch (fork()) {
		case -1:
			die("fork failed: %s\n", strerror(errno));
			break;
		case 0:
			res = chdir(getcwd_by_pid(pid));
			execlp("st", "./st", NULL);
			break;
		default:
			exit(0);
		}
	default:
		wait(NULL);
	}
}

static char *getcwd_by_pid(pid_t pid) {
	char buf[32];
	snprintf(buf, sizeof buf, "/proc/%d/cwd", pid);
	return realpath(buf, NULL);
}