X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Ftcpip.c;h=62a6a5efe268847d9b6baf8856eaa8f77e4e8558;hp=29960cd625ecd19661a25208a92307278036edd7;hb=bf7ee634e855d15e955d06e7b225d2045abd518a;hpb=21ea17f766bb492a93154ec7b242653fa37dec91 diff --git a/comstack/tcpip.c b/comstack/tcpip.c index 29960cd..62a6a5e 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -4,7 +4,18 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: tcpip.c,v $ - * Revision 1.26 1999-01-08 11:23:14 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 @@ -153,7 +164,7 @@ #include #include #include -#ifndef WINDOWS +#ifndef WIN32 #include #endif #include @@ -161,6 +172,7 @@ #include #include +#include /* Chas added the following, so we get the definition of completeBER */ #include @@ -200,7 +212,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 +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,14 +468,14 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, 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 return -1; } @@ -482,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 @@ -499,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) @@ -558,18 +564,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 +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) @@ -654,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);