summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Shell/main.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/Shell/main.cpp b/Shell/main.cpp
index 98295bb480..46fc8200c8 100644
--- a/Shell/main.cpp
+++ b/Shell/main.cpp
@@ -133,11 +133,24 @@ int main(int argc, char** argv)
return 0;
}
- if (getsid(getpid()) == 0) {
+ auto pid = getpid();
+ if (auto sid = getsid(pid); sid == 0) {
if (setsid() < 0) {
perror("setsid");
// Let's just hope that it's ok.
}
+ } else if (sid != pid) {
+ if (getpgid(pid) != pid) {
+ dbgf("We were already in a session with sid={} (we are {}), let's do some gymnastics", sid, pid);
+ if (setpgid(pid, sid) < 0) {
+ auto strerr = strerror(errno);
+ dbgf("couldn't setpgid: {}", strerr);
+ }
+ if (setsid() < 0) {
+ auto strerr = strerror(errno);
+ dbgf("couldn't setsid: {}", strerr);
+ }
+ }
}
shell->current_script = argv[0];