dst/source/patch/newterm.d

52 lines
1.3 KiB
D
Raw Permalink Normal View History

2025-06-26 18:47:07 +00:00
module patch.newterm;
import st;
import x;
import config;
import patches;
import core.stdc.stdio;
import core.stdc.stdlib;
import core.stdc.string;
import core.stdc.errno;
import core.sys.posix.unistd;
import core.sys.posix.sys.wait;
import std.string : toStringz;
static if (isPatchEnabled!"NEWTERM_PATCH") {
extern(C) void newterm(const(Arg)* a) {
int res;
pid_t child1 = fork();
switch (child1) {
case -1:
die("fork failed: %s\n".toStringz, strerror(errno));
break;
case 0:
pid_t child2 = fork();
switch (child2) {
case -1:
die("fork failed: %s\n".toStringz, strerror(errno));
break;
case 0:
char* cwd = getcwd_by_pid(pid);
if (cwd) {
res = chdir(cwd);
free(cwd);
}
execlp("st".toStringz, "./st".toStringz, null);
break;
default:
exit(0);
}
break;
default:
wait(null);
break;
}
}
char* getcwd_by_pid(pid_t pid) {
char[32] buf;
snprintf(buf.ptr, buf.sizeof, "/proc/%d/cwd", pid);
return realpath(buf.ptr, null);
}
}