@@ -1741,11 +1741,27 @@ cmd_execve_startup(int fd, int argc, char *argv[], int is_just_started)
17411741 return 0 ;
17421742}
17431743
1744+ static void
1745+ kill_and_wait (int pid )
1746+ {
1747+ int status ;
1748+
1749+ (void ) kill (pid , SIGTERM );
1750+ (void ) waitpid (pid , & status , 0 );
1751+ }
1752+
1753+ static int childpid ;
1754+
17441755static int
17451756cmd_run (int argc , char * argv [])
17461757{
17471758 int pid ;
17481759
1760+ if (childpid ) {
1761+ kill_and_wait (childpid );
1762+ childpid = 0 ;
1763+ }
1764+
17491765 pid = fork ();
17501766 if (pid == -1 ) {
17511767 kplogerror ("can't fork()\n" );
@@ -1756,23 +1772,23 @@ cmd_run(int argc, char *argv[])
17561772 return execl ("/bin/sh" , "sh" , "-c" , argv [1 ], (char * )NULL );
17571773 }
17581774
1775+ childpid = pid ;
17591776 printf ("%d\n" , pid );
17601777 return 0 ;
17611778}
17621779
17631780static int
17641781cmd_kill (int argc , char * argv [])
17651782{
1766- int status , pid ;
1783+ int pid ;
17671784
17681785 if (sscanf (argv [1 ], "%d" , & pid ) != 1 ) {
17691786 kperr ("can't parse pid from %s\n" , argv [1 ]);
17701787 return -1 ;
17711788 }
17721789
17731790 kpdebug ("killing %d\n" , pid );
1774- (void ) kill (pid , SIGTERM );
1775- (void ) waitpid (pid , & status , 0 );
1791+ kill_and_wait (pid );
17761792
17771793 return 0 ;
17781794}
@@ -1946,14 +1962,34 @@ server_bind_socket(const char *path)
19461962 return rv ;
19471963}
19481964
1965+ static void
1966+ kill_child (int signum )
1967+ {
1968+ /* Hello Bulba my old friend... */
1969+ (void ) signum ;
1970+ if (childpid )
1971+ kill_and_wait (childpid );
1972+ exit (0x80 | signum );
1973+ }
1974+
19491975static int
19501976cmd_server (int argc , char * argv [])
19511977{
19521978 int sfd = -1 , cfd , rv ;
1979+ struct sigaction act ;
19531980
19541981 if (argc < 2 )
19551982 return usage_server ("UNIX socket argument is missing" );
19561983
1984+ memset (& act , 0 , sizeof (act ));
1985+ act .sa_handler = kill_child ;
1986+ act .sa_flags = SA_RESTART ;
1987+ rv = sigaction (SIGTERM , & act , NULL );
1988+ if (rv < 0 ) {
1989+ kplogerror ("can't install signal handler\n" );
1990+ return -1 ;
1991+ }
1992+
19571993 sfd = server_bind_socket (argv [1 ]);
19581994 if (sfd < 0 )
19591995 return sfd ;
@@ -1973,6 +2009,9 @@ cmd_server(int argc, char *argv[])
19732009 break ;
19742010 }
19752011
2012+ if (childpid )
2013+ kill_and_wait (childpid );
2014+
19762015 close (sfd );
19772016 return 0 ;
19782017}
0 commit comments