From: Adam Dickmeiss Date: Thu, 8 Mar 2001 20:18:55 +0000 (+0000) Subject: Added cs_set_blocking. Patch from Matthew Carey. X-Git-Tag: YAZ.1.8~119 X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=03c1d6e9c2c2c0bb2ee01e38d7f464a311bfe9e9;p=yaz-moved-to-github.git Added cs_set_blocking. Patch from Matthew Carey. --- diff --git a/CHANGELOG b/CHANGELOG index aff4ee6..e94a83e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ Possible compatibility problems with earlier versions marked with '*'. +Added cs_set_blocking to set change blocking mode of a COMSTACK. Thanks +to Matthew Carey. + CCL operator names may be set in field definition files (CCL_bibset). See ccl/bib1 for an example. diff --git a/comstack/tcpip.c b/comstack/tcpip.c index 1d02f4e..6887469 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -1,10 +1,12 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2001, Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * * $Log: tcpip.c,v $ - * Revision 1.36 2001-02-21 13:46:53 adam + * Revision 1.37 2001-03-08 20:18:55 adam + * Added cs_set_blocking. Patch from Matthew Carey. + * + * Revision 1.36 2001/02/21 13:46:53 adam * C++ fixes. * * Revision 1.35 2000/11/27 15:17:40 adam @@ -214,6 +216,7 @@ int tcpip_bind(COMSTACK h, void *address, int mode); int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, int (*check_ip)(void *cd, const char *a, int len, int type), void *cd); +int static tcpip_set_blocking(COMSTACK p, int blocking); #if HAVE_OPENSSL_SSL_H int ssl_get(COMSTACK h, char **buf, int *bufsize); @@ -336,6 +339,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp) p->f_accept = tcpip_accept; p->f_addrstr = tcpip_addrstr; p->f_straddr = tcpip_straddr; + p->f_set_blocking = tcpip_set_blocking; p->state = new_socket ? CS_UNBND : CS_IDLE; /* state of line */ p->event = CS_NONE; @@ -1134,3 +1138,27 @@ char *tcpip_addrstr(COMSTACK h) #endif return buf; } + +int static tcpip_set_blocking(COMSTACK p, int blocking) +{ + unsigned long flag; + + if (p->blocking == blocking) + return 1; + if(blocking) +#ifdef WIN32 + flag = blocking; + if (ioctlsocket(p->iofile, FIONBIO, &flag) < 0) + return 0; +#else + flag = fcntl(p->iofile, F_GETFL, 0); + if(!blocking) + flag = flag & ~O_NONBLOCK; + else + flag = flag | O_NONBLOCK; + if (fcntl(p->iofile, F_SETFL, flag) < 0) + return 0; +#endif + p->blocking = blocking; + return 1; +} diff --git a/include/yaz/comstack.h b/include/yaz/comstack.h index 8abe302..224c8d2 100644 --- a/include/yaz/comstack.h +++ b/include/yaz/comstack.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995-2000, Index Data. + * Copyright (c) 1995-2001, Index Data. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation, in whole or in part, for any purpose, is hereby granted, @@ -23,7 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. * - * $Id: comstack.h,v 1.3 2000-11-23 10:58:32 adam Exp $ + * $Id: comstack.h,v 1.4 2001-03-08 20:18:55 adam Exp $ */ #ifndef COMSTACK_H @@ -111,6 +111,7 @@ struct comstack int (*f_close)(COMSTACK handle); char *(*f_addrstr)(COMSTACK handle); void *(*f_straddr)(COMSTACK handle, const char *str); + int (*f_set_blocking)(COMSTACK handle, int blocking); }; #define cs_put(handle, buf, size) ((*(handle)->f_put)(handle, buf, size)) @@ -136,6 +137,7 @@ struct comstack #define cs_straddr(handle, str) ((*(handle)->f_straddr)(handle, str)) #define cs_want_read(handle) ((handle)->io_pending & CS_WANT_READ) #define cs_want_write(handle) ((handle)->io_pending & CS_WANT_WRITE) +#define cs_set_blocking(handle,blocking) ((handle)->f_set_blocking(handle, blocking) #define CS_WANT_READ 1 #define CS_WANT_WRITE 2