static int command(void) { uint32_t pid = exec(g_args[0], PROCESS_DEFAULT_PRIORITY); if (pid) { size_t i = 1; msg_t msg_struct; msg_t *msg = &msg_struct; g_executed = SHELL_SPAWN; supervise(pid); msg_type_set_argument(msg); msg_set_receiver_pid(msg, pid); while (g_args[i]) { msg_data_set_string(msg, g_args[i]); send_message(msg); ++i; } } else { print_str("Unknown command "); print_strln(g_args[0]); } return 1; }
BasicTerm * XeoTerm::emit_DefaultObject(bool supervised){ DynamicTerm * p= new DynamicTerm(this->termId); p->set_name(this->name); p->set_namespacealias(this->nameSpaceAlias); p->set_namespace(this->nameSpace); for(std::map<QString, VariableContextSpec*>::iterator it=this->contextCollection->begin();it!=this->contextCollection->end();++it){ if(this->hasDefaultCycle((*it).second->get_name())){ p->get_dynamicvaluecollection()->push_back(make_pair(this->defaultCycle((*it).second->get_name()),this->defaultCycle((*it).second->get_name())->get_timepoint())); //(*p->get_dynamicvaluecollection())[this->defaultCycle((*it).second->get_name())]=this->defaultCycle((*it).second->get_name())->get_timepoint(); } } if(supervised) { supervise(p); } return p; }
int fsm(isc_opt_t *op) { state_t state; isess_t *sess; if((sess = calloc(1, sizeof(isess_t))) == NULL) { // boy, is this a bad start ... fprintf(stderr, "no memory!\n"); return -1; } state = S1; sess->op = op; sess->fd = -1; sess->soc = -1; sess->target.address = strdup(op->targetAddress); sess->target.port = op->port; sess->target.pgt = op->targetPortalGroupTag; sess->flags = SESS_INITIALLOGIN | SESS_INITIALLOGIN1; do { switch(state) { case S1: switch(tcpConnect(sess)) { case T1: state = S2; break; default: state = S8; break; } break; case S2: switch(startSession(sess)) { case T2: state = S1; break; case T4: state = S4; break; default: state = S8; break; } break; case S4: switch(doLogin(sess)) { case T7: state = S1; break; case T5: state = S5; break; default: state = S8; break; } break; case S5: switch(supervise(sess)) { case T8: state = S1; break; case T9: state = S6; break; case T11: state = S7; break; case T15: state = S8; break; default: state = S8; break; } break; case S6: switch(startLogout(sess)) { case T13: state = S1; break; case T14: state = S6; break; case T16: state = S8; break; default: state = S8; break; } break; case S7: switch(inLogout(sess)) { case T18: state = S1; break; case T10: state = S6; break; case T12: state = S7; break; case T16: state = S8; break; default: state = S8; break; } break; case S8: // maybe do some clean up? syslog(LOG_INFO, "terminated"); return 0; } } while(1); }
int main(int argc, char **argv) { char *gidmap = NULL, *inside = NULL, *outside = NULL, *uidmap = NULL; char *bind = NULL; int hostnet = 0, master, option, stdio = 0; pid_t child, parent; while ((option = getopt(argc, argv, "+:b:cg:i:no:u:")) > 0) switch (option) { case 'b': bind = optarg; break; case 'c': stdio++; break; case 'g': gidmap = optarg; break; case 'i': inside = optarg; break; case 'n': hostnet++; break; case 'o': outside = optarg; break; case 'u': uidmap = optarg; break; default: usage(argv[0]); } if (argc <= optind) usage(argv[0]); parent = getpid(); switch (child = fork()) { case -1: error(1, errno, "fork"); case 0: raise(SIGSTOP); // if (geteuid() != 0) // denysetgroups(parent); writemap(parent, GID, gidmap); writemap(parent, UID, uidmap); if (outside) { if (setgid(getgid()) < 0 || setuid(getuid()) < 0) error(1, 0, "Failed to drop privileges"); execlp(SHELL, SHELL, "-c", outside, NULL); error(1, errno, "exec %s", outside); } exit(EXIT_SUCCESS); } if (setgid(getgid()) < 0 || setuid(getuid()) < 0) error(1, 0, "Failed to drop privileges"); if (unshare(CLONE_NEWIPC | CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWUTS) < 0) error(1, 0, "Failed to unshare namespaces"); if (!hostnet && unshare(CLONE_NEWNET) < 0) error(1, 0, "Failed to unshare network namespace"); waitforstop(child); kill(child, SIGCONT); waitforexit(child); setgid(0); setgroups(0, NULL); setuid(0); master = stdio ? -1 : getconsole(); createroot(argv[optind], master, inside, bind); unshare(CLONE_NEWPID); switch (child = fork()) { case -1: error(1, errno, "fork"); case 0: mountproc(); if (!hostnet) mountsys(); enterroot(); if (master >= 0) { close(master); setconsole("/dev/console"); } clearenv(); putenv("container=contain"); if (argv[optind + 1]) execv(argv[optind + 1], argv + optind + 1); else execl(SHELL, SHELL, NULL); error(1, errno, "exec"); } return supervise(child, master); }