You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2020/07/10 13:58:03 UTC
[qpid-proton] 03/05: PROTON-2077: Get Windows code to build as C99
not C++
This is an automated email from the ASF dual-hosted git repository.
astitcher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
commit 133304af30d66d5409127ed271bdde9d3ee94887
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Fri May 8 18:57:42 2020 -0400
PROTON-2077: Get Windows code to build as C99 not C++
---
c/CMakeLists.txt | 6 +++---
c/src/core/engine-internal.h | 8 +++++++
c/src/core/logger_private.h | 8 +++++++
c/src/core/util.h | 8 +++++++
c/src/platform/platform.h | 8 +++++++
c/src/reactor/io/windows/iocp.c | 22 +++++++++----------
c/src/reactor/io/windows/iocp.h | 5 +++--
c/src/reactor/io/windows/write_pipeline.c | 8 +++----
c/src/ssl/{schannel.c => schannel.cpp} | 3 +++
c/src/ssl/ssl-internal.h | 8 +++++++
c/tools/msgr-common.c | 8 +++----
python/setup.py.in | 35 ++++---------------------------
12 files changed, 72 insertions(+), 55 deletions(-)
diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 13a3b67..57e6843 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -80,7 +80,7 @@ add_custom_target(
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/src/protocol.h ${CMAKE_CURRENT_BINARY_DIR}/src/encodings.h
)
-file (GLOB_RECURSE source_files "src/*.[ch]")
+file (GLOB_RECURSE source_files "src/*.h" "src/*.c" "src/*.cpp")
foreach (sfile ${source_files})
file (RELATIVE_PATH rfile ${CMAKE_CURRENT_SOURCE_DIR} ${sfile})
@@ -118,7 +118,7 @@ if (SSL_IMPL STREQUAL openssl)
set (pn_ssl_impl src/ssl/openssl.c)
set (SSL_LIB OpenSSL::SSL Threads::Threads)
elseif (SSL_IMPL STREQUAL schannel)
- set (pn_ssl_impl src/ssl/schannel.c)
+ set (pn_ssl_impl src/ssl/schannel.cpp)
set (SSL_LIB Crypt32.lib Secur32.lib)
else ()
set (pn_ssl_impl src/ssl/ssl_stub.c)
@@ -226,7 +226,7 @@ set (qpid-proton-layers-all
src/sasl/cyrus_sasl.c
src/sasl/cyrus_stub.c
src/ssl/openssl.c
- src/ssl/schannel.c
+ src/ssl/schannel.cpp
src/ssl/ssl_stub.c
)
diff --git a/c/src/core/engine-internal.h b/c/src/core/engine-internal.h
index 0df2d2f..ba6c051 100644
--- a/c/src/core/engine-internal.h
+++ b/c/src/core/engine-internal.h
@@ -31,6 +31,10 @@
#include "logger_private.h"
#include "util.h"
+#if __cplusplus
+extern "C" {
+#endif
+
typedef enum pn_endpoint_type_t {CONNECTION, SESSION, SENDER, RECEIVER} pn_endpoint_type_t;
typedef struct pn_endpoint_t pn_endpoint_t;
@@ -377,4 +381,8 @@ typedef enum {IN, OUT} pn_dir_t;
void pn_do_trace(pn_transport_t *transport, uint16_t ch, pn_dir_t dir,
pn_data_t *args, const char *payload, size_t size);
+#if __cplusplus
+}
+#endif
+
#endif /* engine-internal.h */
diff --git a/c/src/core/logger_private.h b/c/src/core/logger_private.h
index 9c6231b..12c717d 100644
--- a/c/src/core/logger_private.h
+++ b/c/src/core/logger_private.h
@@ -21,6 +21,10 @@
#include <proton/logger.h>
+#if __cplusplus
+extern "C" {
+#endif
+
struct pn_logger_t {
pn_log_sink_t sink;
intptr_t sink_context;
@@ -56,4 +60,8 @@ void pni_logger_log_data(pn_logger_t *logger, pn_log_subsystem_t subsystem, pn_l
pni_logger_log_data(logger, (pn_log_subsystem_t) (subsys), (pn_log_level_t) (sev), __VA_ARGS__); \
} while(0)
+#if __cplusplus
+}
+#endif
+
#endif
diff --git a/c/src/core/util.h b/c/src/core/util.h
index 9ae62ea..ea049fd 100644
--- a/c/src/core/util.h
+++ b/c/src/core/util.h
@@ -34,6 +34,10 @@
#include <proton/types.h>
#include <proton/object.h>
+#if __cplusplus
+extern "C" {
+#endif
+
ssize_t pn_quote_data(char *dst, size_t capacity, const char *src, size_t size);
int pn_quote(pn_string_t *dst, const char *src, size_t size);
bool pn_env_bool(const char *name);
@@ -119,4 +123,8 @@ static inline pn_bytes_t pn_string_bytes(pn_string_t *s) {
#define pn_min(X,Y) ((X) > (Y) ? (Y) : (X))
#define pn_max(X,Y) ((X) < (Y) ? (Y) : (X))
+#if __cplusplus
+}
+#endif
+
#endif /* util.h */
diff --git a/c/src/platform/platform.h b/c/src/platform/platform.h
index c993bb9..1b83429 100644
--- a/c/src/platform/platform.h
+++ b/c/src/platform/platform.h
@@ -25,6 +25,10 @@
#include "proton/types.h"
#include "proton/error.h"
+#if __cplusplus
+extern "C" {
+#endif
+
/** Get the current PID
*
* @return process id
@@ -87,4 +91,8 @@ int pni_vsnprintf(char *buf, size_t count, const char *fmt, va_list ap);
#endif
#endif
+#if __cplusplus
+}
+#endif
+
#endif /* platform.h */
diff --git a/c/src/reactor/io/windows/iocp.c b/c/src/reactor/io/windows/iocp.c
index 8a1a64a..30f1bce 100644
--- a/c/src/reactor/io/windows/iocp.c
+++ b/c/src/reactor/io/windows/iocp.c
@@ -66,7 +66,7 @@
// all together when accepting the connection. Reserve enough for
// IPv6 addresses, even if the socket is IPv4. The 16 bytes padding
// per address is required by AcceptEx.
-#define IOCP_SOCKADDRMAXLEN (sizeof(sockaddr_in6) + 16)
+#define IOCP_SOCKADDRMAXLEN (sizeof(struct sockaddr_in6) + 16)
#define IOCP_SOCKADDRBUFLEN (2 * IOCP_SOCKADDRMAXLEN)
static void iocp_log(const char *fmt, ...)
@@ -145,9 +145,9 @@ static LPFN_GETACCEPTEXSOCKADDRS lookup_get_accept_ex_sockaddrs(SOCKET s)
// match accept socket to listener socket
static iocpdesc_t *create_same_type_socket(iocpdesc_t *iocpd)
{
- sockaddr_storage sa;
+ struct sockaddr_storage sa;
socklen_t salen = sizeof(sa);
- if (getsockname(iocpd->socket, (sockaddr*)&sa, &salen) == -1)
+ if (getsockname(iocpd->socket, (struct sockaddr*)&sa, &salen) == -1)
return NULL;
SOCKET s = socket(sa.ss_family, SOCK_STREAM, 0); // Currently only work with SOCK_STREAM
if (s == INVALID_SOCKET)
@@ -192,6 +192,7 @@ struct pni_acceptor_t {
LPFN_GETACCEPTEXSOCKADDRS fn_get_accept_ex_sockaddrs;
};
+#define CID_pni_acceptor CID_pn_void
#define pni_acceptor_compare NULL
#define pni_acceptor_inspect NULL
#define pni_acceptor_hashcode NULL
@@ -213,7 +214,6 @@ static void pni_acceptor_finalize(void *object)
static pni_acceptor_t *pni_acceptor(iocpdesc_t *iocpd)
{
- static const pn_cid_t CID_pni_acceptor = CID_pn_void;
static const pn_class_t clazz = PN_CLASS(pni_acceptor);
pni_acceptor_t *acceptor = (pni_acceptor_t *) pn_class_new(&clazz, sizeof(pni_acceptor_t));
acceptor->listen_sock = iocpd;
@@ -289,7 +289,7 @@ static void complete_accept(accept_result_t *result, HRESULT status)
}
}
-pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, sockaddr *addr, socklen_t *addrlen, bool *would_block, pn_error_t *error)
+pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, struct sockaddr *addr, socklen_t *addrlen, bool *would_block, pn_error_t *error)
{
if (!is_listener(ld)) {
set_iocp_error_status(error, PN_ERR, WSAEOPNOTSUPP);
@@ -325,8 +325,8 @@ pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, sockaddr *addr, socklen_t *addrl
setsockopt(accept_sock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&ld->socket,
sizeof (SOCKET));
if (addr && addrlen && *addrlen > 0) {
- sockaddr_storage *local_addr = NULL;
- sockaddr_storage *remote_addr = NULL;
+ struct sockaddr_storage *local_addr = NULL;
+ struct sockaddr_storage *remote_addr = NULL;
int local_addrlen, remote_addrlen;
LPFN_GETACCEPTEXSOCKADDRS fn = ld->acceptor->fn_get_accept_ex_sockaddrs;
fn(result->address_buffer, 0, IOCP_SOCKADDRMAXLEN, IOCP_SOCKADDRMAXLEN,
@@ -358,6 +358,7 @@ typedef struct {
struct addrinfo *addrinfo;
} connect_result_t;
+#define CID_connect_result CID_pn_void
#define connect_result_initialize NULL
#define connect_result_compare NULL
#define connect_result_inspect NULL
@@ -372,7 +373,6 @@ static void connect_result_finalize(void *object)
}
static connect_result_t *connect_result(iocpdesc_t *iocpd, struct addrinfo *addr) {
- static const pn_cid_t CID_connect_result = CID_pn_void;
static const pn_class_t clazz = PN_CLASS(connect_result);
connect_result_t *result = (connect_result_t *) pn_class_new(&clazz, sizeof(connect_result_t));
if (result) {
@@ -389,7 +389,7 @@ pn_socket_t pni_iocp_begin_connect(iocp_t *iocp, pn_socket_t sock, struct addrin
// addr lives for the duration of the async connect. Caller has passed ownership here.
// See connect_result_finalize().
// Use of Windows-specific ConnectEx() requires our socket to be "loosely" pre-bound:
- sockaddr_storage sa;
+ struct sockaddr_storage sa;
memset(&sa, 0, sizeof(sa));
sa.ss_family = addr->ai_family;
if (bind(sock, (SOCKADDR *) &sa, addr->ai_addrlen)) {
@@ -747,13 +747,13 @@ static uintptr_t pni_iocpdesc_hashcode(void *object)
return iocpd->socket;
}
+#define CID_pni_iocpdesc CID_pn_void
#define pni_iocpdesc_compare NULL
#define pni_iocpdesc_inspect NULL
// Reference counted in the iocpdesc map, zombie_list, selector.
static iocpdesc_t *pni_iocpdesc(pn_socket_t s)
{
- static const pn_cid_t CID_pni_iocpdesc = CID_pn_void;
static pn_class_t clazz = PN_CLASS(pni_iocpdesc);
iocpdesc_t *iocpd = (iocpdesc_t *) pn_class_new(&clazz, sizeof(iocpdesc_t));
assert(iocpd);
@@ -1130,6 +1130,7 @@ void pni_iocp_begin_close(iocpdesc_t *iocpd)
// === iocp_t
+#define CID_pni_iocp CID_pn_void
#define pni_iocp_hashcode NULL
#define pni_iocp_compare NULL
#define pni_iocp_inspect NULL
@@ -1172,7 +1173,6 @@ void pni_iocp_finalize(void *obj)
iocp_t *pni_iocp()
{
- static const pn_cid_t CID_pni_iocp = CID_pn_void;
static const pn_class_t clazz = PN_CLASS(pni_iocp);
iocp_t *iocp = (iocp_t *) pn_class_new(&clazz, sizeof(iocp_t));
return iocp;
diff --git a/c/src/reactor/io/windows/iocp.h b/c/src/reactor/io/windows/iocp.h
index 6cf0bc0..d3018e4 100644
--- a/c/src/reactor/io/windows/iocp.h
+++ b/c/src/reactor/io/windows/iocp.h
@@ -30,6 +30,7 @@ typedef struct pni_acceptor_t pni_acceptor_t;
typedef struct write_result_t write_result_t;
typedef struct read_result_t read_result_t;
typedef struct write_pipeline_t write_pipeline_t;
+typedef struct iocp_t iocp_t;
typedef struct iocpdesc_t iocpdesc_t;
@@ -81,7 +82,7 @@ struct iocpdesc_t {
iocpdesc_t *triggered_list_prev;
iocpdesc_t *deadlines_next;
iocpdesc_t *deadlines_prev;
- pn_timestamp_t reap_time;;
+ pn_timestamp_t reap_time;
};
typedef enum { IOCP_ACCEPT, IOCP_CONNECT, IOCP_READ, IOCP_WRITE } iocp_type_t;
@@ -109,7 +110,7 @@ void pni_iocpdesc_start(iocpdesc_t *iocpd);
void pni_iocp_drain_completions(iocp_t *);
int pni_iocp_wait_one(iocp_t *, int timeout, pn_error_t *);
void pni_iocp_start_accepting(iocpdesc_t *iocpd);
-pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, sockaddr *addr, socklen_t *addrlen, bool *would_block, pn_error_t *error);
+pn_socket_t pni_iocp_end_accept(iocpdesc_t *ld, struct sockaddr *addr, socklen_t *addrlen, bool *would_block, pn_error_t *error);
pn_socket_t pni_iocp_begin_connect(iocp_t *, pn_socket_t sock, struct addrinfo *addr, pn_error_t *error);
ssize_t pni_iocp_begin_write(iocpdesc_t *, const void *, size_t, bool *, pn_error_t *);
ssize_t pni_iocp_recv(iocpdesc_t *iocpd, void *buf, size_t size, bool *would_block, pn_error_t *error);
diff --git a/c/src/reactor/io/windows/write_pipeline.c b/c/src/reactor/io/windows/write_pipeline.c
index 238303c..ffe5c20 100644
--- a/c/src/reactor/io/windows/write_pipeline.c
+++ b/c/src/reactor/io/windows/write_pipeline.c
@@ -146,6 +146,7 @@ struct write_pipeline_t {
bool is_writer;
};
+#define CID_write_pipeline CID_pn_void
#define write_pipeline_compare NULL
#define write_pipeline_inspect NULL
#define write_pipeline_hashcode NULL
@@ -169,7 +170,6 @@ static void write_pipeline_finalize(void *object)
write_pipeline_t *pni_write_pipeline(iocpdesc_t *iocpd)
{
- static const pn_cid_t CID_write_pipeline = CID_pn_void;
static const pn_class_t clazz = PN_CLASS(write_pipeline);
write_pipeline_t *pipeline = (write_pipeline_t *) pn_class_new(&clazz, sizeof(write_pipeline_t));
pipeline->iocpd = iocpd;
@@ -205,13 +205,13 @@ static void remove_as_writer(write_pipeline_t *pl)
static void set_depth(write_pipeline_t *pl)
{
pl->depth = 1;
- sockaddr_storage sa;
+ struct sockaddr_storage sa;
socklen_t salen = sizeof(sa);
char buf[INET6_ADDRSTRLEN];
DWORD buflen = sizeof(buf);
- if (getsockname(pl->iocpd->socket,(sockaddr*) &sa, &salen) == 0 &&
- getnameinfo((sockaddr*) &sa, salen, buf, buflen, NULL, 0, NI_NUMERICHOST) == 0) {
+ if (getsockname(pl->iocpd->socket,(struct sockaddr*) &sa, &salen) == 0 &&
+ getnameinfo((struct sockaddr*) &sa, salen, buf, buflen, NULL, 0, NI_NUMERICHOST) == 0) {
if ((sa.ss_family == AF_INET6 && strcmp(buf, "::1")) ||
(sa.ss_family == AF_INET && strncmp(buf, "127.", 4))) {
// not loopback
diff --git a/c/src/ssl/schannel.c b/c/src/ssl/schannel.cpp
similarity index 99%
rename from c/src/ssl/schannel.c
rename to c/src/ssl/schannel.cpp
index 18073f8..845db61 100644
--- a/c/src/ssl/schannel.c
+++ b/c/src/ssl/schannel.cpp
@@ -52,6 +52,7 @@
#include <WinInet.h>
#undef SECURITY_WIN32
+extern "C" {
/** @file
* SSL/TLS support API.
@@ -2340,3 +2341,5 @@ static HRESULT verify_peer(pni_ssl_t *ssl, HCERTSTORE root_store, const char *se
free(nameUCS2);
return error;
}
+
+}
diff --git a/c/src/ssl/ssl-internal.h b/c/src/ssl/ssl-internal.h
index d3205ea..3121e6f 100644
--- a/c/src/ssl/ssl-internal.h
+++ b/c/src/ssl/ssl-internal.h
@@ -30,7 +30,15 @@
*
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
// release the SSL context
void pn_ssl_free(pn_transport_t *transport);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ssl-internal.h */
diff --git a/c/tools/msgr-common.c b/c/tools/msgr-common.c
index 7c43a45..e9c285c 100644
--- a/c/tools/msgr-common.c
+++ b/c/tools/msgr-common.c
@@ -64,7 +64,7 @@ void addresses_free( Addresses_t *a )
int i;
for (i = 0; i < a->count; i++)
if (a->addresses[i]) free( (void *)a->addresses[i] );
- free( a->addresses );
+ free( (void *) a->addresses );
a->addresses = NULL;
}
}
@@ -158,15 +158,15 @@ void parse_password( const char *input, char **password )
}
}
-static int log = 0;
+static int dolog = 0;
void enable_logging()
{
- log = 1;
+ dolog = 1;
}
void LOG( const char *fmt, ... )
{
- if (log) {
+ if (dolog) {
va_list ap;
va_start(ap, fmt);
vfprintf( stdout, fmt, ap );
diff --git a/python/setup.py.in b/python/setup.py.in
index 31fa59e..ab064b4 100644
--- a/python/setup.py.in
+++ b/python/setup.py.in
@@ -40,6 +40,9 @@ From the Python side, this scripts overrides 1 command - build_ext - and it adds
new one. The latter - Configure - is called from the former to setup/discover what's
in the system. The rest of the commands and steps are done normally without any kind
of monkey patching.
+
+TODO: On windows we now only support VS2015 and above and python 3, we should check
+for this and produce an appropriate error if the requirements are not met.
"""
import os
@@ -151,7 +154,7 @@ class Configure(build_ext):
sources.append(os.path.join(proton_src, 'ssl', 'openssl.c'))
elif os.name=='nt':
libraries += ['crypt32', 'secur32']
- sources.append(os.path.join(proton_src, 'ssl', 'schannel.c'))
+ sources.append(os.path.join(proton_src, 'ssl', 'schannel.cpp'))
else:
sources.append(os.path.join(proton_src, 'ssl', 'ssl_stub.c'))
log.warn("OpenSSL not installed - disabling SSL support!")
@@ -183,36 +186,6 @@ class Configure(build_ext):
log.warn("Windows - only the ANONYMOUS and PLAIN mechanisms will be supported!")
sources.append(os.path.join(proton_src, 'sasl', 'cyrus_stub.c'))
- # Hack for Windows/msvc: We need to compile proton as C++, but it seems the only way to
- # force this in setup.py is to use a .cpp extension! So copy all the source files to .cpp
- # and use these as the compile sources
- if self.compiler_type=='msvc':
- targets = []
- target_base = os.path.join(self.build_temp, 'srcs')
- try:
- # Might need to make intermediate directories use os.makedirs() not os.mkdir()
- os.makedirs(target_base)
- except OSError:
- pass
-
- for f in sources:
- # We know each file ends in '.c' as we filtered on that above so just add 'pp' to end
- target = os.path.join(target_base, os.path.basename(f) + 'pp')
- shutil.copy(f, target)
- targets.append(target)
-
- # Copy .h files into temp tree too as we need them to compile
- for root, _, files in os.walk(proton_core_src):
- for file_ in files:
- if file_.endswith('.h'):
- shutil.copy(os.path.join(root, file_), os.path.join(target_base, file_))
-
- # Copy ssl/sasl .h files
- shutil.copy(os.path.join(proton_src, 'sasl', 'sasl-internal.h'), os.path.join(target_base, 'sasl-internal.h'))
- shutil.copy(os.path.join(proton_src, 'ssl', 'ssl-internal.h'), os.path.join(target_base, 'ssl-internal.h'))
-
- sources = targets
-
# compile all the proton sources. We'll add the resulting list of
# objects to the _cproton extension as 'extra objects'. We do this
# instead of just lumping all the sources into the extension to prevent
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org