]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
include/compat: Add win32 compatibility layer
authorLucian Petrut <lpetrut@cloudbasesolutions.com>
Tue, 8 Oct 2019 10:49:31 +0000 (13:49 +0300)
committerLucian Petrut <lpetrut@cloudbasesolutions.com>
Thu, 4 Jun 2020 15:52:16 +0000 (15:52 +0000)
Windows provides socket and other related structures that are mostly
following the Posix standards, but using different headers.

Rather than adding lots of platform checks and require future commits
to do so as well, we're adding headers with the same names, which
in turn include the required Windows headers.

In a few cases, some functions declared by unistd.h are actually
defined by different Windows headers, so we'll need additional includes.

One thing to note here is that boost requires us to include aio.hpp
before the Windows socket headers.

Signed-off-by: Lucian Petrut <lpetrut@cloudbasesolutions.com>
16 files changed:
CMakeLists.txt
src/common/admin_socket_client.cc
src/common/hostname.cc
src/include/compat.h
src/include/win32/arpa/inet.h [new file with mode: 0644]
src/include/win32/netdb.h [new file with mode: 0644]
src/include/win32/netinet/in.h [new file with mode: 0644]
src/include/win32/netinet/ip.h [new file with mode: 0644]
src/include/win32/netinet/tcp.h [new file with mode: 0644]
src/include/win32/poll.h [new file with mode: 0644]
src/include/win32/sys/errno.h [new file with mode: 0644]
src/include/win32/sys/select.h [new file with mode: 0644]
src/include/win32/sys/socket.h [new file with mode: 0644]
src/include/win32/sys/un.h [new file with mode: 0644]
src/include/win32/winsock_compat.h [new file with mode: 0644]
src/include/win32/winsock_wrapper.h [new file with mode: 0644]

index aef81c3e428c145deeb8b29b9da879b9f0e6eb8c..714fa08a3d7ecfa0d714b572362f7d14eae8feaf 100644 (file)
@@ -69,6 +69,13 @@ include_directories(
   ${PROJECT_BINARY_DIR}/src/include
   ${PROJECT_SOURCE_DIR}/src)
 
+if(WIN32)
+  include_directories(
+  ${PROJECT_SOURCE_DIR}/src/include/win32)
+  # Boost complains if winsock2.h (or windows.h) is included before asio.hpp.
+  add_definitions(-include winsock_wrapper.h)
+endif()
+
 if(OFED_PREFIX)
   include_directories(SYSTEM ${OFED_PREFIX}/include)
   link_directories(${OFED_PREFIX}/lib)
index eeb2d1147aad1b6cacd1ff0d34a5ed372a5ecc5e..45ef25ccc1fbba32bd7e41adb867a37f51093ec5 100644 (file)
@@ -16,6 +16,7 @@
 #include <fcntl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <unistd.h>
 
 #include "common/admin_socket.h"
 #include "common/errno.h"
index 879fc93969ee30aed8697d7b425e1935040be7d6..b452a5723727d9b204adfb7f63e0286c070badab 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <unistd.h>
 
+#include "include/compat.h"
+
 std::string ceph_get_hostname()
 {
   // are we in a container?  if so we would prefer the *real* hostname.
index ceb55896a47b4ad31a83d33e13cf079371a71ef4..a7cf55b42ba409efc056d3686aa5738bc68389f0 100644 (file)
@@ -206,6 +206,8 @@ char *ceph_strerror_r(int errnum, char *buf, size_t buflen);
 
 #if defined(_WIN32)
 
+#include "include/win32/winsock_compat.h"
+
 typedef _sigset_t sigset_t;
 
 typedef int uid_t;
diff --git a/src/include/win32/arpa/inet.h b/src/include/win32/arpa/inet.h
new file mode 100644 (file)
index 0000000..44983f0
--- /dev/null
@@ -0,0 +1 @@
+#include "winsock_compat.h"
diff --git a/src/include/win32/netdb.h b/src/include/win32/netdb.h
new file mode 100644 (file)
index 0000000..44983f0
--- /dev/null
@@ -0,0 +1 @@
+#include "winsock_compat.h"
diff --git a/src/include/win32/netinet/in.h b/src/include/win32/netinet/in.h
new file mode 100644 (file)
index 0000000..44983f0
--- /dev/null
@@ -0,0 +1 @@
+#include "winsock_compat.h"
diff --git a/src/include/win32/netinet/ip.h b/src/include/win32/netinet/ip.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/win32/netinet/tcp.h b/src/include/win32/netinet/tcp.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/win32/poll.h b/src/include/win32/poll.h
new file mode 100644 (file)
index 0000000..44983f0
--- /dev/null
@@ -0,0 +1 @@
+#include "winsock_compat.h"
diff --git a/src/include/win32/sys/errno.h b/src/include/win32/sys/errno.h
new file mode 100644 (file)
index 0000000..339f4fc
--- /dev/null
@@ -0,0 +1 @@
+#include <errno.h>
diff --git a/src/include/win32/sys/select.h b/src/include/win32/sys/select.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/win32/sys/socket.h b/src/include/win32/sys/socket.h
new file mode 100644 (file)
index 0000000..44983f0
--- /dev/null
@@ -0,0 +1 @@
+#include "winsock_compat.h"
diff --git a/src/include/win32/sys/un.h b/src/include/win32/sys/un.h
new file mode 100644 (file)
index 0000000..d08940b
--- /dev/null
@@ -0,0 +1 @@
+#include "include/win32/winsock_compat.h"
diff --git a/src/include/win32/winsock_compat.h b/src/include/win32/winsock_compat.h
new file mode 100644 (file)
index 0000000..990cc48
--- /dev/null
@@ -0,0 +1,39 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (c) 2019 SUSE LLC
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#ifndef WINSOCK_COMPAT_H
+#define WINSOCK_COMPAT_H 1
+
+#include "winsock_wrapper.h"
+
+#ifndef poll
+#define poll WSAPoll
+#endif
+
+// afunix.h is available starting with Windows SDK 17063. Still, it wasn't
+// picked up by mingw yet, for which reason we're going to define sockaddr_un
+// here.
+#ifndef _AFUNIX_
+#define UNIX_PATH_MAX 108
+
+typedef struct sockaddr_un
+{
+     ADDRESS_FAMILY sun_family;     /* AF_UNIX */
+     char sun_path[UNIX_PATH_MAX];  /* pathname */
+} SOCKADDR_UN, *PSOCKADDR_UN;
+
+#define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
+#endif /* _AFUNIX */
+
+#endif /* WINSOCK_COMPAT_H */
diff --git a/src/include/win32/winsock_wrapper.h b/src/include/win32/winsock_wrapper.h
new file mode 100644 (file)
index 0000000..1bb951a
--- /dev/null
@@ -0,0 +1,27 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (c) 2020 SUSE LLC
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#ifndef WINSOCK_WRAPPER_H
+#define WINSOCK_WRAPPER_H 1
+
+#ifdef __cplusplus
+// Boost complains if winsock2.h (or windows.h) is included before asio.hpp.
+#include <boost/asio.hpp>
+#endif
+
+#include <winsock2.h>
+#include <ws2ipdef.h>
+#include <ws2tcpip.h>
+
+#endif /* WINSOCK_WRAPPER_H */