/* * Copyright (C) 1995-1997 Christopher D. Granz * * This header may not be removed. * * Refer to the file "License" included in this package for further * information and before using any of the following. */ #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include "sapphire.h" /* * Functions */ /* * Allocates memory for a new child process structure and adds that * structure to the global linked-list of child process structures. */ CHILDP_DATA *new_child( pid_t pPid, int *pStdin, int *pStdout, int *pStderr, char *pCmdLine ) { CHILDP_DATA *pChild = alloc_mem( sizeof( pChild ) ); pChild->pPid = pPid; pChild->iStdin[0] = pStdin[0]; pChild->iStdin[1] = pStdin[1]; pChild->iStdout[0] = pStdout[0]; pChild->iStdout[1] = pStdout[1]; pChild->iStderr[0] = pStderr[0]; pChild->iStderr[1] = pStderr[1]; pChild->pCmdLine = str_dup( pCmdLine ); pChild->pNext = pChildren; pChildren = pChild; return ( pChild ); } bool die_child( CHILDP_DATA *pChild, int *pStatus ) { *pStatus = 0; waitpid( pChild->pPid, pStatus, WNOHANG ); if ( kill( pChild->pPid, 0 ) < 0 ) { /* Cleanup time! */ if ( pChild == pChildren ) pChildren = pChildren->pNext; else { CHILDP_DATA *pPrev; for ( pPrev = pChildren; pPrev != NULL; pPrev = pPrev->pNext ) { if ( pPrev->pNext == pChild ) { pPrev->pNext = pChild->pNext; break; } } #ifdef DEBUG if ( pPrev == NULL ) wcdebug( "Child not found." ); #endif } close( pChild->iStdin[1] ); close( pChild->iStdin[0] ); close( pChild->iStdout[1] ); close( pChild->iStdout[0] ); close( pChild->iStderr[1] ); close( pChild->iStderr[0] ); str_free( pChild->pCmdLine ); free_mem( (void **) &pChild ); return ( TRUE ); } return ( FALSE ); } /* * End of child.c */