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(); }
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); }