Windows compile fix.
[yaz-moved-to-github.git] / src / tcpip.c
index 02353c9..f232601 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: tcpip.c,v 1.18 2006-06-09 12:40:53 adam Exp $
+ * $Id: tcpip.c,v 1.21 2006-08-30 12:47:23 adam Exp $
  */
 /**
  * \file tcpip.c
@@ -187,6 +187,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
     p->f_addrstr = tcpip_addrstr;
     p->f_straddr = tcpip_straddr;
     p->f_set_blocking = tcpip_set_blocking;
+    p->max_recv_bytes = 5000000;
 
     p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
     p->event = CS_NONE;
@@ -240,9 +241,18 @@ int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add,
                        int default_port)
 {
     struct hostent *hp;
+#if HAVE_GETHOSTBYNAME_R
+    struct hostent h;
+    char hbuf[1024];
+    int h_error;
+#endif
     char *p, buf[512];
     short int port = default_port;
-    unsigned tmpadd;
+#ifdef WIN32
+       unsigned long tmpadd;
+#else
+    in_addr_t tmpadd;
+#endif
 
     if (!tcpip_init ())
         return 0;
@@ -259,12 +269,26 @@ int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add,
     }
     add->sin_port = htons(port);
     if (!strcmp("@", buf))
+    {
         add->sin_addr.s_addr = INADDR_ANY;
+    }
+    else if ((tmpadd = inet_addr(buf)) != INADDR_NONE)
+    {
+        memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+    }
+#if HAVE_GETHOSTBYNAME_R
+    else if (gethostbyname_r(buf, &h, hbuf, sizeof(hbuf), &hp, &h_error) == 0)
+    {
+        memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
+               sizeof(struct in_addr));
+    }
+#else
     else if ((hp = gethostbyname(buf)))
+    {
         memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
                sizeof(struct in_addr));
-    else if ((tmpadd = (unsigned) inet_addr(buf)) != 0)
-        memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+    }
+#endif
     else
         return 0;
     return 1;
@@ -751,11 +775,17 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize)
         if (!*bufsize)
         {
             if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
+            {
+                h->cerrno = CSYSERR;
                 return -1;
+            }
         }
         else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
             if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+            {
+                h->cerrno = CSYSERR;
                 return -1;
+            }
 #ifdef __sun__
         yaz_set_errno( 0 );
         /* unfortunatly, sun sometimes forgets to set errno in recv
@@ -800,6 +830,11 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize)
         else if (!res)
             return hasread;
         hasread += res;
+        if (hasread > h->max_recv_bytes)
+        {
+            h->cerrno = CSBUFSIZE;
+            return -1;
+        }
     }
     TRC (fprintf (stderr, "  Out of read loop with hasread=%d, berlen=%d\n",
                   hasread, berlen));