Mesa (master): util: Add simple network functions

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Mon Jun 1 10:44:59 UTC 2009


Module: Mesa
Branch: master
Commit: aee1a6f70413235c0c4c2c2adfca97d5128a155e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=aee1a6f70413235c0c4c2c2adfca97d5128a155e

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Sun Mar 22 04:22:33 2009 +0100

util: Add simple network functions

---

 src/gallium/auxiliary/util/Makefile    |    1 +
 src/gallium/auxiliary/util/SConscript  |    1 +
 src/gallium/auxiliary/util/u_network.c |  188 ++++++++++++++++++++++++++++++++
 src/gallium/auxiliary/util/u_network.h |   24 ++++
 4 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/util/Makefile b/src/gallium/auxiliary/util/Makefile
index 2995aba..6a8eb73 100644
--- a/src/gallium/auxiliary/util/Makefile
+++ b/src/gallium/auxiliary/util/Makefile
@@ -16,6 +16,7 @@ C_SOURCES = \
 	u_hash.c \
 	u_keymap.c \
 	u_linear.c \
+	u_network.c \
 	u_math.c \
 	u_mm.c \
 	u_rect.c \
diff --git a/src/gallium/auxiliary/util/SConscript b/src/gallium/auxiliary/util/SConscript
index d3ac7f7..fb142ee 100644
--- a/src/gallium/auxiliary/util/SConscript
+++ b/src/gallium/auxiliary/util/SConscript
@@ -17,6 +17,7 @@ util = env.ConvenienceLibrary(
 		'u_hash.c',
 		'u_hash_table.c',
 		'u_keymap.c',
+		'u_network.c',
 		'u_math.c',
 		'u_mm.c',
 		'u_rect.c',
diff --git a/src/gallium/auxiliary/util/u_network.c b/src/gallium/auxiliary/util/u_network.c
new file mode 100644
index 0000000..465d502
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_network.c
@@ -0,0 +1,188 @@
+
+#include "pipe/p_compiler.h"
+#include "util/u_network.h"
+#include "util/u_debug.h"
+
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+#  include <windows.h>
+#  include <winsock.h>
+#elif defined(PIPE_OS_LINUX)
+#  include <sys/socket.h>
+#  include <netinet/in.h>
+#  include <unistd.h>
+#  include <fcntl.h>
+#  include <netdb.h>
+#else
+#  warning "No socket implementation"
+#endif
+
+boolean
+u_socket_init()
+{
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+   WORD wVersionRequested;
+   WSADATA wsaData;
+   int err;
+
+   /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
+   wVersionRequested = MAKEWORD(1, 1);
+
+   err = WSAStartup(wVersionRequested, &wsaData);
+   if (err != 0) {
+      debug_printf("WSAStartup failed with error: %d\n", err);
+      return FALSE;
+   }
+   return TRUE;
+#elif defined(PIPE_HAVE_SOCKETS)
+   return TRUE;
+#else
+   return FALSE;
+#endif
+}
+
+void
+u_socket_stop()
+{
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+   WSACleanup();
+#endif
+}
+
+void
+u_socket_close(int s)
+{
+   if (s < 0)
+      return;
+
+#if defined(PIPE_OS_LINUX)
+   shutdown(s, SHUT_RDWR);
+   close(s);
+#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+   shutdown(s, SD_BOTH);
+   closesocket(s);
+#else
+   assert(0);
+#endif
+}
+
+int u_socket_accept(int s)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   return accept(s, NULL, NULL);
+#else
+   return -1;
+#endif
+}
+
+int
+u_socket_send(int s, void *data, size_t size)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   return send(s, data, size, 0);
+#else
+   return -1;
+#endif
+}
+
+int
+u_socket_peek(int s, void *data, size_t size)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   return recv(s, data, size, MSG_PEEK);
+#else
+   return -1;
+#endif
+}
+
+int
+u_socket_recv(int s, void *data, size_t size)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   return recv(s, data, size, 0);
+#else
+   return -1;
+#endif
+}
+
+int
+u_socket_connect(const char *hostname, uint16_t port)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   int s;
+   struct sockaddr_in sa;
+   struct hostent *host = NULL;
+
+   memset(&sa, 0, sizeof(struct sockaddr_in));
+   host = gethostbyname(hostname);
+   if (!host)
+      return -1;
+
+   memcpy((char *)&sa.sin_addr,host->h_addr,host->h_length);
+   sa.sin_family= host->h_addrtype;
+   sa.sin_port = htons(port);
+
+   s = socket(host->h_addrtype, SOCK_STREAM, IPPROTO_TCP);
+   if (s < 0)
+      return -1;
+
+   if (connect(s, (struct sockaddr *)&sa, sizeof(sa))) {
+      u_socket_close(s);
+      return -1;
+   }
+
+   return s;
+#else
+   assert(0);
+   return -1;
+#endif
+}
+
+int
+u_socket_listen_on_port(uint16_t portnum)
+{
+#if defined(PIPE_HAVE_SOCKETS)
+   int s;
+   struct sockaddr_in sa;
+   memset(&sa, 0, sizeof(struct sockaddr_in));
+
+   sa.sin_family = AF_INET;
+   sa.sin_port = htons(portnum);
+
+   s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+   if (s < 0)
+      return -1;
+
+   if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == -1) {
+      u_socket_close(s);
+      return -1;
+   }
+
+   listen(s, 0);
+
+   return s;
+#else
+   assert(0);
+   return -1;
+#endif
+}
+
+void
+u_socket_block(int s, boolean block)
+{
+#if defined(PIPE_OS_LINUX)
+   int old = fcntl(s, F_GETFL, 0);
+   if (old == -1)
+      return;
+
+   /* TODO obey block */
+   if (block)
+      fcntl(s, F_SETFL, old & ~O_NONBLOCK);
+   else
+      fcntl(s, F_SETFL, old | O_NONBLOCK);
+#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+   u_long iMode = block ? 0 : 1;
+   ioctlsocket(s, FIONBIO, &iMode);
+#else
+   assert(0);
+#endif
+}
diff --git a/src/gallium/auxiliary/util/u_network.h b/src/gallium/auxiliary/util/u_network.h
new file mode 100644
index 0000000..14d3884
--- /dev/null
+++ b/src/gallium/auxiliary/util/u_network.h
@@ -0,0 +1,24 @@
+
+#ifndef _U_NETWORK_H_
+#define _U_NETWORK_H_
+
+#include "pipe/p_compiler.h"
+
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+#  define PIPE_HAVE_SOCKETS
+#elif defined(PIPE_OS_LINUX)
+#  define PIPE_HAVE_SOCKETS
+#endif
+
+boolean u_socket_init(void);
+void u_socket_stop(void);
+void u_socket_close(int s);
+int u_socket_listen_on_port(uint16_t portnum);
+int u_socket_accept(int s);
+int u_socket_connect(const char *host, uint16_t port);
+int u_socket_send(int s, void *data, size_t size);
+int u_socket_peek(int s, void *data, size_t size);
+int u_socket_recv(int s, void *data, size_t size);
+void u_socket_block(int s, boolean block);
+
+#endif




More information about the mesa-commit mailing list