--- a/chipmunk/netop.c +++ b/chipmunk/netop.c @@ -53,16 +53,24 @@ extern const char IPv4_ALL[]; - assert( (port > 0) && sockfd && ipaddr ); + int socktype = 0; + socklen_t socktypelen = sizeof(socktype); + int inetd = !getsockopt(0, SOL_SOCKET, SO_TYPE, &socktype, &socktypelen) && socktype == SOCK_STREAM; + + assert( (!inetd || port > 0) && sockfd && ipaddr ); (void)IPv4_ALL; TRACE( (void)tmfprintf( g_flog, "Setting up listener for [%s:%d]\n", ipaddr[0] ? ipaddr : IPv4_ALL, port) ); rc = ERR_INTERNAL; do { + if (inetd) + lsock = 0; + else lsock = socket( AF_INET, SOCK_STREAM, 0 ); if( -1 == lsock ) break; + if (!inetd) { (void) memset( &servaddr, 0, sizeof(servaddr) ); servaddr.sin_family = AF_INET; servaddr.sin_port = htons( (short)port ); @@ -87,6 +95,7 @@ __func__); break; } + } #define NONBLOCK 1 rc = set_nblock (lsock, NONBLOCK); @@ -102,8 +111,10 @@ break; } + if (!inetd) { rc = bind( lsock, (struct sockaddr*)&servaddr, sizeof(servaddr) ); if( 0 != rc ) break; + } rc = listen (lsock, (bklog > 0 ? bklog : 1)); if( 0 != rc ) break; --- a/chipmunk/udpxy.c +++ b/chipmunk/udpxy.c @@ -1391,7 +1391,12 @@ openlog( g_udpxy_app, LOG_CONS | LOG_PID, LOG_LOCAL0 ); do { - if( (argc < 2) || (port <= 0) || (rc != 0) ) { + int socktype = 0; + socklen_t socktypelen = sizeof(socktype); + int inetd = !getsockopt(0, SOL_SOCKET, SO_TYPE, &socktype, &socktypelen) && socktype == SOCK_STREAM; + if (inetd) + no_daemon = 1; + if( !inetd && ((argc < 2) || (port <= 0) || (rc != 0)) ) { usage( argv[0], stderr ); rc = ERR_PARAM; break; }