suckless/term/patch/newterm.c
2025-05-25 17:58:23 +02:00

44 lines
817 B
C

extern char* argv0;
static char*
getcwd_by_pid(pid_t pid) {
static char cwd[32];
snprintf(cwd, sizeof cwd, "/proc/%d/cwd", pid);
return cwd;
}
void
newterm(const Arg* a)
{
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:
#if OSC7_PATCH
if (term.cwd) {
if (chdir(term.cwd) == 0) {
/* We need to put the working directory also in PWD, so that
* the shell starts in the right directory if `cwd` is a
* symlink. */
setenv("PWD", term.cwd, 1);
}
} else {
chdir(getcwd_by_pid(pid));
}
#else
chdir(getcwd_by_pid(pid));
#endif // OSC7_PATCH
execl("/proc/self/exe", argv0, NULL);
exit(1);
default:
exit(0);
}
}
}