Copy --version support from gnulib-tool to posix-modules.
[gnulib.git] / lib / sys_socket.in.h
index cb84220..c7cd57f 100644 (file)
@@ -27,6 +27,8 @@
 
 #if @HAVE_SYS_SOCKET_H@
 
+@PRAGMA_SYSTEM_HEADER@
+
 /* On many platforms, <sys/socket.h> assumes prior inclusion of
    <sys/types.h>.  */
 # include <sys/types.h>
 
 #else
 
+# ifdef __CYGWIN__
+#  error "Cygwin does have a sys/socket.h, doesn't it?!?"
+# endif
+
 /* A platform that lacks <sys/socket.h>.
 
    Currently only MinGW is supported.  See the gnulib manual regarding
 #  define SHUT_RDWR SD_BOTH
 # endif
 
-# if defined _WIN32 || defined __WIN32__
-#  define ENOTSOCK                WSAENOTSOCK
-#  define EADDRINUSE              WSAEADDRINUSE
-#  define ENETRESET               WSAENETRESET
-#  define ECONNABORTED            WSAECONNABORTED
-#  define ECONNRESET              WSAECONNRESET
-#  define ENOTCONN                WSAENOTCONN
-#  define ESHUTDOWN               WSAESHUTDOWN
-# endif
-
-# if defined _WIN32 || defined __WIN32__
-#  define setsockopt(a,b,c,d,e) setsockopt(a,b,c,(const void*)(d),e)
-# endif
+# if @HAVE_WINSOCK2_H@
+/* Include headers needed by the emulation code.  */
+#  include <sys/types.h>
+#  include <io.h>
+
+typedef int socklen_t;
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using 
+   network sockets.  */
+static inline int
+rpl_fd_isset (int fd, fd_set * set)
+{
+  int i;
+  if (set == NULL)
+    return 0;
+
+  for (i = 0; i < set->fd_count; i++)
+    if (set->fd_array[i] == fd)
+      return 1;
+
+  return 0;
+}
+
+#  undef FD_ISSET
+#  define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+/* Wrap everything else to use libc file descriptors for sockets.  */
+
+#  undef close
+#  define close                        rpl_close
+#  undef socket
+#  define socket               rpl_socket
+#  undef connect
+#  define connect              rpl_connect
+#  undef accept
+#  define accept               rpl_accept
+#  undef bind
+#  define bind                 rpl_bind
+#  undef getpeername
+#  define getpeername          rpl_getpeername
+#  undef getsockname
+#  define getsockname          rpl_getsockname
+#  undef getsockopt
+#  define getsockopt           rpl_getsockopt
+#  undef listen
+#  define listen               rpl_listen
+#  undef ioctl
+#  define ioctl                        rpl_ioctl
+#  undef recv
+#  define recv                 rpl_recv
+#  undef send
+#  define send                 rpl_send
+#  undef recvfrom
+#  define recvfrom             rpl_recvfrom
+#  undef sendto
+#  define sendto               rpl_sendto
+#  undef setsockopt
+#  define setsockopt           rpl_setsockopt
+#  undef select
+#  define select               select_used_without_including_sys_select_h
+
+extern int rpl_close(int);
+extern int rpl_socket (int, int, int protocol);
+extern int rpl_connect (int, struct sockaddr *, int);
+extern int rpl_accept (int, struct sockaddr *, int *);
+extern int rpl_bind (int, struct sockaddr *, int);
+extern int rpl_getpeername (int, struct sockaddr *, int *);
+extern int rpl_getsockname (int, struct sockaddr *, int *);
+extern int rpl_getsockopt (int, int, int, void *, int *);
+extern int rpl_listen (int, int);
+extern int rpl_ioctl (int, unsigned long, char *);
+extern int rpl_recv (int, void *, int, int);
+extern int rpl_send (int, const void *, int, int);
+extern int rpl_recvfrom (int, void *, int, int, struct sockaddr *, int *);
+extern int rpl_sendto (int, const void *, int, int, struct sockaddr *, int);
+extern int rpl_setsockopt (int, int, int, const void *, int);
+
+# endif /* HAVE_WINSOCK2_H */
 
 #endif /* HAVE_SYS_SOCKET_H */