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