home *** CD-ROM | disk | FTP | other *** search
- /*
- * (c) Copyright 1992 by Panagiotis Tsirigotis
- * All rights reserved. The file named COPYRIGHT specifies the terms
- * and conditions for redistribution.
- */
-
- static char RCSid[] = "$Id: exit.c,v 5.1 1992/11/01 00:01:21 panos Exp $" ;
-
- #include <sys/types.h>
- #include <sys/time.h>
- #include <sys/resource.h>
- #include <sys/wait.h>
- #include <syslog.h>
- #include <errno.h>
-
- #include "pset.h"
-
- #include "server.h"
- #include "state.h"
-
- void msg() ;
-
- void child_exit()
- {
- struct server *find_server() ;
- void server_exit() ;
- char *func = "child_exit" ;
-
- for ( ;; ) /* Find all children that exited */
- {
- int status ;
- register int pid ;
- struct server *serp ;
-
- #if defined( sun ) && defined( lint )
- pid = wait3( (union wait *)&status, WNOHANG, RUSAGE_NULL ) ;
- #else
- pid = wait3( &status, WNOHANG, RUSAGE_NULL ) ;
- #endif
-
- if ( debug.on )
- msg( LOG_DEBUG, func, "wait3 returned = %d", pid ) ;
-
- if ( pid == -1 )
- if ( errno == EINTR )
- continue ;
- else
- break ;
-
- if ( pid == 0 )
- break ;
-
- if ( ( serp = find_server( pid ) ) != NULL )
- {
- serp->exit_status = status ;
- server_exit( serp ) ;
- }
- else
- msg( LOG_NOTICE, func, "unknown child process %d %s", pid,
- PROC_STOPPED( status ) ? "stopped" : "died" ) ;
- }
- }
-
-
-
- PRIVATE void server_exit( serp )
- struct server *serp ;
- {
- struct service *sp = SERVER_SERVICE( serp ) ;
- struct service_config *scp = CONF( sp ) ;
- register struct service_data *sdp = SDATA( sp ) ;
- char *func = "server_exit" ;
-
- if ( PROC_EXITED( serp->exit_status ) || PROC_SIGNALED( serp->exit_status ) )
- {
- char *death_type = PROC_EXITED( serp->exit_status ) ? "exited" : "died" ;
-
- if ( debug.on )
- {
- struct service *conn_sp = SERVER_CONNECTION( serp )->sp ;
-
- if ( conn_sp == sp )
- msg( LOG_DEBUG, func,
- "%s server %d %s", scp->id, serp->pid, death_type ) ;
- else
- msg( LOG_DEBUG, func,
- "%s server %d running on behalf of service %s %s",
- scp->id, serp->pid, CONF( conn_sp )->id, death_type ) ;
- }
-
- if ( sdp->postmortem != NULL )
- (*sdp->postmortem)( serp ) ;
-
- if ( sdp->running_servers > 0 )
- sdp->running_servers-- ;
- else
- msg( LOG_ERR, func,
- "Service %s: server exit with 0 running servers", scp->id ) ;
-
- pset_remove( ps.rws.servers, serp ) ;
-
- server_release( serp ) ;
- }
- else if ( PROC_STOPPED( serp->exit_status ) )
- msg( LOG_WARNING, func,
- "service %s: server with pid %d stopped", scp->id, serp->pid ) ;
- }
-
-
- /*
- * Find the running server with the specified pid
- */
- PRIVATE struct server *find_server( pid )
- register int pid ;
- {
- register unsigned u ;
-
- for ( u = 0 ; u < pset_count( ps.rws.servers ) ; u++ )
- {
- register struct server *serp ;
-
- serp = SERP( pset_pointer( ps.rws.servers, u ) ) ;
- if ( serp->pid == pid )
- return( serp ) ;
- }
- return( NULL ) ;
- }
-
-