Beispiel #1
0
int __c_select(int arg1, ...)
{
  asm("clre");
  va_list ap;
  int res,choice;
  int use_default = 0;
  va_start(ap, arg1);
  for (res = arg1,choice=0; res != SELECT_END; res = va_arg(ap, int),choice++) {
    switch (res)
      {
      case SELECT_DEFAULT:
        use_default = 1;
        break;
      case SELECT_OVER_ARRAY: {
        int *arr = va_arg(ap, int *);
        int n = va_arg(ap, int);
        for (int i=0;i<n;i++)
          setup_resource(arr[i],choice,i);
        break;
      }
#if 0
      case SELECT_WHEN_PINSEQ:
        res = va_arg(ap, int);
        port_set_condition(res, XS1_PORT_PINSEQ);
        setup_resource(res,choice,0);
        break;
      case SELECT_WHEN_PINSEQ:
        res = va_arg(ap, int);
        port_set_condition(res, XS1_PORT_PINSEQ);
        setup_resource(res,choice,0);
        break;
#endif
      default:
        setup_resource(res,choice,0);
        break;
      }
  }
  va_end(ap);

  return __c_wait();
}
Beispiel #2
0
static void
setup_child()
{
    /* io需要在降权之前设置,因为需要打开一个输出文件 */
    setup_io();

    /* 关闭所有继承的附加组id, 设置有gid,uid */
    if (setgroups(0, NULL) != 0 ||
            setresgid(pwd->pw_gid, pwd->pw_gid, pwd->pw_gid) != 0 ||
            setresuid(pwd->pw_uid, pwd->pw_uid, pwd->pw_uid) != 0)
        exit(0);

    chdir(workdir);
    /*
    g_slist_foreach(resource_rule, foreach_resource, NULL);
    g_slist_foreach(environ_rule, foreach_environ, &env);
    */
    setup_resource();
    ptrace(PTRACE_TRACEME, 0, NULL, NULL);

    execvpe(command[0], command, (char * const *)g_get_environ());
    exit(1);
}