Rewrite based on latest project file.
[catagits/fcgi2.git] / libfcgi / os_unix.c
index d115f3a..5465cad 100755 (executable)
@@ -17,7 +17,7 @@
  */
 
 #ifndef lint
-static const char rcsid[] = "$Id: os_unix.c,v 1.23 2001/03/27 13:21:26 robs Exp $";
+static const char rcsid[] = "$Id: os_unix.c,v 1.28 2001/06/22 14:26:39 robs Exp $";
 #endif /* not lint */
 
 #include "fcgi_config.h"
@@ -55,17 +55,11 @@ static const char rcsid[] = "$Id: os_unix.c,v 1.23 2001/03/27 13:21:26 robs Exp
 #endif
 
 #include "fastcgi.h"
-#include "fcgiapp.h"
-#include "fcgiappmisc.h"
 #include "fcgimisc.h"
 #include "fcgios.h"
 
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
+#ifndef INADDR_NONE
+#define INADDR_NONE ((unsigned long) -1)
 #endif
 
 /*
@@ -105,7 +99,6 @@ static fd_set writeFdSetPost;
 static int numWrPosted = 0;
 static int volatile maxFd = -1;
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -146,7 +139,6 @@ int OS_LibInit(int stdioFds[3])
     return 0;
 }
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -173,7 +165,6 @@ void OS_LibShutdown()
     return;
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -220,13 +211,11 @@ static int OS_BuildSockAddrUn(const char *bindPath,
 #endif
     return 0;
 }
-\f
 union SockAddrUnion {
     struct  sockaddr_un        unixVariant;
     struct  sockaddr_in        inetVariant;
 };
 
-\f
 /*
  * OS_CreateLocalIpcFd --
  *
@@ -249,6 +238,7 @@ int OS_CreateLocalIpcFd(const char *bindPath, int backlog)
     int listenSock, servLen;
     union   SockAddrUnion sa;
     int            tcp = FALSE;
+    unsigned long tcp_ia;
     char    *tp;
     short   port;
     char    host[MAXPATHLEN];
@@ -262,12 +252,26 @@ int OS_CreateLocalIpcFd(const char *bindPath, int backlog)
            tcp = TRUE;
         }
     }
-    if(tcp && (*host && strcmp(host, "localhost") != 0)) {
-       fprintf(stderr, "To start a service on a TCP port can not "
-                       "specify a host name.\n"
-                       "You should either use \"localhost:<port>\" or "
-                       " just use \":<port>.\"\n");
-       exit(1);
+    if(tcp) {
+      if (!*host || !strcmp(host,"*")) {
+       tcp_ia = htonl(INADDR_ANY);
+      } else {
+       tcp_ia = inet_addr(host);
+       if (tcp_ia == INADDR_NONE) {
+         struct hostent * hep;
+         hep = gethostbyname(host);
+         if ((!hep) || (hep->h_addrtype != AF_INET || !hep->h_addr_list[0])) {
+           fprintf(stderr, "Cannot resolve host name %s -- exiting!\n", host);
+           exit(1);
+         }
+         if (hep->h_addr_list[1]) {
+           fprintf(stderr, "Host %s has multiple addresses ---\n", host);
+           fprintf(stderr, "you must choose one explicitly!!!\n");
+           exit(1);
+         }
+         tcp_ia = ((struct in_addr *) (hep->h_addr))->s_addr;
+       }
+      }
     }
 
     if(tcp) {
@@ -293,7 +297,7 @@ int OS_CreateLocalIpcFd(const char *bindPath, int backlog)
     if(tcp) {
        memset((char *) &sa.inetVariant, 0, sizeof(sa.inetVariant));
        sa.inetVariant.sin_family = AF_INET;
-       sa.inetVariant.sin_addr.s_addr = htonl(INADDR_ANY);
+       sa.inetVariant.sin_addr.s_addr = tcp_ia;
        sa.inetVariant.sin_port = htons(port);
        servLen = sizeof(sa.inetVariant);
     } else {
@@ -312,7 +316,6 @@ int OS_CreateLocalIpcFd(const char *bindPath, int backlog)
     return listenSock;
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -386,7 +389,6 @@ int OS_FcgiConnect(char *bindPath)
     }
 }
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -407,7 +409,7 @@ int OS_Read(int fd, char * buf, size_t len)
 {
     return(read(fd, buf, len));
 }
-\f
+
 /*
  *--------------------------------------------------------------
  *
@@ -429,7 +431,6 @@ int OS_Write(int fd, char * buf, size_t len)
     return(write(fd, buf, len));
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -495,7 +496,6 @@ int OS_SpawnChild(char *appPath, int listenFd)
     return 0;
 }
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -552,7 +552,6 @@ static void GrowAsyncTable(void)
 
 }
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -603,7 +602,7 @@ int OS_AsyncRead(int fd, int offset, void *buf, int len,
     FD_SET(fd, &readFdSet);
     return 0;
 }
-\f
+
 /*
  *--------------------------------------------------------------
  *
@@ -652,7 +651,7 @@ int OS_AsyncWrite(int fd, int offset, void *buf, int len,
     FD_SET(fd, &writeFdSet);
     return 0;
 }
-\f
+
 /*
  *--------------------------------------------------------------
  *
@@ -696,7 +695,7 @@ int OS_Close(int fd)
     }
     return close(fd);
 }
-\f
+
 /*
  *--------------------------------------------------------------
  *
@@ -721,7 +720,6 @@ int OS_CloseRead(int fd)
     return shutdown(fd, 0);
 }
 
-\f
 /*
  *--------------------------------------------------------------
  *
@@ -842,7 +840,7 @@ int OS_DoIo(struct timeval *tmo)
  * Not all systems have strdup().  
  * @@@ autoconf should determine whether or not this is needed, but for now..
  */
-char * str_dup(const char * str)
+static char * str_dup(const char * str)
 {
     char * sdup = (char *) malloc(strlen(str) + 1);
 
@@ -852,7 +850,6 @@ char * str_dup(const char * str)
     return sdup;
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -892,7 +889,6 @@ static int ClientAddrOK(struct sockaddr_in *saPtr, const char *clientList)
     return result;
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -931,7 +927,7 @@ static int AcquireLock(int sock, int fail_on_intr)
     return 0;
 #endif
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -970,7 +966,6 @@ static int ReleaseLock(int sock)
 #endif
 }
 
-\f
 /**********************************************************************
  * Determine if the errno resulting from a failed accept() warrants a
  * retry or exit().  Based on Apache's http_main.c accept() handling
@@ -1126,7 +1121,7 @@ int OS_Accept(int listen_sock, int fail_on_intr, const char *webServerAddrs)
 
     return (socket);
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -1147,7 +1142,6 @@ int OS_IpcClose(int ipcFd)
     return OS_Close(ipcFd);
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -1184,7 +1178,7 @@ int OS_IsFcgi(int sock)
         return FALSE;
     }
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *