diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-02-18 15:23:30 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-02-18 15:33:34 +0200 |
commit | 0a55965bcc28928ae17ca39e3b8e35adf11ea09c (patch) | |
tree | ed8f6543999caef2d81b517fb90182be4a984fda /src/progman.c | |
parent | d5302613a00915076b945b25b50eb6b376121955 (diff) | |
download | pies-0a55965bcc28928ae17ca39e3b8e35adf11ea09c.tar.gz pies-0a55965bcc28928ae17ca39e3b8e35adf11ea09c.tar.bz2 |
Fix activation/deactivation of network listeners.
* src/ctl.c (prog_active): New function.
(prog_serialize): Use prog_active to report prog's activity state.
For listener components, return also their service and tcpmux master
names, if applicable.
(fun_stop): Stop listeners as well.
(fun_start): Start listeners.
(ctlio_end): Don't close fd: this is done by deregister_socket
* src/inetd-bi.c (tcpmux_help): Don't list inactive components.
* src/prog.h (prog_activate_listener)
(prog_deactivate_listener): New protos.
* src/progman.c (prog_lookup_by_tag)
(prog_lookup_by_service): Remove.
(progman_cleanup): Fix coredump (premature free).
(progman_stop_component): If component is a listener, deactivate it.
(prog_activate_listener)
(prog_deactivate_listener): New functions.
* src/socket.c (delete_sockinst): Close the socket descriptor.
* src/sysvinit.c (sysvinit_fifo_handler, create_fifo): Don't close fd,
leave that to deregister_socket.
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); |