X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Ftcpip.c;h=62a6a5efe268847d9b6baf8856eaa8f77e4e8558;hp=36cc696551b5af4acf6ef7a963757829826d993d;hb=bf7ee634e855d15e955d06e7b225d2045abd518a;hpb=c03149b852e2937bd0637b21c3058a48dd25a739 diff --git a/comstack/tcpip.c b/comstack/tcpip.c index 36cc696..62a6a5e 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -1,10 +1,30 @@ /* - * Copyright (c) 1995-1998, Index Data + * Copyright (c) 1995-1999, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: tcpip.c,v $ - * Revision 1.23 1998-06-23 15:37:50 adam + * 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 + * Added braces to avoid warning. + * + * Revision 1.24 1998/06/29 07:59:17 adam + * Minor fix. + * + * Revision 1.23 1998/06/23 15:37:50 adam * Added type cast to prevent warning. * * Revision 1.22 1998/06/22 11:32:36 adam @@ -144,7 +164,7 @@ #include #include #include -#ifndef WINDOWS +#ifndef WIN32 #include #endif #include @@ -152,10 +172,10 @@ #include #include +#include -/* Chas added the following 2, so we get the definition of completeBER */ +/* 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); @@ -172,14 +192,6 @@ COMSTACK tcpip_accept(COMSTACK h); char *tcpip_addrstr(COMSTACK h); void *tcpip_straddr(COMSTACK h, const char *str); -/* - * Determine length/completeness of incoming packages - */ -/* Chas: Removed the definition of completeBERfrom here, use the one in the */ -/* include directory as that as the extern "C" around it */ -/*int completeBER(unsigned char *buf, int len); */ /* from the ODR module */ -int completeWAIS(unsigned char *buf, int len); /* from waislen.c */ - #undef TRACE_TCPIP #ifdef TRACE_TCPIP #define TRC(x) x @@ -195,12 +207,12 @@ typedef struct tcpip_state int written; /* -1 if we aren't writing */ int towrite; /* to verify against user input */ - int (*complete)(unsigned char *buf, int len); /* length/completeness */ + int (*complete)(const unsigned char *buf, int len); /* length/comple. */ struct sockaddr_in addr; /* returned by cs_straddr */ char buf[128]; /* returned by cs_addrstr */ } tcpip_state; -#ifdef WINDOWS +#ifdef WIN32 static int tcpip_init (void) { static int initialized = 0; @@ -217,8 +229,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 +251,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 +276,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 +318,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]; @@ -369,7 +386,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,12 +410,13 @@ 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; #endif + logf (LOG_LOG, "tcpip_bind"); TRC(fprintf(stderr, "tcpip_bind\n")); if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)) < 0) @@ -420,19 +438,6 @@ 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), void *cd) @@ -448,7 +453,7 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, } if ((h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len)) < 0) { -#ifdef WINDOWS +#ifdef WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) #else if (errno == EWOULDBLOCK) @@ -463,16 +468,17 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_in)); else if (addrlen) *addrlen = 0; - -#if 1 - 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; - close (h->newfd); +#ifdef WIN32 + closesocket(h->newfd); +#else + close(h->newfd); +#endif return -1; } -#endif h->state = CS_INCON; return 0; } @@ -481,7 +487,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 @@ -498,12 +504,13 @@ COMSTACK tcpip_accept(COMSTACK h) } 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; 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) @@ -556,18 +563,25 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2))) 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) -#endif + || errno == EINPROGRESS #endif - break; - else + ) + break; + else if (errno == 0) + continue; + else return -1; +#endif + } if (!res) return 0; hasread += res; @@ -624,7 +638,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) @@ -651,7 +665,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);