* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: tcpip.c,v 1.17 2005-07-19 12:40:52 mike Exp $
+ * $Id: tcpip.c,v 1.22 2006-08-30 12:55:12 adam Exp $
*/
/**
* \file tcpip.c
p->f_addrstr = tcpip_addrstr;
p->f_straddr = tcpip_straddr;
p->f_set_blocking = tcpip_set_blocking;
+ p->max_recv_bytes = 5000000;
p->state = new_socket ? CS_ST_UNBND : CS_ST_IDLE; /* state of line */
p->event = CS_NONE;
int default_port)
{
struct hostent *hp;
+#if HAVE_GETHOSTBYNAME_R
+ struct hostent h;
+ char hbuf[1024];
+ int h_error;
+#endif
char *p, buf[512];
short int port = default_port;
- unsigned tmpadd;
+#ifdef WIN32
+ unsigned long tmpadd;
+#else
+ in_addr_t tmpadd;
+#endif
+
+#ifndef INADDR_NONE
+#define INADDR_NONE -1
+#endif
if (!tcpip_init ())
return 0;
}
add->sin_port = htons(port);
if (!strcmp("@", buf))
+ {
add->sin_addr.s_addr = INADDR_ANY;
+ }
+ else if ((tmpadd = inet_addr(buf)) != INADDR_NONE)
+ {
+ memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+ }
+#if HAVE_GETHOSTBYNAME_R
+ else if (gethostbyname_r(buf, &h, hbuf, sizeof(hbuf), &hp, &h_error) == 0)
+ {
+ memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
+ sizeof(struct in_addr));
+ }
+#else
else if ((hp = gethostbyname(buf)))
+ {
memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
sizeof(struct in_addr));
- else if ((tmpadd = (unsigned) inet_addr(buf)) != 0)
- memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+ }
+#endif
else
return 0;
return 1;
if (sp->ctx_alloc)
{
int res;
- res = SSL_CTX_use_certificate_file (sp->ctx, sp->cert_fname,
- SSL_FILETYPE_PEM);
+ res = SSL_CTX_use_certificate_chain_file(sp->ctx, sp->cert_fname);
if (res <= 0)
{
ERR_print_errors_fp(stderr);
if (!*bufsize)
{
if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
+ {
+ h->cerrno = CSYSERR;
return -1;
+ }
}
else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+ {
+ h->cerrno = CSYSERR;
return -1;
+ }
#ifdef __sun__
yaz_set_errno( 0 );
/* unfortunatly, sun sometimes forgets to set errno in recv
else if (!res)
return hasread;
hasread += res;
+ if (hasread > h->max_recv_bytes)
+ {
+ h->cerrno = CSBUFSIZE;
+ return -1;
+ }
}
TRC (fprintf (stderr, " Out of read loop with hasread=%d, berlen=%d\n",
hasread, berlen));