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; }
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; }
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; }