static int do_call(int node) { char *apps; log_debug(LOG_JOB, "Call(%s)\n", model_get_path(node)); if (db_get_apps(model_parent(node), &apps) != 0) { send_result(CMD_ERROR, "no app", 6); exit(1); } if (strchr(apps, '/') == NULL) { // there is only one script do_execute(node, apps); } else { // multiple scripts, run concurrently char *t, *s; struct ProcChild *p; int cmd; int cnt = 0; size_t size; // FIXME: package count send_result(CMD_RESULT_START, NULL, 0); for (t = apps; t; t = s) { s = strchr(t, '/'); if (s) { *s = '\0'; ++s; } bk_node = node; bk_app = t; p = proc_fork(exec_proc, "SubJob"); if (p) { ++cnt; } else { send_result(CMD_ERROR, "fork failed", 11); } } while(1) { struct ipc_data *ipc; proc_listen(&p, &cmd, &size, -1); if (cmd == CMD_FINISH) { --cnt; if (!cnt) break; } else { proc_recv(p, &ipc, size); proc_send(TO_PARENT, cmd, ipc, size); } } send_result(CMD_RESULT_END, NULL, 0); } return 0; }
static void job_proc(void) { struct ipc_struct ipc; struct pack *p; struct ProcChild *sender; char *t, *s; int cmd; size_t size; p = pack_new(256); while (1) { if (1 == proc_listen(&sender, &cmd, &size, 1)) break; } proc_get(sender, &ipc, p, size); bk_channel = ipc.source; switch (cmd) { case CMD_REGISTER: pack_get(p, &t, NULL); pack_get(p, &s, NULL); do_register(ipc.node, t, s); break; case CMD_REMOVE: pack_get(p, &t, NULL); do_remove(t); break; case CMD_CALL: do_call(ipc.node, p); break; case CMD_CALL_PACKAGE: pack_get(p, &t, NULL); do_call_package(ipc.node, t, p); break; case CMD_GETLIST: do_getlist(ipc.node); break; case CMD_DUMP_PROFILE: do_dump_profile(); break; case CMD_EVENT: pack_get(p, &t, NULL); pack_get(p, &s, NULL); do_event(t, ipc.node, s, p); break; } }
static PyObject * c_call(PyObject *self, PyObject *args) { struct ipc_struct ipc; struct pack *p; char *node; char *pak; int nd; if (!PyArg_ParseTuple(args, "ss", &node, &pak)) return NULL; nd = model_lookup_method(node); if (nd == -1) return NULL; memset(&ipc, 0, sizeof(struct ipc_struct)); ipc.node = nd; p = pack_new(128); pack_put(p, pak, strlen(pak)); job_start(CMD_CALL_PACKAGE, &ipc, p); while (1) { struct ProcChild *sender; int cmd; int size; if (1 == proc_listen(&sender, &cmd, &size, 1)) { switch (cmd) { case CMD_RESULT: case CMD_FAIL: case CMD_ERROR: case CMD_NONE: proc_get(sender, &ipc, p, size); break; case CMD_NOTIFY: proc_get(sender, &ipc, p, size); proc_put(TO_PARENT, cmd, &ipc, p); break; } if (cmd == CMD_FINISH) break; } } Py_INCREF(Py_None); return Py_None; }
static void job_proc(void) { struct ProcChild *sender; char *t, *s; int cmd; size_t size; while (1) { if (1 == proc_listen(&sender, &cmd, &size, 1)) break; } ipc_recv(sender, size); chan = ipc_get_data(); chan_id = ipc_get_id(); switch (cmd) { case CMD_REGISTER: ipc_get_arg(&t, NULL); ipc_get_arg(&s, NULL); do_register(ipc_get_node(), t, s); break; case CMD_REMOVE: ipc_get_arg(&t, NULL); do_remove(t); break; case CMD_CALL: do_call(ipc_get_node()); break; case CMD_CALL_PACKAGE: ipc_get_arg(&t, NULL); do_call_package(ipc_get_node(), t); break; case CMD_GETLIST: do_getlist(ipc_get_node()); break; case CMD_DUMP_PROFILE: do_dump_profile(); break; } }
void modem_run (void) { /* This is a main thread for MODEM Control module. It is called on every */ /* system timer timer tick to implement delays easy. By default this is */ /* every 100ms. The 'sytem tick' timeout is set in 'Net_Config.c' */ if (delay) { if (--delay) { return; } } switch (modem_st) { case MODEM_IDLE: case MODEM_ERROR: /* Modem idle or in error */ break; case MODEM_ONLINE: /* Modem is online - connected */ break; case MODEM_DIAL: /* Dial target number */ proc_dial (); break; case MODEM_LISTEN: /* Activate answering mode */ proc_listen (); break; case MODEM_HANGUP: /* Hangup and reset the modem */ proc_hangup (); break; } }
static int do_call(int node, struct pack *pak) { struct pack *p = NULL; char *apps; int ok = 0; log_debug(LOG_JOB, "Call(%s)\n", model_get_path(node)); if (model_flags(node) & P_GLOBAL) { p = pack_dup(pak); } if (db_get_apps(model_parent(node), &apps) != 0) { send_result(CMD_NONE, "noapp", 5); // FIXME: ok diyecek betik yoksa profile kayıt etmeli mi acaba exit(1); } if (strchr(apps, '/') == NULL) { // there is only one script if (0 == do_execute(node, apps, pak)) ok = 1; } else { // multiple scripts, run concurrently char *t, *s; struct ProcChild *p; int cmd; int cnt = 0; size_t size; // FIXME: package count send_result(CMD_RESULT_START, NULL, 0); for (t = apps; t; t = s) { s = strchr(t, '/'); if (s) { *s = '\0'; ++s; } bk_node = node; bk_app = t; bk_pak = pak; p = proc_fork(exec_proc, "ComarSubJob"); if (p) { ++cnt; } else { send_result(CMD_ERROR, "fork failed", 11); } } while(1) { struct ipc_struct ipc; struct pack *pak; pak = pack_new(128); proc_listen(&p, &cmd, &size, -1); if (cmd == CMD_FINISH) { --cnt; if (!cnt) break; } else { if (cmd == CMD_RESULT) ok++; proc_get(p, &ipc, pak, size); proc_put(TO_PARENT, cmd, &ipc, pak); } } send_result(CMD_RESULT_END, NULL, 0); } if ((model_flags(node) & P_GLOBAL) && ok) { db_put_profile(node, NULL, p); pack_delete(p); } return 0; }
pid_t proc_run(struct privsep *ps, struct privsep_proc *p, struct privsep_proc *procs, u_int nproc, void (*init)(struct privsep *, struct privsep_proc *, void *), void *arg) { pid_t pid; struct passwd *pw; const char *root; struct control_sock *rcs; u_int n; if (ps->ps_noaction) return (0); proc_open(ps, p, procs, nproc); /* Fork child handlers */ switch (pid = fork()) { case -1: fatal("proc_run: cannot fork"); case 0: /* Set the process group of the current process */ setpgrp(0, getpid()); break; default: return (pid); } pw = ps->ps_pw; if (p->p_id == PROC_CONTROL && ps->ps_instance == 0) { if (control_init(ps, &ps->ps_csock) == -1) fatalx(p->p_title); TAILQ_FOREACH(rcs, &ps->ps_rcsocks, cs_entry) if (control_init(ps, rcs) == -1) fatalx(p->p_title); } /* Change root directory */ if (p->p_chroot != NULL) root = p->p_chroot; else root = pw->pw_dir; if (chroot(root) == -1) fatal("proc_run: chroot"); if (chdir("/") == -1) fatal("proc_run: chdir(\"/\")"); privsep_process = p->p_id; setproctitle("%s", p->p_title); if (setgroups(1, &pw->pw_gid) || setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) || setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) fatal("proc_run: cannot drop privileges"); /* Fork child handlers */ for (n = 1; n < ps->ps_instances[p->p_id]; n++) { if (fork() == 0) { ps->ps_instance = p->p_instance = n; break; } } #ifdef DEBUG log_debug("%s: %s %d/%d, pid %d", __func__, p->p_title, ps->ps_instance + 1, ps->ps_instances[p->p_id], getpid()); #endif event_init(); signal_set(&ps->ps_evsigint, SIGINT, proc_sig_handler, p); signal_set(&ps->ps_evsigterm, SIGTERM, proc_sig_handler, p); signal_set(&ps->ps_evsigchld, SIGCHLD, proc_sig_handler, p); signal_set(&ps->ps_evsighup, SIGHUP, proc_sig_handler, p); signal_set(&ps->ps_evsigpipe, SIGPIPE, proc_sig_handler, p); signal_set(&ps->ps_evsigusr1, SIGUSR1, proc_sig_handler, p); signal_add(&ps->ps_evsigint, NULL); signal_add(&ps->ps_evsigterm, NULL); signal_add(&ps->ps_evsigchld, NULL); signal_add(&ps->ps_evsighup, NULL); signal_add(&ps->ps_evsigpipe, NULL); signal_add(&ps->ps_evsigusr1, NULL); proc_listen(ps, procs, nproc); if (p->p_id == PROC_CONTROL && ps->ps_instance == 0) { TAILQ_INIT(&ctl_conns); if (control_listen(&ps->ps_csock) == -1) fatalx(p->p_title); TAILQ_FOREACH(rcs, &ps->ps_rcsocks, cs_entry) if (control_listen(rcs) == -1) fatalx(p->p_title); }
void modem_listen (void) { /* This function puts Modem into Answering Mode. */ step = 0; listen_mode = 1; proc_listen (); }