* Sebastian Hammer, Adam Dickmeiss
*
* $Log: tcpip.c,v $
- * Revision 1.11 1996-02-23 10:00:39 quinn
+ * Revision 1.15 1997-05-14 06:53:33 adam
+ * C++ support.
+ *
+ * Revision 1.14 1997/05/01 15:06:32 adam
+ * Moved WINSOCK init. code to tcpip_init routine.
+ *
+ * Revision 1.13 1996/11/01 08:45:18 adam
+ * Bug fix: used close on MS-Windows. Fixed to closesocket.
+ *
+ * Revision 1.12 1996/07/06 19:58:30 quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.11 1996/02/23 10:00:39 quinn
* WAIS Work
*
* Revision 1.10 1996/02/20 12:52:11 quinn
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#ifndef WINDOWS
#include <unistd.h>
+#endif
#include <errno.h>
#include <fcntl.h>
#include <comstack.h>
#include <tcpip.h>
-#ifndef WINDOWS
-#include <sys/time.h>
-#endif
-
int tcpip_close(COMSTACK h);
int tcpip_put(COMSTACK h, char *buf, int size);
int tcpip_get(COMSTACK h, char **buf, int *bufsize);
#define TRC(X)
#endif
-static int initialized = 0;
-
typedef struct tcpip_state
{
char *altbuf; /* alternate buffer for surplus data */
int (*complete)(unsigned char *buf, int len); /* length/completeness */
} tcpip_state;
+#ifdef WINDOWS
+static int tcpip_init (void)
+{
+ static int initialized = 0;
+ if (!initialized)
+ {
+ WORD requested;
+ WSADATA wd;
+
+ requested = MAKEWORD(1, 1);
+ if (WSAStartup(requested, &wd))
+ return 0;
+ initialized = 1;
+ }
+ return 1;
+}
+#else
+static int tcpip_init (void)
+{
+ return 1;
+}
+#endif
/*
* This function is always called through the cs_create() macro.
* s >= 0: socket has already been established for us.
struct protoent *proto;
#endif
- if (!initialized)
- {
-#ifdef WINDOWS
- WORD requested;
- WSADATA wd;
-
- requested = MAKEWORD(1, 1);
- if (WSAStartup(requested, &wd))
- return 0;
-#endif
- initialized = 1;
- }
-
+ if (!tcpip_init ())
+ return 0;
if (s < 0)
{
#ifndef WINDOWS
new_socket = 0;
if (!(p = xmalloc(sizeof(struct comstack))))
return 0;
- if (!(state = p->private = xmalloc(sizeof(tcpip_state))))
+ if (!(state = p->cprivate = xmalloc(sizeof(tcpip_state))))
return 0;
#ifdef WINDOWS
short int port = 210;
unsigned tmpadd;
+ if (!tcpip_init ())
+ return 0;
TRC(fprintf(stderr, "tcpip_strtoaddress: %s\n", str ? str : "NULL"));
add.sin_family = AF_INET;
strcpy(buf, str);
int tcpip_more(COMSTACK h)
{
- tcpip_state *sp = h->private;
+ tcpip_state *sp = h->cprivate;
return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
sp->altlen);
COMSTACK tcpip_accept(COMSTACK h)
{
- COMSTACK new;
- tcpip_state *state, *st = h->private;
+ COMSTACK cnew;
+ tcpip_state *state, *st = h->cprivate;
#ifdef WINDOWS
unsigned long tru = 1;
#endif
h->cerrno = CSOUTSTATE;
return 0;
}
- if (!(new = xmalloc(sizeof(*new))))
+ if (!(cnew = xmalloc(sizeof(*cnew))))
{
h->cerrno = CSYSERR;
return 0;
}
- memcpy(new, h, sizeof(*h));
- new->iofile = h->newfd;
- if (!(state = new->private = xmalloc(sizeof(tcpip_state))))
+ memcpy(cnew, h, sizeof(*h));
+ cnew->iofile = h->newfd;
+ if (!(state = cnew->cprivate = xmalloc(sizeof(tcpip_state))))
{
h->cerrno = CSYSERR;
return 0;
}
#ifdef WINDOWS
- if (!new->blocking && ioctlsocket(new->iofile, FIONBIO, &tru) < 0)
+ if (!cnew->blocking && ioctlsocket(new->iofile, FIONBIO, &tru) < 0)
#else
- if (!new->blocking && fcntl(new->iofile, F_SETFL, O_NONBLOCK) < 0)
+ if (!cnew->blocking && fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
#endif
return 0;
state->altbuf = 0;
state->altsize = state->altlen = 0;
state->towrite = state->written = -1;
state->complete = st->complete;
- new->state = CS_DATAXFER;
+ cnew->state = CS_DATAXFER;
h->state = CS_IDLE;
- return new;
+ return cnew;
}
#define CS_TCPIP_BUFCHUNK 4096
*/
int tcpip_get(COMSTACK h, char **buf, int *bufsize)
{
- tcpip_state *sp = h->private;
+ tcpip_state *sp = h->cprivate;
char *tmpc;
int tmpi, berlen, rest, req, tomove;
int hasread = 0, res;
int tcpip_put(COMSTACK h, char *buf, int size)
{
int res;
- struct tcpip_state *state = h->private;
+ struct tcpip_state *state = h->cprivate;
TRC(fprintf(stderr, "tcpip_put: size=%d\n", size));
if (state->towrite < 0)
int tcpip_close(COMSTACK h)
{
- tcpip_state *sp = h->private;
+ tcpip_state *sp = h->cprivate;
TRC(fprintf(stderr, "tcpip_close\n"));
+#ifdef WINDOWS
+ closesocket(h->iofile);
+#else
close(h->iofile);
+#endif
if (sp->altbuf)
xfree(sp->altbuf);
xfree(sp);