of COMSTACK to flags to make things more clearer.
/*
- * 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,
* 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 $
*/
/**
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
{
#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
#define CS_SR PROTO_SR
#define CS_Z3950 PROTO_Z3950
+#define CS_FLAGS_BLOCKING 1
+#define CS_FLAGS_NUMERICHOST 2
+
YAZ_END_CDECL
#endif
* 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
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
/*
- * 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,
* 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.
*/
/**
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
* 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
* 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;
xmalloc(sizeof(tcpip_state)))))
return 0;
- p->blocking = blocking;
+ p->flags = flags;
p->io_pending = 0;
p->iofile = s;
#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;
return 0;
h->iofile = s;
- if (!tcpip_set_blocking(h, h->blocking))
+ if (!tcpip_set_blocking(h, h->flags))
return 0;
}
return sp->ai;
}
return 0;
}
- if (!tcpip_set_blocking(cnew, cnew->blocking))
+ if (!tcpip_set_blocking(cnew, cnew->flags))
{
h->cerrno = CSYSERR;
if (h->newfd != -1)
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
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
{
if (fcntl(p->iofile, F_SETFL, flag) < 0)
return 0;
#endif
- p->blocking = blocking;
+ p->flags = flags;
return 1;
}
* 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.
*/
/**
* 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;
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;
}
return 0;
}
- if (!(cnew->blocking&1) &&
+ if (!(cnew->flags&CS_FLAGS_BLOCKING) &&
(fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
)
{
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 */