X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Ftcpip.c;h=62a6a5efe268847d9b6baf8856eaa8f77e4e8558;hp=f3efddb440ccbc5e37979ad34605490b5b889482;hb=bf7ee634e855d15e955d06e7b225d2045abd518a;hpb=26fdcc5e41254131ef755b14243c19d202b14d8e diff --git a/comstack/tcpip.c b/comstack/tcpip.c index f3efddb..62a6a5e 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -4,7 +4,14 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: tcpip.c,v $ - * Revision 1.27 1999-02-02 13:57:31 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. * @@ -165,6 +172,7 @@ #include #include +#include /* Chas added the following, so we get the definition of completeBER */ #include @@ -221,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 @@ -237,22 +253,19 @@ COMSTACK tcpip_type(int s, int blocking, int protocol) int new_socket; #ifdef WIN32 unsigned long tru = 1; -#else - struct protoent *proto; #endif if (!tcpip_init ()) return 0; if (s < 0) { -#ifndef WIN32 - 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 @@ -305,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]; @@ -403,6 +416,7 @@ int tcpip_bind(COMSTACK h, void *address, int mode) 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) @@ -424,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) @@ -467,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 WIN32 - closesocket(h->iofile); + closesocket(h->newfd); #else - close(h->iofile); + close(h->newfd); #endif return -1; } @@ -503,7 +504,8 @@ 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; @@ -564,16 +566,21 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) { #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;