From: Adam Dickmeiss Date: Wed, 6 Sep 2006 15:01:53 +0000 (+0000) Subject: Fixed bug 655: IP reverse map no longer works. Renamed blocking element X-Git-Tag: YAZ.2.1.30~16 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=11dbebdf973d652e486f2b5e457cc46d1478556f;hp=162ee9de8503efe26215c487e10789f6cfcc6d17 Fixed bug 655: IP reverse map no longer works. Renamed blocking element of COMSTACK to flags to make things more clearer. --- diff --git a/include/yaz/comstack.h b/include/yaz/comstack.h index 5a264f1..3f8ca64 100644 --- a/include/yaz/comstack.h +++ b/include/yaz/comstack.h @@ -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 diff --git a/include/yaz/tcpip.h b/include/yaz/tcpip.h index b9afb09..a9ea615 100644 --- a/include/yaz/tcpip.h +++ b/include/yaz/tcpip.h @@ -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 diff --git a/include/yaz/unix.h b/include/yaz/unix.h index fc6da6e..32d1f94 100644 --- a/include/yaz/unix.h +++ b/include/yaz/unix.h @@ -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 diff --git a/src/tcpip.c b/src/tcpip.c index 5eb4ea4..af2d813 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -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; } diff --git a/src/unix.c b/src/unix.c index 7f1ba93..77cea3c 100644 --- a/src/unix.c +++ b/src/unix.c @@ -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 */