void dmtcp::ProcessInfo::refresh() { _pid = getpid(); _ppid = getppid(); _gid = getpgid(0); _sid = getsid(0); _fgid = -1; // Try to open the controlling terminal int tfd = _real_open("/dev/tty", O_RDWR); if (tfd != -1) { _fgid = tcgetpgrp(tfd); _real_close(tfd); } if (_ppid == 1) { _isRootOfProcessTree = true; _uppid = UniquePid(); } else { _uppid = UniquePid::ParentProcess(); } _procname = jalib::Filesystem::GetProgramName(); _hostname = jalib::Filesystem::GetCurrentHostname(); _upid = UniquePid::ThisProcess(); _noCoordinator = dmtcp_no_coordinator(); char buf[PATH_MAX]; JASSERT(getcwd(buf, sizeof buf) != NULL); _ckptCWD = buf; _sessionIds.clear(); refreshChildTable(); JTRACE("CHECK GROUP PID")(_gid)(_fgid)(_ppid)(_pid); }
void dmtcp::ProcessInfo::growStack() { /* Grow the stack to the stack limit */ struct rlimit rlim; size_t stackSize; const rlim_t eightMB = 8 * MB; JASSERT(getrlimit(RLIMIT_STACK, &rlim) == 0) (JASSERT_ERRNO); if (rlim.rlim_cur == RLIM_INFINITY) { if (rlim.rlim_max == RLIM_INFINITY) { stackSize = 8 * 1024 * 1024; } else { stackSize = MIN(rlim.rlim_max, eightMB); } } else { stackSize = rlim.rlim_cur; } // Find the current stack area and heap ProcMapsArea area; bool flag = false; size_t allocSize; void *tmpbuf; int fd = _real_open("/proc/self/maps", O_RDONLY); JASSERT(fd != -1) (JASSERT_ERRNO); while (Util::readProcMapsLine(fd, &area)) { if (strcmp(area.name, "[heap]") == 0) { // Record start of heap which will later be used to restore heap _savedHeapStart = (unsigned long) area.addr; } if ((VA) &area >= area.addr && (VA) &area < area.endAddr) { // Stack found flag = true; break; } } _real_close(fd); JTRACE("Original stack area") ((void*)area.addr) (area.size); JASSERT(flag && area.addr != NULL); // Grow the stack { allocSize = stackSize - area.size - 4095; tmpbuf = alloca(allocSize); JASSERT(tmpbuf != NULL) (JASSERT_ERRNO); memset(tmpbuf, 0, allocSize); } #ifdef DEBUG { int fd = _real_open("/proc/self/maps", O_RDONLY); JASSERT(fd != -1) (JASSERT_ERRNO); while (Util::readProcMapsLine(fd, &area)) { if ((VA)&area >= area.addr && (VA)&area < area.endAddr) { // Stack found area = area; break; } } _real_close(fd); JTRACE("New stack size") ((void*)area.addr) (area.size); } #endif }
void _init(int argc, char *argv[]) { char *soapboxaction, *soapboxdbg, *soapboxlog; // Make output unbuffered setvbuf(stdout, (char *) NULL, _IONBF, 0); setvbuf(stderr, (char *) NULL, _IONBF, 0); // Handle and unset logging environment variable soapboxlog=getenv("SOAPBOXLOG"); // unsetenv("SOAPBOXLOG"); if (!soapboxlog || *soapboxlog=='\0') { stdlog=stderr; } else { stdlog=fopen(soapboxlog, "a"); if (stdlog==NULL) { stdlog=stderr; sb_die(stdlog, "%s: %s (%i)", soapboxlog, strerror(errno), errno); } setvbuf(stdlog, (char *)NULL, _IONBF, 0); } // Handle and unset debugging environment variable soapboxdbg=getenv("SOAPBOXDEBUG"); // unsetenv("SOAPBOXDEBUG"); if (soapboxdbg) soapboxdebug=atoi(soapboxdbg); sb_log(8, "Variable SOAPBOXDEBUG is set to %i.", soapboxdebug); // Handle and unset path environment variable soapboxpath=getenv("SOAPBOXPATH"); // unsetenv("SOAPBOXPATH"); if (!soapboxpath) soapboxpath=""; if (!soapboxpath || *soapboxpath=='\0') sb_log(8, "Variable SOAPBOXPATH is not set. Not allowed to write anywhere."); else sb_log(8, "Variable SOAPBOXPATH is set to \"%s\".", soapboxpath); // Handle and unset bin path environment variable soapboxrun=getenv("SOAPBOXRUN"); // unsetenv("SOAPBOXPATH"); if (!soapboxrun) soapboxrun=""; if (!soapboxrun || *soapboxrun=='\0') sb_log(8, "Variable SOAPBOXRUN is not set. Not allowed to run anything."); else sb_log(8, "Variable SOAPBOXRUN is set to \"%s\".", soapboxrun); // Handle and unset action environment variable soapboxaction=getenv("SOAPBOXACTION"); // unsetenv("SOAPBOXACTION"); if (!soapboxaction || *soapboxaction=='\0') { soapboxaction=DEFAULT_ACTION; sb_log(8, "Variable SOAPBOXACTION is not set. Using \"%s\" by default.", DEFAULT_ACTION); } else { sb_log(8, "Variable SOAPBOXACTION is set to \"%s\".", soapboxaction); } if (!strcmp(soapboxaction, "warn")) action=A_WARN; else if (!strcmp(soapboxaction, "err")) action=A_ERR; else if (!strcmp(soapboxaction, "halt")) action=A_HALT; if (action==A_UNKN) { sb_log(8, "Variable SOAPBOXACTION=\"%s\" is unknown. Using \"%s\" by default.", soapboxaction, DEFAULT_ACTION); action=A_DEFAULT; } // Get all symbols from glibc. (TODO: dlerror is always NULL, weird.) _real_chmod=dlsym(RTLD_NEXT, "chmod"); dlcheck(dlerror()); _real_chown=dlsym(RTLD_NEXT, "chown"); dlcheck(dlerror()); // _real_fchown=dlsym(RTLD_NEXT, "fchown"); dlcheck(dlerror()); _real_lchown=dlsym(RTLD_NEXT, "lchown"); dlcheck(dlerror()); // stop fork/clone system calls (natan) _real_clone=dlsym(RTLD_NEXT, "clone"); dlcheck(dlerror()); _real_fork=dlsym(RTLD_NEXT, "fork"); dlcheck(dlerror()); _real_vfork=dlsym(RTLD_NEXT, "vfork"); dlcheck(dlerror()); _real_execve=dlsym(RTLD_NEXT, "execve"); dlcheck(dlerror()); _real_socketcall=dlsym(RTLD_NEXT, "socketcall"); dlcheck(dlerror()); _real_socket=dlsym(RTLD_NEXT, "socket"); dlcheck(dlerror()); _real_link=dlsym(RTLD_NEXT, "link"); dlcheck(dlerror()); _real_mkdir=dlsym(RTLD_NEXT, "mkdir"); dlcheck(dlerror()); _real_mkfifo=dlsym(RTLD_NEXT, "mkfifo"); dlcheck(dlerror()); _real_mknod=dlsym(RTLD_NEXT, "mknod"); dlcheck(dlerror()); _real___xmknod=dlsym(RTLD_NEXT, "__xmknod"); dlcheck(dlerror()); _real_open=dlsym(RTLD_NEXT, "open"); dlcheck(dlerror()); _real_open64=dlsym(RTLD_NEXT, "open64"); dlcheck(dlerror()); _real_creat=dlsym(RTLD_NEXT, "creat"); dlcheck(dlerror()); _real_creat64=dlsym(RTLD_NEXT, "creat64"); dlcheck(dlerror()); // _real_fopen=dlsym(RTLD_NEXT, "fopen"); dlcheck(dlerror()); _real_remove=dlsym(RTLD_NEXT, "remove"); dlcheck(dlerror()); _real_rename=dlsym(RTLD_NEXT, "rename"); dlcheck(dlerror()); _real_rmdir=dlsym(RTLD_NEXT, "rmdir"); dlcheck(dlerror()); _real_symlink=dlsym(RTLD_NEXT, "symlink"); dlcheck(dlerror()); _real_unlink=dlsym(RTLD_NEXT, "unlink"); dlcheck(dlerror()); _real_utime=dlsym(RTLD_NEXT, "utime"); dlcheck(dlerror()); _real_utimes=dlsym(RTLD_NEXT, "utimes"); dlcheck(dlerror()); // devnull=_real_open("/dev/null", O_RDWR); devnull=_real_open("/dev/zero", O_RDWR); if (devnull==-1) sb_die(stdlog, "/dev/null: %s", strerror(errno)); // Print each process execution if (soapboxdebug & 1) { int i; fprintf(stdlog, "soapbox: debug1: Executing (pid: %i) \"", getpid()); for(i=0; i<argc; i++) fprintf(stdlog, "%s ",argv[i]); fprintf(stdlog, "\"\n"); } }