Example #1
0
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);
}
Example #2
0
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");
    }
}