summaryrefslogtreecommitdiffstats
path: root/nanohttp/nanohttp-socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'nanohttp/nanohttp-socket.c')
-rw-r--r--nanohttp/nanohttp-socket.c101
1 files changed, 99 insertions, 2 deletions
diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c
index 12aee6f..844a5ef 100644
--- a/nanohttp/nanohttp-socket.c
+++ b/nanohttp/nanohttp-socket.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-socket.c,v 1.12 2004/08/31 13:56:24 rans Exp $
+* $Id: nanohttp-socket.c,v 1.13 2004/08/31 16:34:08 rans Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -27,8 +27,11 @@
#ifdef WIN32
#include "wsockcompat.h"
#include <winsock2.h>
+#include <process.h>
#define close(s) closesocket(s)
typedef int ssize_t;
+#else
+#include <fcntl.h>
#endif
#ifdef HAVE_CONFIG_H
@@ -141,7 +144,7 @@ int hsocket_open(hsocket_t *dsock, const char* hostname, int port)
/*--------------------------------------------------
-FUNCTION: hsocket_close
+FUNCTION: hsocket_bind
----------------------------------------------------*/
int hsocket_bind(hsocket_t *dsock, int port)
{
@@ -175,6 +178,70 @@ int hsocket_bind(hsocket_t *dsock, int port)
return HSOCKET_OK;
}
+#ifdef WIN32
+int hsocket_accept(hsocket_t sock, unsigned ( __stdcall *func )( void * ), conndata_t *conns,
+ int max_conn)
+#else
+int hsocket_accept(hsocket_t sock, void(*func) (void *), conndata_t *conns, int max_conn)
+#endif
+{
+ int i;
+ int err;
+ socklen_t asize;
+ struct sockaddr_in addr;
+
+ asize = sizeof(struct sockaddr_in);
+ while(1)
+ {
+ for (i=0;;i++) {
+ if (i>=max_conn) {
+ Sleep(1000);
+ i=0;
+ continue;
+ }
+ if (conns[i].sock==0) break;
+ }
+ conns[i].sock = accept(sock, (struct sockaddr *)&addr, &asize);
+#ifndef WIN32
+ if (conns[i].sock == -1) {
+ conns[i].sock=0;
+ continue;
+ }
+#else
+ if (conns[i].sock == INVALID_SOCKET)
+ {
+ if(WSAGetLastError()!=WSAEWOULDBLOCK)
+ {
+ log_error1("accept() died... restarting...");
+ closesocket(sock);
+ WSACleanup();
+ return INVALID_SOCKET;
+ }
+ else
+ {
+ conns[i].sock=0;
+ continue;
+ }
+ }
+#endif
+ else
+ {
+ log_verbose3("accept new socket (%d) from '%s'", conns[i].sock,
+ SAVE_STR(((char*)inet_ntoa(addr.sin_addr))) );
+
+#ifdef WIN32
+ conns[i].tid=(HANDLE)_beginthreadex(NULL, 65535, func, &conns[i], 0, &err);
+#else
+ err = pthread_create(&(conns[i].tid), &(conns[i].attr), func, &conns[i]);
+#endif
+ if (err) {
+ log_error2("Error creating thread: ('%d')", err);
+ }
+ }
+ }
+ return 0;
+}
+
/*--------------------------------------------------
FUNCTION: hsocket_listen
----------------------------------------------------*/
@@ -394,3 +461,33 @@ int hbufsocket_read(hbufsocket_t *bufsock, char *buffer, int size)
return HSOCKET_OK;
}
}
+
+int hsocket_makenonblock(hsocket_t sock)
+{
+#ifdef WIN32
+ unsigned long iMode;
+ iMode = HSOCKET_NONBLOCKMODE;
+ if(ioctlsocket(sock, FIONBIO, (u_long FAR*) &iMode) == INVALID_SOCKET)
+ {
+ log_error1("ioctlsocket error");
+ return -1;
+ }
+#else fcntl(sock, F_SETFL, O_NONBLOCK);
+#endif
+ return HSOCKET_OK;
+}
+
+#ifdef WIN32
+
+struct tm *localtime_r(const time_t *const timep, struct tm *p_tm)
+{
+ static struct tm* tmp;
+ tmp = localtime(timep);
+ if (tmp) {
+ memcpy(p_tm, tmp, sizeof(struct tm));
+ tmp = p_tm;
+ }
+ return tmp;
+}
+
+#endif