1From 1631a6c1f50e152b8a45d8279c96086e5636795b Mon Sep 17 00:00:00 2001 2From: Christos Tsantilas <christos@chtsanti.net> 3Date: Fri, 25 Jan 2019 06:42:22 -0800 4Subject: [PATCH] Required fixes to compile and run under cygwin 5 6[Retrieved (and backported) from: 7https://github.com/c-icap/c-icap-server/commit/1631a6c1f50e152b8a45d8279c96086e5636795b, 8which has the side effect of fixing the build with the musl C library] 9Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> 10--- 11 Makefile.am | 2 +- 12 configure.ac | 10 +++++++--- 13 header.c | 34 ---------------------------------- 14 include/header.h | 8 -------- 15 modules/Makefile.am | 34 ++++++++++++++++++++-------------- 16 modules/bdb_tables.c | 17 +++++++++++++++-- 17 modules/shared_cache.c | 12 ++++++++++++ 18 modules/sys_logger.c | 13 +++++++++++++ 19 services/echo/Makefile.am | 10 ++++++++-- 20 services/ex-206/Makefile.am | 10 ++++++++-- 21 utils/c-icap-mkbdb.c | 8 ++++---- 22 11 files changed, 88 insertions(+), 70 deletions(-) 23 24diff --git a/Makefile.am b/Makefile.am 25index 4c34033..ab80f4f 100644 26--- a/Makefile.am 27+++ b/Makefile.am 28@@ -53,7 +53,7 @@ c_icap_SOURCES = aserver.c request.c cfg_param.c \ 29 libicapapi_la_CFLAGS= $(INVISIBILITY_CFLAG) -I$(srcdir)/include/ -Iinclude/ @ZLIB_ADD_FLAG@ @OPENSSL_ADD_FLAG@ @BZLIB_ADD_FLAG@ @BROTLI_ADD_FLAG@ @PCRE_ADD_FLAG@ -DCI_BUILD_LIB 30 31 libicapapi_la_LIBADD = @ZLIB_ADD_LDADD@ @BZLIB_ADD_LDADD@ @BROTLI_ADD_LDADD@ @PCRE_ADD_LDADD@ @DL_ADD_FLAG@ @THREADS_LDADD@ @OPENSSL_ADD_LDADD@ 32-libicapapi_la_LDFLAGS= -shared -version-info @CICAPLIB_VERSION@ @THREADS_LDFLAGS@ 33+libicapapi_la_LDFLAGS= -shared -version-info @CICAPLIB_VERSION@ @LIBS_LDFLAGS@ @THREADS_LDFLAGS@ 34 35 export EXT_PROGRAMS_MKLIB = @ZLIB_LNDIR_LDADD@ @BZLIB_LNDIR_LDADD@ @BROTLI_LNDIR_LDADD@ @PCRE_LNDIR_LDADD@ @OPENSSL_LNDIR_LDADD@ 36 37diff --git a/configure.ac b/configure.ac 38index 405571b..8059cb7 100644 39--- a/configure.ac 40+++ b/configure.ac 41@@ -45,12 +45,14 @@ case "$host_os" in 42 CFLAGS="-D_REENTRANT $CFLAGS" 43 THREADS_LDADD="-lpthread" 44 THREADS_LDFLAGS="" 45+ LIBS_LDFLAGS="" 46 ;; 47 solaris2.*) 48 CFLAGS="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS $CFLAGS" 49 LIBS="-lsocket -lnsl -lrt $LIBS" 50 THREADS_LDADD="-lpthread" 51 THREADS_LDFLAGS="" 52+ LIBS_LDFLAGS="" 53 ;; 54 freebsd5*) 55 ## If I understand how all those threading models works correctly 56@@ -69,6 +71,7 @@ case "$host_os" in 57 CFLAGS="-pthread -D_THREAD_SAFE $CFLAGS" 58 THREADS_LDADD="-XCClinker -lc_r" 59 THREADS_LDFLAGS="" 60+ LIBS_LDFLAGS="" 61 ## FreeBSD has pthreads rwlocks from version 3 (I think) 62 # AC_DEFINE(HAVE_PTHREADS_RWLOCK,1,[Define HAVE_PTHREADS_RWLOCK if pthreads library supports rwlocks]) 63 ## 1:1 threads 64@@ -82,24 +85,28 @@ case "$host_os" in 65 CFLAGS="-D_THREAD_SAFE $CFLAGS" 66 THREADS_LDADD="-XCClinker -lthr" 67 THREADS_LDFLAGS="" 68+ LIBS_LDFLAGS="" 69 ;; 70 71 cygwin*) 72 CFLAGS="-D_REENTRANT $CFLAGS" 73 THREADS_LDADD="-lpthread" 74 THREADS_LDFLAGS=""; 75+ LIBS_LDFLAGS="-no-undefined" 76 iscygwin="yes" 77 ;; 78 *) 79 CFLAGS="-D_REENTRANT $CFLAGS" 80 THREADS_LDADD="-lpthread" 81 THREADS_LDFLAGS="" 82+ LIBS_LDFLAGS="" 83 ;; 84 esac 85 86 TEST_LIBS="$TEST_LIBS $THREADS_LDADD" 87 AC_SUBST(THREADS_LDADD) 88 AC_SUBST(THREADS_LDFLAGS) 89+AC_SUBST(LIBS_LDFLAGS) 90 91 AC_DEFINE_UNQUOTED(C_ICAP_CONFIGURE_OPTIONS, "$ac_configure_args", 92 [configure command line used to configure c-icap]) 93@@ -984,9 +991,6 @@ LIBS="$LIBS $EXTRALIBS" 94 95 #Configure common flags 96 MODULES_LIBADD="" 97-if test a"$iscygwin" != a; then 98- MODULES_LIBADD="-L../../ -licapapi" 99-fi 100 MODULES_CFLAGS="$INVISIBILITY_CFLAG -DCI_BUILD_MODULE" 101 AC_SUBST(MODULES_LIBADD) 102 AC_SUBST(MODULES_CFLAGS) 103diff --git a/header.c b/header.c 104index 807a2e0..266b958 100644 105--- a/header.c 106+++ b/header.c 107@@ -110,21 +110,6 @@ const struct ci_error_code ci_error_codes[] = { 108 {505, "Unsupported version"} /*ICAP version not supported by server. */ 109 }; 110 111-/* 112-#ifdef __CYGWIN__ 113-int ci_error_code(int ec){ 114- return (ec >= EC_100 && ec < EC_MAX ? ci_error_codes[ec].code:1000); 115-} 116- 117-const char *unknownerrorcode = "UNKNOWN ERROR CODE"; 118- 119-const char *ci_error_code_string(int ec){ 120- return (ec >= EC_100 && ec < EC_MAX?ci_error_codes[ec].str:unknownerrorcode); 121-} 122-#endif 123-*/ 124- 125- 126 const char *ci_encaps_entities[] = { 127 "req-hdr", 128 "res-hdr", 129@@ -134,25 +119,6 @@ const char *ci_encaps_entities[] = { 130 "opt-body" 131 }; 132 133-#ifdef __CYGWIN__ 134- 135-const char *unknownentity = "UNKNOWN"; 136-const char *unknownmethod = "UNKNOWN"; 137- 138-const char *ci_method_string(int method) 139-{ 140- return (method <= ICAP_RESPMOD 141- && method >= ICAP_OPTIONS ? CI_Methods[method] : unknownmethod); 142-} 143- 144- 145-const char *ci_encaps_entity_string(int e) 146-{ 147- return (e <= ICAP_OPT_BODY 148- && e >= ICAP_REQ_HDR ? CI_EncapsEntities[e] : unknownentity); 149-} 150-#endif 151- 152 ci_headers_list_t *ci_headers_create() 153 { 154 ci_headers_list_t *h; 155diff --git a/include/header.h b/include/header.h 156index 4cab365..ed2de88 100644 157--- a/include/header.h 158+++ b/include/header.h 159@@ -52,16 +52,8 @@ enum ci_encapsulated_entities {ICAP_REQ_HDR, ICAP_RES_HDR, 160 }; 161 CI_DECLARE_DATA extern const char *ci_encaps_entities[]; 162 163-#ifdef __CYGWIN__ 164- 165-const char *ci_encaps_entity_string(int e); 166- 167-#else 168- 169 #define ci_encaps_entity_string(e) (e <= ICAP_OPT_BODY && e >= ICAP_REQ_HDR?ci_encaps_entities[e]:"UNKNOWN") 170 171-#endif 172- 173 /** 174 \typedef ci_headers_list_t 175 \ingroup HEADERS 176diff --git a/modules/Makefile.am b/modules/Makefile.am 177index e6e9270..2d43a60 100644 178--- a/modules/Makefile.am 179+++ b/modules/Makefile.am 180@@ -21,38 +21,44 @@ endif 181 182 AM_CPPFLAGS=-I$(top_srcdir)/ -I$(top_srcdir)/include/ -I$(top_builddir)/include/ 183 184-sys_logger_la_LIBADD = @MODULES_LIBADD@ 185+if ISCYGWIN 186+MODS_LIB_ADD=$(top_builddir)/libicapapi.la 187+else 188+MODS_LIB_ADD= 189+endif 190+ 191+sys_logger_la_LIBADD = $(MODS_LIB_ADD) 192 sys_logger_la_CFLAGS= @MODULES_CFLAGS@ @OPENSSL_ADD_FLAG@ 193-sys_logger_la_LDFLAGS= -module -avoid-version 194+sys_logger_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 195 sys_logger_la_SOURCES = sys_logger.c 196 197-dnsbl_tables_la_LIBADD = @MODULES_LIBADD@ 198+dnsbl_tables_la_LIBADD = $(MODS_LIB_ADD) 199 dnsbl_tables_la_CFLAGS= @MODULES_CFLAGS@ @OPENSSL_ADD_FLAG@ 200-dnsbl_tables_la_LDFLAGS= -module -avoid-version 201+dnsbl_tables_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 202 dnsbl_tables_la_SOURCES = dnsbl_tables.c 203 204-perl_handler_la_LIBADD = @MODULES_LIBADD@ @perllib@ -L@perlcore@ -lperl 205+perl_handler_la_LIBADD = $(MODS_LIB_ADD) @perllib@ -L@perlcore@ -lperl 206 perl_handler_la_CFLAGS= @MODULES_CFLAGS@ @perlccflags@ -I@perlcore@ 207-perl_handler_la_LDFLAGS= -module -avoid-version @perlldflags@ 208+perl_handler_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ @perlldflags@ 209 perl_handler_la_SOURCES = perl_handler.c 210 211 212-bdb_tables_la_LIBADD = @MODULES_LIBADD@ @BDB_ADD_LDADD@ 213+bdb_tables_la_LIBADD = $(MODS_LIB_ADD) @BDB_ADD_LDADD@ 214 bdb_tables_la_CFLAGS= @MODULES_CFLAGS@ @BDB_ADD_FLAG@ 215-bdb_tables_la_LDFLAGS= -module -avoid-version 216+bdb_tables_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 217 bdb_tables_la_SOURCES = bdb_tables.c 218 219-ldap_module_la_LIBADD = @MODULES_LIBADD@ @LDAP_ADD_LDADD@ $(top_builddir)/libicapapi.la 220+ldap_module_la_LIBADD = $(MODS_LIB_ADD) @LDAP_ADD_LDADD@ 221 ldap_module_la_CFLAGS= @MODULES_CFLAGS@ @LDAP_ADD_FLAG@ 222-ldap_module_la_LDFLAGS= -module -avoid-version 223+ldap_module_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 224 ldap_module_la_SOURCES = ldap_module.c 225 226-memcached_cache_la_LIBADD= @MODULES_LIBADD@ @MEMCACHED_ADD_LDADD@ 227+memcached_cache_la_LIBADD= $(MODS_LIB_ADD) @MEMCACHED_ADD_LDADD@ 228 memcached_cache_la_CFLAGS= @MODULES_CFLAGS@ @MEMCACHED_ADD_FLAG@ 229-memcached_cache_la_LDFLAGS= -module -avoid-version 230+memcached_cache_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 231 memcached_cache_la_SOURCES= memcached.c 232 233-shared_cache_la_LIBADD= @MODULES_LIBADD@ 234+shared_cache_la_LIBADD= $(MODS_LIB_ADD) 235 shared_cache_la_CFLAGS= @OPENSSL_ADD_FLAG@ 236-shared_cache_la_LDFLAGS= -module -avoid-version 237+shared_cache_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 238 shared_cache_la_SOURCES= shared_cache.c 239diff --git a/modules/bdb_tables.c b/modules/bdb_tables.c 240index b8459be..1e908a9 100644 241--- a/modules/bdb_tables.c 242+++ b/modules/bdb_tables.c 243@@ -176,8 +176,8 @@ void *bdb_table_open(struct ci_lookup_table *table) 244 245 /*We can not fork a Berkeley DB table, so we have to 246 open bdb tables for every child, on childs start-up procedure*/ 247- register_command_extend("openBDBtable", CHILD_START_CMD, table, 248- command_real_open_table); 249+ ci_command_register_action("openBDBtable", CHILD_START_CMD, table, 250+ command_real_open_table); 251 252 return table->data; 253 } 254@@ -257,3 +257,16 @@ void bdb_table_release_result(struct ci_lookup_table *table,void **val) 255 { 256 ci_buffer_free(val); 257 } 258+ 259+ #ifdef __CYGWIN__ 260+#include <w32api/windows.h> 261+void ci_command_register_action(const char *name, int type, void *data, 262+ void (*command_action) (const char *name, int type, void *data)) 263+ { 264+ typedef void (*RA)(const char *, int, void *, void(*)(const char *, int, void *)); 265+ RA fn; 266+ fn = (RA)GetProcAddress(GetModuleHandle(NULL), "ci_command_register_action"); 267+ if (fn) 268+ (*fn)(name, type, data, command_action); 269+ } 270+#endif 271diff --git a/modules/shared_cache.c b/modules/shared_cache.c 272index 103b760..a79d51a 100644 273--- a/modules/shared_cache.c 274+++ b/modules/shared_cache.c 275@@ -345,3 +345,15 @@ void ci_shared_cache_destroy(struct ci_cache *cache) 276 ci_shared_mem_detach(&data->id); 277 } 278 279+#ifdef __CYGWIN__ 280+#include <w32api/windows.h> 281+void ci_command_register_action(const char *name, int type, void *data, 282+ void (*command_action) (const char *name, int type, void *data)) 283+ { 284+ typedef void (*RA)(const char *, int, void *, void(*)(const char *, int, void *)); 285+ RA fn; 286+ fn = (RA)GetProcAddress(GetModuleHandle(NULL), "ci_command_register_action"); 287+ if (fn) 288+ (*fn)(name, type, data, command_action); 289+ } 290+#endif 291diff --git a/modules/sys_logger.c b/modules/sys_logger.c 292index 1c47753..1764b0d 100644 293--- a/modules/sys_logger.c 294+++ b/modules/sys_logger.c 295@@ -60,7 +60,20 @@ int cfg_syslog_access(const char *directive, const char **argv, void *setdata); 296 functions declared in log.c. This file is not included in c-icap library 297 but defined in primary c-icap binary. 298 */ 299+#ifdef __CYGWIN__ 300+#include <w32api/windows.h> 301+char *logformat_fmt(const char *name) 302+{ 303+ typedef char* (*LF_FMT)(const char *); 304+ LF_FMT fn; 305+ fn = (LF_FMT)GetProcAddress(GetModuleHandle(NULL), "logformat_fmt"); 306+ if (fn) 307+ return (*fn)(name); 308+ return NULL; 309+} 310+#else 311 extern char *logformat_fmt(const char *name); 312+#endif 313 314 /*Configuration Table .....*/ 315 static struct ci_conf_entry conf_variables[] = { 316diff --git a/services/echo/Makefile.am b/services/echo/Makefile.am 317index 402c8f9..7d701b1 100644 318--- a/services/echo/Makefile.am 319+++ b/services/echo/Makefile.am 320@@ -3,9 +3,15 @@ pkglib_LTLIBRARIES=srv_echo.la 321 322 AM_CPPFLAGS=-I$(top_srcdir)/ -I$(top_srcdir)/include/ -I$(top_builddir)/include/ 323 324-srv_echo_la_LIBADD = @MODULES_LIBADD@ 325+if ISCYGWIN 326+MODS_LIB_ADD=$(top_builddir)/libicapapi.la 327+else 328+MODS_LIB_ADD= 329+endif 330+ 331+srv_echo_la_LIBADD = $(MODS_LIB_ADD) 332 srv_echo_la_CFLAGS= @MODULES_CFLAGS@ @OPENSSL_ADD_FLAG@ 333-srv_echo_la_LDFLAGS= -module -avoid-version 334+srv_echo_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 335 srv_echo_la_SOURCES = srv_echo.c 336 337 338diff --git a/services/ex-206/Makefile.am b/services/ex-206/Makefile.am 339index 44bbf21..ff73399 100644 340--- a/services/ex-206/Makefile.am 341+++ b/services/ex-206/Makefile.am 342@@ -3,8 +3,14 @@ pkglib_LTLIBRARIES=srv_ex206.la 343 344 AM_CPPFLAGS=-I$(top_srcdir)/ -I$(top_srcdir)/include/ -I$(top_builddir)/include/ 345 346-srv_ex206_la_LIBADD = @MODULES_LIBADD@ 347+if ISCYGWIN 348+MODS_LIB_ADD=$(top_builddir)/libicapapi.la 349+else 350+MODS_LIB_ADD= 351+endif 352+ 353+srv_ex206_la_LIBADD = $(MODS_LIB_ADD) 354 srv_ex206_la_CFLAGS= @MODULES_CFLAGS@ @OPENSSL_ADD_FLAG@ 355-srv_ex206_la_LDFLAGS= -module -avoid-version 356+srv_ex206_la_LDFLAGS= -module -avoid-version @LIBS_LDFLAGS@ 357 srv_ex206_la_SOURCES = srv_ex206.c 358 359diff --git a/utils/c-icap-mkbdb.c b/utils/c-icap-mkbdb.c 360index c29a46f..326ee1c 100644 361--- a/utils/c-icap-mkbdb.c 362+++ b/utils/c-icap-mkbdb.c 363@@ -23,7 +23,7 @@ char *dbfile = NULL; 364 int DUMP_MODE = 0; 365 int VERSION_MODE = 0; 366 int USE_DBTREE = 0; 367-long int PAGE_SIZE; 368+long int DB_PAGE_SIZE; 369 370 ci_mem_allocator_t *allocator = NULL; 371 int cfg_set_type(const char *directive, const char **argv, void *setdata); 372@@ -52,7 +52,7 @@ static struct ci_options_entry options[] = { 373 "The type of values" 374 }, 375 { 376- "-p", "page_size", &PAGE_SIZE, ci_cfg_size_long, 377+ "-p", "page_size", &DB_PAGE_SIZE, ci_cfg_size_long, 378 "The page size to use for the database" 379 }, 380 { 381@@ -107,8 +107,8 @@ int open_db(char *path) 382 return 0; 383 } 384 385- if (PAGE_SIZE > 512 && PAGE_SIZE <= 64*1024) 386- db->set_pagesize(db, (uint32_t)PAGE_SIZE); 387+ if (DB_PAGE_SIZE > 512 && DB_PAGE_SIZE <= 64*1024) 388+ db->set_pagesize(db, (uint32_t)DB_PAGE_SIZE); 389 390 if ((ret = db->open(db, NULL, path, NULL, 391 (USE_DBTREE ? DB_BTREE : DB_HASH), 392