52 lines
1.3 KiB
D
52 lines
1.3 KiB
D
|
|
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);
|
||
|
|
}
|
||
|
|
}
|