--- /dev/null
+/* depend: */
+/* cflags: */
+/* linker: color.o debug.o */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _WIN32 /* Windows */
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else /* Posix */
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+//#include <sys/types.h>
+//#include <sys/socket.h>
+#endif
+
+#include "debug.h"
+
+#include "server.h"
+
+/* types */
+
+#ifdef _WIN32 /* Windows */
+typedef SOCKET socket_t;
+#define PF_INET AF_INET
+#define ERRNO (WSAGetLastError ())
+#else /* Posix */
+typedef int socket_t;
+#define closesocket close
+#define ERRNO errno
+#define INVALID_SOCKET -1
+#define SOCKET_ERROR -1
+#endif
+
+/* constants */
+
+#define BUFFER_SIZE 4096
+
+/* macros */
+
+/* gobal variables */
+
+/* open listening socket */
+
+socket_t open_listening_socket (int port)
+{
+#ifdef _WIN32 /* Windows */
+ WSADATA WSAData;
+ WSAStartup (MAKEWORD(2,0), &WSAData);
+ assert (INVALID_SOCKET == (socket_t)-1);
+ assert (SOCKET_ERROR == (socket_t)-1);
+#endif
+
+ VERBOSE (DEBUG, fprintf (stdout, "Opening socket\n"));
+ socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if ((sock == INVALID_SOCKET) || (sock < 0))
+ return -1;
+
+ struct sockaddr_in addr = {0};
+ addr.sin_family = PF_INET;
+ addr.sin_port = htons (port);
+ addr.sin_addr.s_addr = htonl (INADDR_ANY);
+
+ VERBOSE (DEBUG, fprintf (stdout, "Binding socket\n"));
+ int rc = bind (sock, (struct sockaddr *)&addr, sizeof (addr));
+ if ((rc == SOCKET_ERROR) || (rc < 0)) {
+ VERBOSE (ERROR, fprintf (stderr, "error: %d\n", ERRNO));
+ rc = closesocket (sock);
+ if ((rc == SOCKET_ERROR) || (rc < 0)) {
+ VERBOSE (ERROR, fprintf (stderr, "error: %d\n", ERRNO));
+ }
+ return -1;
+ }
+
+ VERBOSE (DEBUG, fprintf (stdout, "Configuring socket\n"));
+#ifdef _WIN32 /* Windows */
+#else /* Posix */
+ fcntl (sock, F_SETFL, O_NONBLOCK);
+#endif
+ int val = 1;
+ rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val));
+ if (rc < 0) {
+ VERBOSE (ERROR, fprintf (stderr, "%s\n", "setsockopt/TCP_NODELAY"));
+ closesocket (sock);
+ return -1;
+ }
+
+ return sock;
+}
+
+/* close listening socket */
+void close_listening_socket (socket_t sock)
+{
+ closesocket (sock);
+#ifdef _WIN32 /* Windows */
+ WSACleanup ();
+#endif
+}
+
+/* vim: set ts=4 sw=4 et: */