Fixed bug 655: IP reverse map no longer works. Renamed blocking element
authorAdam Dickmeiss <adam@indexdata.dk>
Wed, 6 Sep 2006 15:01:53 +0000 (15:01 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Wed, 6 Sep 2006 15:01:53 +0000 (15:01 +0000)
of COMSTACK to flags to make things more clearer.

include/yaz/comstack.h
include/yaz/tcpip.h
include/yaz/unix.h
src/tcpip.c
src/unix.c

index 5a264f1..3f8ca64 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2006, Index Data ApS
  *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation, in whole or in part, for any purpose, is hereby granted,
@@ -23,7 +23,7 @@
  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  * OF THIS SOFTWARE.
  *
- * $Id: comstack.h,v 1.22 2006-08-24 13:25:44 adam Exp $
+ * $Id: comstack.h,v 1.23 2006-09-06 15:01:53 adam Exp $
  */
 
 /** 
@@ -44,7 +44,7 @@ YAZ_BEGIN_CDECL
 
 struct comstack;
 typedef struct comstack *COMSTACK;
-typedef COMSTACK (*CS_TYPE)(int s, int blocking, int protocol, void *vp);
+typedef COMSTACK (*CS_TYPE)(int s, int flags, int protocol, void *vp);
 
 struct comstack
 {
@@ -64,7 +64,7 @@ struct comstack
 #define CS_ST_ACCEPT     5
 #define CS_ST_CONNECTING 6
     int newfd;     /* storing new descriptor between listen and accept */
-    int blocking;  /* is this link (supposed to be) blocking? */
+    int flags;     /* flags, blocking etc.. CS_FLAGS_..  */
     unsigned io_pending; /* flag to signal read / write op is incomplete */
     int event;     /* current event */
 #define CS_NONE       0
@@ -151,6 +151,9 @@ YAZ_EXPORT void cs_set_max_recv_bytes(COMSTACK cs, int max_recv_bytes);
 #define CS_SR     PROTO_SR
 #define CS_Z3950  PROTO_Z3950
 
+#define CS_FLAGS_BLOCKING 1
+#define CS_FLAGS_NUMERICHOST 2
+
 YAZ_END_CDECL
 
 #endif
index b9afb09..a9ea615 100644 (file)
@@ -23,7 +23,7 @@
  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  * OF THIS SOFTWARE.
  *
- * $Id: tcpip.h,v 1.8 2006-08-30 18:58:58 adam Exp $
+ * $Id: tcpip.h,v 1.9 2006-09-06 15:01:53 adam Exp $
  */
 /**
  * \file tcpip.h
@@ -39,8 +39,8 @@
 YAZ_BEGIN_CDECL
 
 YAZ_EXPORT int completeWAIS(const unsigned char *buf, int len);
-YAZ_EXPORT COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp);
-YAZ_EXPORT COMSTACK ssl_type(int s, int blocking, int protocol, void *vp);
+YAZ_EXPORT COMSTACK tcpip_type(int s, int flags, int protocol, void *vp);
+YAZ_EXPORT COMSTACK ssl_type(int s, int flags, int protocol, void *vp);
 
 YAZ_END_CDECL
 
index fc6da6e..32d1f94 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2006, Index Data ApS
  *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation, in whole or in part, for any purpose, is hereby granted,
@@ -23,7 +23,7 @@
  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  * OF THIS SOFTWARE.
  *
- * $Id: unix.h,v 1.5 2005-06-25 15:46:03 adam Exp $
+ * $Id: unix.h,v 1.6 2006-09-06 15:01:53 adam Exp $
  * UNIX socket COMSTACK. By Morten Bøgeskov.
  */
 /**
@@ -43,7 +43,7 @@ YAZ_BEGIN_CDECL
 
 YAZ_EXPORT int completeWAIS(const unsigned char *buf, int len);
 YAZ_EXPORT struct sockaddr_un *unix_strtoaddr(const char *str);
-YAZ_EXPORT COMSTACK unix_type(int s, int blocking, int protocol, void *vp);
+YAZ_EXPORT COMSTACK unix_type(int s, int flags, int protocol, void *vp);
 
 YAZ_END_CDECL
 
index 5eb4ea4..af2d813 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2006, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: tcpip.c,v 1.27 2006-09-01 12:42:31 adam Exp $
+ * $Id: tcpip.c,v 1.28 2006-09-06 15:01:53 adam Exp $
  */
 /**
  * \file tcpip.c
@@ -137,7 +137,7 @@ static int tcpip_init (void)
  * This function is always called through the cs_create() macro.
  * s >= 0: socket has already been established for us.
  */
-COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
+COMSTACK tcpip_type(int s, int flags, int protocol, void *vp)
 {
     COMSTACK p;
     tcpip_state *sp;
@@ -150,7 +150,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
                                          xmalloc(sizeof(tcpip_state)))))
         return 0;
 
-    p->blocking = blocking;
+    p->flags = flags;
 
     p->io_pending = 0;
     p->iofile = s;
@@ -202,12 +202,12 @@ COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp)
 
 #if HAVE_OPENSSL_SSL_H
 
-COMSTACK ssl_type(int s, int blocking, int protocol, void *vp)
+COMSTACK ssl_type(int s, int flags, int protocol, void *vp)
 {
     tcpip_state *sp;
     COMSTACK p;
 
-    p = tcpip_type (s, blocking, protocol, 0);
+    p = tcpip_type (s, flags, protocol, 0);
     if (!p)
         return 0;
     p->f_get = ssl_get;
@@ -329,7 +329,7 @@ void *tcpip_straddr(COMSTACK h, const char *str)
             return 0;
         h->iofile = s;
         
-        if (!tcpip_set_blocking(h, h->blocking))
+        if (!tcpip_set_blocking(h, h->flags))
             return 0;
     }
     return sp->ai;
@@ -744,7 +744,7 @@ COMSTACK tcpip_accept(COMSTACK h)
             }
             return 0;
         }
-        if (!tcpip_set_blocking(cnew, cnew->blocking))
+        if (!tcpip_set_blocking(cnew, cnew->flags))
         {
             h->cerrno = CSYSERR;
             if (h->newfd != -1)
@@ -1203,25 +1203,50 @@ int tcpip_close(COMSTACK h)
 
 char *tcpip_addrstr(COMSTACK h)
 {
-    struct sockaddr_in addr;
     tcpip_state *sp = (struct tcpip_state *)h->cprivate;
     char *r = 0, *buf = sp->buf;
-    YAZ_SOCKLEN_T len;
+
+#if HAVE_GETADDRINFO
+    char host[120];
+    struct sockaddr_storage addr;
+    YAZ_SOCKLEN_T len = sizeof(addr);
+    
+    if (getpeername(h->iofile, (struct sockaddr *)&addr, &len) < 0)
+    {
+        h->cerrno = CSYSERR;
+        return 0;
+    }
+    if (getnameinfo((struct sockaddr *) &addr, len, host, sizeof(host)-1, 
+                    0, 0, 
+                    (h->flags & CS_FLAGS_NUMERICHOST) ? NI_NUMERICHOST : 0))
+    {
+        r = "unknown";
+    }
+    else
+        r = host;
+    
+#else
+
+    struct sockaddr_in addr;
+    YAZ_SOCKLEN_T len = sizeof(addr);
     struct hostent *host;
     
-    len = sizeof(addr);
     if (getpeername(h->iofile, (struct sockaddr*) &addr, &len) < 0)
     {
         h->cerrno = CSYSERR;
         return 0;
     }
-    if (!(h->blocking&2)) {
-        if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
-                              AF_INET)))
+    if (!(h->flags & CS_FLAGS_NUMERICHOST))
+    {
+        if ((host = gethostbyaddr((char*)&addr.sin_addr,
+                                  sizeof(addr.sin_addr),
+                                  AF_INET)))
             r = (char*) host->h_name;
     }
     if (!r)
-        r = inet_ntoa(addr.sin_addr);
+        r = inet_ntoa(addr.sin_addr);        
+#endif
+
     if (h->protocol == PROTO_HTTP)
         sprintf(buf, "http:%s", r);
     else
@@ -1238,17 +1263,17 @@ char *tcpip_addrstr(COMSTACK h)
     return buf;
 }
 
-int static tcpip_set_blocking(COMSTACK p, int blocking)
+int static tcpip_set_blocking(COMSTACK p, int flags)
 {
     unsigned long flag;
     
 #ifdef WIN32
-       flag = blocking ? 0 : 1;
+    flag = (flags & CS_FLAGS_BLOCKING) ? 0 : 1;
     if (ioctlsocket(p->iofile, FIONBIO, &flag) < 0)
         return 0;
 #else
     flag = fcntl(p->iofile, F_GETFL, 0);
-    if (blocking & 1)
+    if (flags & CS_FLAGS_BLOCKING)
         flag = flag & ~O_NONBLOCK;  /* blocking */
     else
     {
@@ -1258,7 +1283,7 @@ int static tcpip_set_blocking(COMSTACK p, int blocking)
     if (fcntl(p->iofile, F_SETFL, flag) < 0)
         return 0;
 #endif
-    p->blocking = blocking;
+    p->flags = flags;
     return 1;
 }
 
index 7f1ba93..77cea3c 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: unix.c,v 1.16 2005-10-22 13:32:04 adam Exp $
+ * $Id: unix.c,v 1.17 2006-09-06 15:01:53 adam Exp $
  * UNIX socket COMSTACK. By Morten Bøgeskov.
  */
 /**
@@ -107,7 +107,7 @@ static int unix_init (void)
  * This function is always called through the cs_create() macro.
  * s >= 0: socket has already been established for us.
  */
-COMSTACK unix_type(int s, int blocking, int protocol, void *vp)
+COMSTACK unix_type(int s, int flags, int protocol, void *vp)
 {
     COMSTACK p;
     unix_state *state;
@@ -129,7 +129,8 @@ COMSTACK unix_type(int s, int blocking, int protocol, void *vp)
                                         xmalloc(sizeof(unix_state)))))
         return 0;
 
-    if (!((p->blocking = blocking)&1))
+    p->flags = flags;
+    if (!(p->flags&CS_FLAGS_BLOCKING))
     {
         if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
             return 0;
@@ -504,7 +505,7 @@ static COMSTACK unix_accept(COMSTACK h)
             }
             return 0;
         }
-        if (!(cnew->blocking&1) && 
+        if (!(cnew->flags&CS_FLAGS_BLOCKING) && 
             (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
             )
         {
@@ -718,20 +719,20 @@ static char *unix_addrstr(COMSTACK h)
     return buf;
 }
 
-static int unix_set_blocking(COMSTACK p, int blocking)
+static int unix_set_blocking(COMSTACK p, int flags)
 {
     unsigned long flag;
 
-    if (p->blocking == blocking)
+    if (p->flags == flags)
         return 1;
     flag = fcntl(p->iofile, F_GETFL, 0);
-    if(!blocking)
+    if (flags & CS_FLAGS_BLOCKING)
         flag = flag & ~O_NONBLOCK;
     else
         flag = flag | O_NONBLOCK;
     if (fcntl(p->iofile, F_SETFL, flag) < 0)
         return 0;
-    p->blocking = blocking;
+    p->flags = flags;
     return 1;
 }
 #endif /* WIN32 */