示例#1
0
int CgidWorker::watchDog( const char * pServerRoot, const char * pChroot,
                        int priority, int switchToLscgid )
{
    if ( ( switchToLscgid == 1 )& ( m_pid != -1 ))
    {
        kill( m_pid, SIGTERM );
        m_pid = -1;
    }
    if ( m_pid != -1 )
        if ( kill( m_pid, 0 ) == 0 )
            return 0;
    char achData[256];
    char achExec[2048];
    if ( switchToLscgid )
    {
        snprintf( achExec, 2048, "%s%sbin/lscgid", (pChroot)?pChroot:"",
              pServerRoot );
    }
    else
        snprintf( achExec, 2048, "%s%sbin/httpd", (pChroot)?pChroot:"",
              pServerRoot );

    int ret = spawnCgid( m_fdCgid, achData, getConfig().getSecret());
    if ( ret != -1 )
        setState( ST_GOOD );
    return ret;    
    
}
示例#2
0
int CgidWorker::start( const char * pServerRoot, const char * pChroot,
                        uid_t uid, gid_t gid, int priority )
{
    char achSocket[1024];
    int fd;
    int ret;
    if ( m_pid != -1 )
        return 0;

    CgidConfig& config = getConfig();
    generateSecret( config.getSecretBuf());
    HttpGlobals::s_pCgid = this;
    config.addEnv( "PATH=/bin:/usr/bin:/usr/local/bin" );
    config.addEnv( NULL );
    
    char *p = achSocket;
    int i, n;
    memccpy( p, config.getSocket(), 0, 128 );
    setURL( p );
    fd = ExtWorker::startServerSock( &config, 200 );
    if ( fd == -1 )
    {
        LOG_ERR(("Cannot create a valid unix domain socket for CGI daemon." ));
        return -1;
    }
    m_fdCgid = fd;

    n = snprintf( p, 255, "uds:/%s", getConfig().getServerAddrUnixSock() );
    if ( getuid() == 0 )
    {
        chown( p + 5, 0, gid );
        chmod( p + 5, 0760 );
    }
    else
    {
        chmod( p + 5, 0700 );
    }

    if ( pChroot )
    {
        i = strlen( pChroot );
        memmove( p + 5, p + 5 + i, n - 5 - i + 1 );
    }
    setURL( p );

    ret = spawnCgid( m_fdCgid, p, config.getSecret() );

    if ( ret ==-1 )
    {
        return -1;
    }
    setState( ST_GOOD );
    return ret;
}
示例#3
0
int CgidWorker::watchDog(const char *pServerRoot, const char *pChroot,
                         int priority, int switchToLscgid)
{
    if ((switchToLscgid == 1) && (m_pid != -1))
    {
        kill(m_pid, SIGTERM);
        m_pid = -1;
    }
    if (m_pid != -1)
        if (kill(m_pid, 0) == 0)
            return 0;
    char achData[256];

    int ret = spawnCgid(m_fdCgid, achData, getConfig().getSecret());
    if (ret != -1)
        setState(ST_GOOD);
    return ret;

}