/
Sapphire/bin/
Sapphire/db/
Sapphire/db/OLC_rooms/
Sapphire/db/abi/
Sapphire/db/em_src/
Sapphire/db/helps/
Sapphire/db/helps/emman/ifunc/
Sapphire/db/npcs/Tatt/
Sapphire/db/objects/Tatt/
Sapphire/db/q_data/
Sapphire/db/rooms/Tatt/
Sapphire/doc/
Sapphire/doc/em/
Sapphire/etc/
Sapphire/src/abic/
Sapphire/src/areacon/
Sapphire/src/client/
Sapphire/src/embc/
Sapphire/src/emi/
Sapphire/src/emi/test/
Sapphire/src/include/
Sapphire/src/sapphire/em/
Sapphire/src/tcon/
/*
 * 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
 */