X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Ftcpip.c;h=3d69f707a18b2dc64ba89421c4072c275a78d86b;hp=8649a3f764ba4e12bd0cfd587a5d10760d83baeb;hb=3d47aeca3756dc7d1c2ea91f74fef2b0886f76e8;hpb=4d531a1a9131d69c3b6c27fbac42837e22cff61c diff --git a/comstack/tcpip.c b/comstack/tcpip.c index 8649a3f..3d69f70 100644 --- a/comstack/tcpip.c +++ b/comstack/tcpip.c @@ -2,15 +2,18 @@ * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Id: tcpip.c,v 1.53 2003-01-06 08:20:27 adam Exp $ + * $Id: tcpip.c,v 1.58 2003-05-20 20:33:29 adam Exp $ */ #include #include #include -#ifndef WIN32 + +#ifdef WIN32 +#else #include #endif + #include #include #include @@ -22,9 +25,12 @@ #include #include #include +#include -/* Chas added the following, so we get the definition of completeBER */ -#include +#ifdef WIN32 +#else +#include +#endif static int tcpip_close(COMSTACK h); static int tcpip_put(COMSTACK h, char *buf, int size); @@ -176,7 +182,7 @@ COMSTACK tcpip_type(int s, int blocking, int protocol, void *vp) if (protocol == PROTO_WAIS) state->complete = completeWAIS; else - state->complete = completeBER; + state->complete = cs_complete_auto; p->timeout = COMSTACK_DEFAULT_TIMEOUT; TRC(fprintf(stderr, "Created new TCPIP comstack\n")); @@ -219,11 +225,12 @@ COMSTACK ssl_type(int s, int blocking, int protocol, void *vp) } #endif -int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add) +int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add, + int default_port) { struct hostent *hp; char *p, buf[512]; - short int port = 210; + short int port = default_port; unsigned tmpadd; if (!tcpip_init ()) @@ -255,8 +262,12 @@ int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add) void *tcpip_straddr(COMSTACK h, const char *str) { tcpip_state *sp = (tcpip_state *)h->cprivate; + int port = 210; + + if (h->protocol == PROTO_HTTP) + port = 80; - if (!tcpip_strtoaddr_ex (str, &sp->addr)) + if (!tcpip_strtoaddr_ex (str, &sp->addr, port)) return 0; return &sp->addr; } @@ -265,7 +276,7 @@ struct sockaddr_in *tcpip_strtoaddr(const char *str) { static struct sockaddr_in add; - if (!tcpip_strtoaddr_ex (str, &add)) + if (!tcpip_strtoaddr_ex (str, &add, 210)) return 0; return &add; } @@ -292,7 +303,7 @@ int tcpip_connect(COMSTACK h, void *address) int r; #ifdef __sun__ int recbuflen; - socklen_t rbufsize = sizeof(recbuflen); + YAZ_SOCKLEN_T rbufsize = sizeof(recbuflen); #endif TRC(fprintf(stderr, "tcpip_connect\n")); h->io_pending = 0; @@ -361,7 +372,9 @@ int tcpip_connect(COMSTACK h, void *address) */ int tcpip_rcvconnect(COMSTACK h) { +#if HAVE_OPENSSL_SSL_H tcpip_state *sp = (tcpip_state *)h->cprivate; +#endif TRC(fprintf(stderr, "tcpip_rcvconnect\n")); if (h->state == CS_ST_DATAXFER) @@ -408,7 +421,28 @@ int tcpip_rcvconnect(COMSTACK h) #define CERTF "ztest.pem" #define KEYF "ztest.pem" -int tcpip_bind(COMSTACK h, void *address, int mode) +static void tcpip_setsockopt (int fd) +{ +#if 0 + int len = 4096; + int set = 1; + + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int))) + { + yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt TCP_NODELAY"); + } + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int))) + { + yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt SNDBUF"); + } + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int))) + { + yaz_log(LOG_WARN|LOG_ERRNO, "setsockopt RCVBUF"); + } +#endif +} + +static int tcpip_bind(COMSTACK h, void *address, int mode) { struct sockaddr *addr = (struct sockaddr *)address; #ifdef WIN32 @@ -462,6 +496,7 @@ int tcpip_bind(COMSTACK h, void *address, int mode) return -1; } #endif + tcpip_setsockopt(h->iofile); if (bind(h->iofile, addr, sizeof(struct sockaddr_in))) { h->cerrno = CSYSERR; @@ -527,6 +562,7 @@ int tcpip_listen(COMSTACK h, char *raddr, int *addrlen, return -1; } h->state = CS_ST_INCON; + tcpip_setsockopt (h->newfd); return 0; } @@ -690,8 +726,8 @@ int tcpip_get(COMSTACK h, char **buf, int *bufsize) return -1; #ifdef __sun__ yaz_set_errno( 0 ); - // unfortunatly, sun sometimes forgets to set errno in recv - // when EWOULDBLOCK etc. would be required (res = -1) + /* unfortunatly, sun sometimes forgets to set errno in recv + when EWOULDBLOCK etc. would be required (res = -1) */ #endif res = recv(h->iofile, *buf + hasread, CS_TCPIP_BUFCHUNK, 0); TRC(fprintf(stderr, " recv res=%d, hasread=%d\n", res, hasread)); @@ -1022,10 +1058,18 @@ char *tcpip_addrstr(COMSTACK h) r = (char*) host->h_name; else r = inet_ntoa(addr.sin_addr); - sprintf(buf, "tcp:%s", r); + if (h->protocol == PROTO_HTTP) + sprintf(buf, "http:%s", r); + else + sprintf(buf, "tcp:%s", r); #if HAVE_OPENSSL_SSL_H if (sp->ctx) - sprintf(buf, "ssl:%s", r); + { + if (h->protocol == PROTO_HTTP) + sprintf(buf, "https:%s", r); + else + sprintf(buf, "ssl:%s", r); + } #endif return buf; }