* Copyright (c) 1995-2003, Index Data
* See the file LICENSE for details.
*
- * $Id: tcpip.c,v 1.55 2003-02-21 12:08:57 adam Exp $
+ * $Id: tcpip.c,v 1.59 2003-10-08 21:47:15 adam Exp $
*/
#include <stdio.h>
xmalloc(sizeof(tcpip_state)))))
return 0;
+ if (!((p->blocking = blocking)&1))
+ {
#ifdef WIN32
- if (!(p->blocking = blocking) && ioctlsocket(s, FIONBIO, &tru) < 0)
- return 0;
+ if (ioctlsocket(s, FIONBIO, &tru) < 0)
+ return 0;
#else
- if (!(p->blocking = blocking))
- {
if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
return 0;
#ifndef MSG_NOSIGNAL
signal (SIGPIPE, SIG_IGN);
#endif
- }
#endif
+ }
p->io_pending = 0;
p->iofile = s;
}
#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 ())
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;
}
{
static struct sockaddr_in add;
- if (!tcpip_strtoaddr_ex (str, &add))
+ if (!tcpip_strtoaddr_ex (str, &add, 210))
return 0;
return &add;
}
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;
}
return 0;
}
- if (!cnew->blocking &&
+ if (!(cnew->blocking&1) &&
#ifdef WIN32
(ioctlsocket(cnew->iofile, FIONBIO, &tru) < 0)
#else
- (!cnew->blocking && fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
+ (fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
#endif
)
{
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));
{
struct sockaddr_in addr;
tcpip_state *sp = (struct tcpip_state *)h->cprivate;
- char *r, *buf = sp->buf;
+ char *r = 0, *buf = sp->buf;
YAZ_SOCKLEN_T len;
struct hostent *host;
h->cerrno = CSYSERR;
return 0;
}
- if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
+ if (!(h->blocking&2)) {
+ if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
AF_INET)))
- r = (char*) host->h_name;
- else
+ r = (char*) host->h_name;
+ }
+ if (!r)
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;
}
return 0;
#else
flag = fcntl(p->iofile, F_GETFL, 0);
- if(!blocking)
+ if(!(blocking&1))
flag = flag & ~O_NONBLOCK;
else
flag = flag | O_NONBLOCK;