X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Ftcpip.c;h=b558c88d392d7e812035b049a174e418f94e7efb;hp=c6076b05cee7e742ba02661d79c03fd3e2d32206;hb=59526fbbf2e3b54ce94b3e79e6c7fef9e4f456fb;hpb=8e4eabe621f8b8195faa6625a38a2e1ae7b68aa1 diff --git a/comstack/tcpip.c b/comstack/tcpip.c index c6076b0..b558c88 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -1,10 +1,21 @@ /* - * 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.34 2000-11-23 10:58:32 adam + * Revision 1.38 2001-03-21 12:43:36 adam + * Implemented cs_create_host. Better error reporting for SSL comstack. + * + * 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 + * Using SSLeay_add_all_algorithms instead of OpenSSL_add_all_algorithms. + * + * Revision 1.34 2000/11/23 10:58:32 adam * SSL comstack support. Separate POSIX thread support library. * * Revision 1.33 2000/09/04 08:27:11 adam @@ -208,6 +219,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); @@ -330,6 +342,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; @@ -375,7 +388,7 @@ COMSTACK ssl_type(int s, int blocking, int protocol, void *vp) else { SSL_load_error_strings(); - OpenSSL_add_all_algorithms(); + SSLeay_add_all_algorithms(); state->ctx = state->ctx_alloc = SSL_CTX_new (SSLv23_method()); if (!state->ctx) @@ -484,6 +497,7 @@ int tcpip_connect(COMSTACK h, void *address) return 1; } #endif + h->cerrno = CSYSERR; return -1; } h->state = CS_CONNECTING; @@ -519,6 +533,7 @@ int tcpip_connect(COMSTACK h, void *address) h->io_pending = CS_WANT_WRITE; return 1; } + h->cerrno = CSERRORSSL; return -1; } } @@ -610,7 +625,11 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, void *cd) { struct sockaddr_in addr; +#ifdef __cplusplus + socklen_t len = sizeof(addr); +#else int len = sizeof(addr); +#endif TRC(fprintf(stderr, "tcpip_listen pid=%d\n", getpid())); if (h->state != CS_IDLE) @@ -926,6 +945,7 @@ int ssl_get(COMSTACK h, char **buf, int *bufsize) } if (res == 0) return 0; + h->cerrno = CSERRORSSL; return -1; } hasread += res; @@ -1050,6 +1070,7 @@ int ssl_put(COMSTACK h, char *buf, int size) yaz_log (LOG_LOG, "SSL_write. want_write"); return 1; } + h->cerrno = CSERRORSSL; return -1; } state->written += res; @@ -1124,3 +1145,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; +}