30 #define close(x) closesocket(x)
33 static char buff[1024];
34 if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, 0, buff,
sizeof(buff), NULL))
36 return strerror(code);
71 #define MIO(m) ((mio_priv_t) m)
72 #define FD(m,f) ((mio_priv_fd_t) f)
73 #define ACT(m,f,a,d) (*(FD(m,f)->app))(m,a,&FD(m,f)->mio_fd,d,FD(m,f)->arg)
80 #define mio_debug if(MIO_DEBUG) _mio_debug
81 static void _mio_debug(
int line,
const char *msgfmt, ...)
85 fprintf(stderr,
"mio.c#%d: ",line);
86 vfprintf(stderr,msgfmt,ap);
102 if (mio_fd == NULL)
return NULL;
106 FD(m,mio_fd)->app = app;
107 FD(m,mio_fd)->arg = arg;
110 #if defined(HAVE_FCNTL)
111 flags = fcntl(fd, F_GETFL);
113 fcntl(fd, F_SETFL, flags);
114 #elif defined(HAVE_IOCTL)
116 ioctl(fd, FIONBIO, &flags);
134 if (
FD(m,fd)->app != NULL)
140 FD(m,fd)->app = NULL;
141 FD(m,fd)->arg = NULL;
153 socklen_t addrlen = (socklen_t)
sizeof(serv_addr);
161 newfd = accept(fd->
fd, (
struct sockaddr*)&serv_addr, &addrlen);
162 if(newfd <= 0)
return;
228 if(retval == 0)
return;
238 mio_debug(
ZONE,
"mio processing %d file descriptors", retval);
244 if (fd == NULL)
continue;
293 if(m == NULL || fd == NULL)
return;
308 if(m == NULL || fd == NULL)
return;
333 if(m == NULL)
return NULL;
337 memset(&sa, 0,
sizeof(sa));
340 if(sourceip != NULL && !
j_inet_pton(sourceip, &sa))
347 if((fd = socket(sa.
ss_family,SOCK_STREAM,0)) < 0)
return NULL;
348 if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (
char*)&flag,
sizeof(flag)) < 0)
return NULL;
359 if(listen(fd, -1) < 0)
386 memset(&sa, 0,
sizeof(sa));
388 if(m == NULL || port <= 0 || hostip == NULL)
return NULL;
390 mio_debug(
ZONE,
"mio connecting to %s, port=%d",hostip,port);
401 if((fd = socket(sa.
ss_family,SOCK_STREAM,0)) < 0)
return NULL;
419 #if defined(HAVE_FCNTL)
420 flags = fcntl(fd, F_GETFL);
422 fcntl(fd, F_SETFL, flags);
423 #elif defined(HAVE_IOCTL)
425 ioctl(fd, FIONBIO, &flags);
440 if(mio_fd != NULL)
return mio_fd;
445 if(flag == -1 && WSAGetLastError() == WSAEWOULDBLOCK)
447 if(flag == -1 && errno == EINPROGRESS)
478 static struct mio_st mio_impl = {
491 if (WSAStartup(MAKEWORD( 1, 1 ), &wsaData))
496 if((m = calloc(1,
sizeof(
struct mio_priv_st))) == NULL) {
497 fprintf(stderr,
"Cannot allocate MIO memory! Exiting.\n");
503 MIO(m)->maxfd = maxfd;