diff options
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/src/progman.c b/src/progman.c index 9641629..2c38b63 100644 --- a/src/progman.c +++ b/src/progman.c @@ -72,28 +72,6 @@ prog_lookup_by_pid (pid_t pid) return prog; } -struct prog * -prog_lookup_by_tag (const char *tag) -{ - struct prog *prog; - for (prog = proghead; prog; prog = prog->next) - if (strcmp (prog_tag (prog), tag) == 0) - break; - return prog; -} - -struct prog * -prog_lookup_by_service (const char *service) -{ - struct prog *prog; - for (prog = proghead; prog; prog = prog->next) - if (IS_COMPONENT (prog) - && prog->v.p.comp->service - && strcmp (prog->v.p.comp->service, service) == 0) - break; - return prog; -} - struct component * progman_lookup_component (const char *tag) { @@ -190,8 +168,8 @@ destroy_prog (struct prog **pp) { case TYPE_COMPONENT: component_ref_decr (p->v.p.comp); - if (p->v.p.status == status_listener) - deregister_socket (p->v.p.socket); + if (p->v.p.status == status_listener && p->v.p.socket != -1) + deregister_socket (p->v.p.socket); break; case TYPE_REDIRECTOR: @@ -2311,7 +2289,6 @@ progman_cleanup (int expect_term) } prog_stop_redirectors (prog); - destroy_prog (&prog); if (listener->v.p.num_instances == 0 && !component_is_active (prog->v.p.comp)) destroy_prog (&listener); @@ -2322,6 +2299,7 @@ progman_cleanup (int expect_term) if (listener->v.p.comp->flags & CF_WAIT) enable_socket (listener->v.p.socket); } + destroy_prog (&prog); } else { @@ -2388,11 +2366,13 @@ progman_stop_component (struct prog **progptr) switch (prog->v.p.status) { case status_running: - case status_listener: logmsg (LOG_INFO, _("stopping component `%s'"), prog_tag (prog)); prog_stop (prog, SIGTERM); break; + case status_listener: + prog_deactivate_listener (prog); + /* fall through */ case status_stopped: if (!component_is_active (prog->v.p.comp)) destroy_prog (progptr); @@ -2420,6 +2400,42 @@ progman_stop_component (struct prog **progptr) } void +prog_deactivate_listener (struct prog *prog) +{ + logmsg (LOG_INFO, _("deactivating listener `%s'"), prog_tag (prog)); + if (prog->v.p.socket != -1) + { + deregister_socket (prog->v.p.socket); + prog->v.p.socket = -1; + } +} + +int +prog_activate_listener (struct prog *prog) +{ + struct component *comp = prog->v.p.comp; + + logmsg (LOG_INFO, _("activating listener `%s'"), prog_tag (prog)); + if (comp->mode == pies_comp_inetd && !ISCF_TCPMUX (comp->flags) + && prog->v.p.socket == -1) + { + int fd = create_socket (comp->socket_url, + comp->socket_type, + comp->privs.user, comp->umask); + if (fd == -1) + return -1; + else if (register_program_socket (comp->socket_type, fd, prog)) + { + close (fd); + return -1; + } + else + prog->v.p.socket = fd; + } + return 0; +} + +void progman_stop_tag (const char *name) { struct prog *prog = progman_locate (name); |