X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=comstack%2Ftcpip.c;h=dd9e03b84563147896b5c671af9a6e41b43c0447;hb=f9cb371e2a0eef09e1416fde6f1efd609ef80205;hp=29960cd625ecd19661a25208a92307278036edd7;hpb=21ea17f766bb492a93154ec7b242653fa37dec91;p=yaz-moved-to-github.git diff --git a/comstack/tcpip.c b/comstack/tcpip.c index 29960cd..dd9e03b 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -1,10 +1,35 @@ /* - * Copyright (c) 1995-1999, Index Data + * Copyright (c) 1995-2000, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: tcpip.c,v $ - * Revision 1.26 1999-01-08 11:23:14 adam + * Revision 1.33 2000-09-04 08:27:11 adam + * Work on error handling for tcpip_accept. + * + * Revision 1.32 1999/11/30 13:47:11 adam + * Improved installation. Moved header files to include/yaz. + * + * Revision 1.31 1999/04/29 07:31:23 adam + * Changed tcpip_strtoaddr_ex so that only part 'till '/' is considered + * part of hostname. + * + * Revision 1.30 1999/04/20 09:56:48 adam + * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun). + * Modified all encoders/decoders to reflect this change. + * + * Revision 1.29 1999/04/16 14:45:55 adam + * Added interface for tcpd wrapper for access control. + * + * Revision 1.28 1999/03/31 11:11:14 adam + * Function getprotobyname only called once. Minor change in tcpip_get + * to handle multi-threaded conditions. + * + * Revision 1.27 1999/02/02 13:57:31 adam + * Uses preprocessor define WIN32 instead of WINDOWS to build code + * for Microsoft WIN32. + * + * Revision 1.26 1999/01/08 11:23:14 adam * Added const modifier to some of the BER/ODR encoding routines. * * Revision 1.25 1998/07/07 15:49:23 adam @@ -153,17 +178,18 @@ #include #include #include -#ifndef WINDOWS +#ifndef WIN32 #include #endif #include #include -#include -#include +#include +#include +#include /* Chas added the following, so we get the definition of completeBER */ -#include +#include int tcpip_close(COMSTACK h); int tcpip_put(COMSTACK h, char *buf, int size); @@ -200,7 +226,7 @@ typedef struct tcpip_state char buf[128]; /* returned by cs_addrstr */ } tcpip_state; -#ifdef WINDOWS +#ifdef WIN32 static int tcpip_init (void) { static int initialized = 0; @@ -217,8 +243,16 @@ static int tcpip_init (void) return 1; } #else + +static int proto_number = 0; + static int tcpip_init (void) { + struct protoent *proto; + /* only call getprotobyname once, in case it allocates memory */ + if (!(proto = getprotobyname("tcp"))) + return 0; + proto_number = proto->p_proto; return 1; } #endif @@ -231,24 +265,21 @@ COMSTACK tcpip_type(int s, int blocking, int protocol) COMSTACK p; tcpip_state *state; int new_socket; -#ifdef WINDOWS +#ifdef WIN32 unsigned long tru = 1; -#else - struct protoent *proto; #endif if (!tcpip_init ()) return 0; if (s < 0) { -#ifndef WINDOWS - if (!(proto = getprotobyname("tcp"))) +#ifdef WIN32 + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) return 0; - if ((s = socket(AF_INET, SOCK_STREAM, proto->p_proto)) < 0) #else - if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) -#endif + if ((s = socket(AF_INET, SOCK_STREAM, proto_number)) < 0) return 0; +#endif new_socket = 1; } else @@ -259,7 +290,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol) xmalloc(sizeof(tcpip_state))))) return 0; -#ifdef WINDOWS +#ifdef WIN32 if (!(p->blocking = blocking) && ioctlsocket(s, FIONBIO, &tru) < 0) #else if (!(p->blocking = blocking) && fcntl(s, F_SETFL, O_NONBLOCK) < 0) @@ -301,7 +332,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol) return p; } -static int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add) +int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add) { struct hostent *hp; char *p, buf[512]; @@ -312,7 +343,10 @@ static int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add) return 0; TRC(fprintf(stderr, "tcpip_strtoaddress: %s\n", str ? str : "NULL")); add->sin_family = AF_INET; - strcpy(buf, str); + strncpy(buf, str, 511); + buf[511] = 0; + if ((p = strchr(buf, '/'))) + *p = 0; if ((p = strchr(buf, ':'))) { *p = 0; @@ -369,7 +403,7 @@ int tcpip_connect(COMSTACK h, void *address) TRC(fprintf(stderr, "tcpip_connect\n")); if (connect(h->iofile, (struct sockaddr *) add, sizeof(*add)) < 0) { -#ifdef WINDOWS +#ifdef WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) #else if (errno == EINPROGRESS) @@ -393,7 +427,7 @@ int tcpip_rcvconnect(COMSTACK h) int tcpip_bind(COMSTACK h, void *address, int mode) { struct sockaddr *addr = (struct sockaddr *)address; -#ifdef WINDOWS +#ifdef WIN32 BOOL one = 1; #else unsigned long one = 1; @@ -420,21 +454,8 @@ int tcpip_bind(COMSTACK h, void *address, int mode) return 0; } -#if 0 -void tcpip_get_ip(COMSTACK h, char *ip_buf) -{ - struct tcpip_state *sp = (tcpip_state *)h->cprivate; - const char *ip_addr = (const char *) (&sp->addr->sin_addr.s_addr); - int i; - - for (i = 0; i<4; i++) - TRC (fprintf (stderr, "%u ", ip_addr[i])); - TRC (fprintf (stderr, "\n")); -} -#endif - int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, - int (*check_ip)(void *cd, const char *a, int len, int type), + int (*check_ip)(void *cd, const char *a, int len, int t), void *cd) { struct sockaddr_in addr; @@ -446,32 +467,35 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, h->cerrno = CSOUTSTATE; return -1; } - if ((h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len)) < 0) + h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len); + if (h->newfd < 0) { -#ifdef WINDOWS - if (WSAGetLastError() == WSAEWOULDBLOCK) + if ( +#ifdef WIN32 + WSAGetLastError() == WSAEWOULDBLOCK #else - if (errno == EWOULDBLOCK) + errno == EWOULDBLOCK #endif - - h->cerrno = CSNODATA; - else - h->cerrno = CSYSERR; + ) + h->cerrno = CSNODATA; + else + h->cerrno = CSYSERR; return -1; } - if (addrlen && *addrlen >= sizeof(struct sockaddr_in)) + if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_in)) memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_in)); else if (addrlen) *addrlen = 0; - if (check_ip && (*check_ip)(cd, (const char *) &addr.sin_addr, - sizeof(addr.sin_addr), AF_INET)) + if (check_ip && (*check_ip)(cd, (const char *) &addr, + sizeof(addr), AF_INET)) { h->cerrno = CSDENY; -#ifdef WINDOWS - closesocket(h->iofile); +#ifdef WIN32 + closesocket(h->newfd); #else - close(h->iofile); + close(h->newfd); #endif + h->newfd = -1; return -1; } h->state = CS_INCON; @@ -482,7 +506,7 @@ COMSTACK tcpip_accept(COMSTACK h) { COMSTACK cnew; tcpip_state *state, *st = (tcpip_state *)h->cprivate; -#ifdef WINDOWS +#ifdef WIN32 unsigned long tru = 1; #endif @@ -495,21 +519,52 @@ COMSTACK tcpip_accept(COMSTACK h) if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew)))) { h->cerrno = CSYSERR; +#ifdef WIN32 + closesocket(h->newfd); +#else + close(h->newfd); +#endif + h->newfd = -1; return 0; } memcpy(cnew, h, sizeof(*h)); cnew->iofile = h->newfd; - if (!(state = (tcpip_state *)(cnew->cprivate = xmalloc(sizeof(tcpip_state))))) + if (!(state = (tcpip_state *) + (cnew->cprivate = xmalloc(sizeof(tcpip_state))))) { h->cerrno = CSYSERR; + if (h->newfd != -1) + { +#ifdef WIN32 + closesocket(h->newfd); +#else + close(h->newfd); +#endif + h->newfd = -1; + } return 0; } -#ifdef WINDOWS +#ifdef WIN32 if (!cnew->blocking && ioctlsocket(cnew->iofile, FIONBIO, &tru) < 0) #else if (!cnew->blocking && fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0) #endif + { + h->cerrno = CSYSERR; + if (h->newfd != -1) + { +#ifdef WIN32 + closesocket(h->newfd); +#else + close(h->newfd); +#endif + h->newfd = -1; + } + xfree (cnew); + xfree (state); return 0; + } + h->newfd = -1; state->altbuf = 0; state->altsize = state->altlen = 0; state->towrite = state->written = -1; @@ -558,18 +613,23 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) return -1; if ((res = recv(h->iofile, *buf + hasread, CS_TCPIP_BUFCHUNK, 0)) < 0) { -#ifdef WINDOWS +#ifdef WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) + break; + else + return -1; #else + if (errno == EWOULDBLOCK #ifdef EINPROGRESS - if (errno == EINPROGRESS || errno == EWOULDBLOCK) -#else - if (errno == EWOULDBLOCK) + || errno == EINPROGRESS #endif -#endif - break; - else + ) + break; + else if (errno == 0) + continue; + else return -1; +#endif } if (!res) return 0; @@ -627,7 +687,7 @@ int tcpip_put(COMSTACK h, char *buf, int size) if ((res = send(h->iofile, buf + state->written, size - state->written, 0)) < 0) { -#ifdef WINDOWS +#ifdef WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) #else if (errno == EAGAIN) @@ -654,7 +714,7 @@ int tcpip_close(COMSTACK h) TRC(fprintf(stderr, "tcpip_close\n")); if (h->iofile != -1) -#ifdef WINDOWS +#ifdef WIN32 closesocket(h->iofile); #else close(h->iofile); @@ -671,7 +731,7 @@ char *tcpip_addrstr(COMSTACK h) struct sockaddr_in addr; tcpip_state *sp = (struct tcpip_state *)h->cprivate; char *r, *buf = sp->buf; - int len; + size_t len; struct hostent *host; len = sizeof(addr);