From 672a68219a786157df2b8e2b7ab9310b12115c9f Mon Sep 17 00:00:00 2001
From: Marko Mikulicic <mkm@cesanta.com>
Date: Thu, 3 Mar 2016 14:49:01 +0000
Subject: [PATCH] Fix a few build issues on OSX

    PUBLISHED_FROM=d6e7ab0b45c960a4ca0bcb56cbc26bc05d641374
---
 mongoose.c | 54 +++++++++++++++++++++++++++---------------------------
 mongoose.h | 24 ++++++++++++++++++++----
 2 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index ab0541af8..eb02306d7 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1,6 +1,6 @@
 #include "mongoose.h"
 #ifdef MG_MODULE_LINES
-#line 0 "./src/internal.h"
+#line 1 "./src/internal.h"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -124,7 +124,7 @@ extern void *(*test_calloc)(size_t count, size_t size);
 
 #endif /* MG_INTERNAL_HEADER_INCLUDED */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/base64.c"
+#line 1 "./src/../../common/base64.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -327,7 +327,7 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst) {
 
 #endif /* EXCLUDE_COMMON */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/cs_dbg.c"
+#line 1 "./src/../../common/cs_dbg.c"
 #endif
 /*
  * Copyright (c) 2014-2016 Cesanta Software Limited
@@ -377,7 +377,7 @@ void cs_log_set_level(enum cs_log_level level) {
 #endif
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/cs_dirent.c"
+#line 1 "./src/../../common/cs_dirent.c"
 #endif
 /*
  * Copyright (c) 2015 Cesanta Software Limited
@@ -515,7 +515,7 @@ int mkdir(const char *path, mode_t mode) {
 /* ISO C requires a translation unit to contain at least one declaration */
 typedef int cs_dirent_dummy;
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/cs_time.c"
+#line 1 "./src/../../common/cs_time.c"
 #endif
 /*
  * Copyright (c) 2014-2016 Cesanta Software Limited
@@ -543,7 +543,7 @@ double cs_time() {
   return now;
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../deps/frozen/frozen.c"
+#line 1 "./src/../deps/frozen/frozen.c"
 #endif
 /*
  * Copyright (c) 2004-2013 Sergey Lyubka <valenok@gmail.com>
@@ -1138,7 +1138,7 @@ int json_emit(char *buf, int buf_len, const char *fmt, ...) {
   return len;
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/md5.c"
+#line 1 "./src/../../common/md5.c"
 #endif
 /*
  * This code implements the MD5 message-digest algorithm.
@@ -1385,7 +1385,7 @@ char *cs_md5(char buf[33], ...) {
 
 #endif /* EXCLUDE_COMMON */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/mbuf.c"
+#line 1 "./src/../../common/mbuf.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -1482,7 +1482,7 @@ void mbuf_remove(struct mbuf *mb, size_t n) {
 
 #endif /* EXCLUDE_COMMON */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/sha1.c"
+#line 1 "./src/../../common/sha1.c"
 #endif
 /* Copyright(c) By Steve Reid <steve@edmweb.com> */
 /* 100% Public Domain */
@@ -1736,7 +1736,7 @@ void cs_hmac_sha1(const unsigned char *key, size_t keylen,
 
 #endif /* EXCLUDE_COMMON */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/../../common/str_util.c"
+#line 1 "./src/../../common/str_util.c"
 #endif
 /*
  * Copyright (c) 2015 Cesanta Software Limited
@@ -2007,7 +2007,7 @@ const char *c_strnstr(const char *s, const char *find, size_t slen) {
 
 #endif /* EXCLUDE_COMMON */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/net.c"
+#line 1 "./src/net.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -3025,7 +3025,7 @@ double mg_time() {
   return cs_time();
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/net_if_socket.c"
+#line 1 "./src/net_if_socket.c"
 #endif
 /*
  * Copyright (c) 2014-2016 Cesanta Software Limited
@@ -3863,7 +3863,7 @@ void mg_if_get_conn_addr(struct mg_connection *nc, int remote,
 
 #endif /* !MG_DISABLE_SOCKET_IF */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/multithreading.c"
+#line 1 "./src/multithreading.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -3932,7 +3932,7 @@ static void spawn_handling_thread(struct mg_connection *nc) {
   mg_socketpair(sp, SOCK_STREAM);
   memset(&dummy, 0, sizeof(dummy));
   c[0] = mg_add_sock(&dummy, sp[0], forwarder_ev_handler);
-  c[1] = mg_add_sock(&dummy, sp[1], (mg_event_handler_t) nc->listener->priv_1);
+  c[1] = mg_add_sock(&dummy, sp[1], nc->listener->priv_1.f);
 
   /* Interlink client connection with c[0] */
   link_conns(c[0], nc);
@@ -3965,12 +3965,12 @@ static void multithreaded_ev_handler(struct mg_connection *c, int ev, void *p) {
 
 void mg_enable_multithreading(struct mg_connection *nc) {
   /* Wrap user event handler into our multithreaded_ev_handler */
-  nc->priv_1 = (void *) nc->handler;
+  nc->priv_1.f = nc->handler;
   nc->handler = multithreaded_ev_handler;
 }
 #endif
 #ifdef MG_MODULE_LINES
-#line 0 "./src/uri.c"
+#line 1 "./src/uri.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -4147,7 +4147,7 @@ int mg_normalize_uri_path(const struct mg_str *in, struct mg_str *out) {
   return 1;
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/http.c"
+#line 1 "./src/http.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -7436,7 +7436,7 @@ void mg_register_http_endpoint(struct mg_connection *nc, const char *uri_path,
 
 #endif /* MG_DISABLE_HTTP */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/util.c"
+#line 1 "./src/util.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -7705,7 +7705,7 @@ void mg_hexdump_connection(struct mg_connection *nc, const char *path,
                                                 MG_SOCK_STRINGIFY_PORT |
                                                 MG_SOCK_STRINGIFY_REMOTE);
   fprintf(
-      fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), nc, src,
+      fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), (void *) nc, src,
       ev == MG_EV_RECV ? "<-" : ev == MG_EV_SEND
                                     ? "->"
                                     : ev == MG_EV_ACCEPT
@@ -7815,7 +7815,7 @@ struct mg_str mg_mk_str(const char *s) {
   return ret;
 }
 #ifdef MG_MODULE_LINES
-#line 0 "./src/json-rpc.c"
+#line 1 "./src/json-rpc.c"
 #endif
 /* Copyright (c) 2014 Cesanta Software Limited */
 /* All rights reserved */
@@ -7976,7 +7976,7 @@ int mg_rpc_parse_reply(const char *buf, int len, struct json_token *toks,
 
 #endif /* MG_DISABLE_JSON_RPC */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/mqtt.c"
+#line 1 "./src/mqtt.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -8277,7 +8277,7 @@ void mg_mqtt_disconnect(struct mg_connection *nc) {
 
 #endif /* MG_DISABLE_MQTT */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/mqtt-broker.c"
+#line 1 "./src/mqtt-broker.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -8450,7 +8450,7 @@ struct mg_mqtt_session *mg_mqtt_next(struct mg_mqtt_broker *brk,
 
 #endif /* MG_ENABLE_MQTT_BROKER */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/dns.c"
+#line 1 "./src/dns.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -8810,7 +8810,7 @@ void mg_set_protocol_dns(struct mg_connection *nc) {
 
 #endif /* MG_DISABLE_DNS */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/dns-server.c"
+#line 1 "./src/dns-server.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -8884,7 +8884,7 @@ int mg_dns_reply_record(struct mg_dns_reply *reply,
 
 #endif /* MG_ENABLE_DNS_SERVER */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/resolv.c"
+#line 1 "./src/resolv.c"
 #endif
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -9143,7 +9143,7 @@ int mg_resolve_async_opt(struct mg_mgr *mgr, const char *name, int query,
 
 #endif /* MG_DISABLE_RESOLVE */
 #ifdef MG_MODULE_LINES
-#line 0 "./src/coap.c"
+#line 1 "./src/coap.c"
 #endif
 /*
  * Copyright (c) 2015 Cesanta Software Limited
@@ -9655,7 +9655,7 @@ uint32_t mg_coap_compose(struct mg_coap_message *cm, struct mbuf *io) {
   }
 
   if (cm->payload.len != 0) {
-    *ptr = 0xFF;
+    *ptr = -1;
     ptr++;
     memcpy(ptr, cm->payload.p, cm->payload.len);
   }
diff --git a/mongoose.h b/mongoose.h
index ae04cba25..ce45389ba 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -286,6 +286,15 @@ struct dirent *readdir(DIR *dir);
 #include <sys/types.h>
 #include <unistd.h>
 
+/*
+ * osx correctly avoids defining strtoll when compiling in strict ansi mode.
+ * We require strtoll, and if your embedded pre-c99 compiler lacks one, please
+ * implement a shim.
+ */
+#if !(defined(__DARWIN_C_LEVEL) && __DARWIN_C_LEVEL >= 200809L)
+long long strtoll(const char *, char **, int);
+#endif
+
 typedef int sock_t;
 #define INVALID_SOCKET (-1)
 #define SIZE_T_FMT "zu"
@@ -1068,10 +1077,17 @@ struct mg_connection {
   void *proto_data;                 /* Protocol-specific data */
   mg_event_handler_t handler;       /* Event handler function */
   void *user_data;                  /* User-specific data */
-  void *priv_1;                     /* Used by mg_enable_multithreading() */
-  void *priv_2;                     /* Used by mg_enable_multithreading() */
-  struct mbuf endpoints;            /* Used by mg_register_http_endpoint */
-  void *mgr_data; /* Implementation-specific event manager's data. */
+  union {
+    void *v;
+    /*
+     * the C standard is fussy about fitting function pointers into
+     * void pointers, since some archs might have fat pointers for functions.
+     */
+    mg_event_handler_t f;
+  } priv_1;              /* Used by mg_enable_multithreading() */
+  void *priv_2;          /* Used by mg_enable_multithreading() */
+  struct mbuf endpoints; /* Used by mg_register_http_endpoint */
+  void *mgr_data;        /* Implementation-specific event manager's data. */
 #ifdef MG_ENABLE_HTTP_STREAMING_MULTIPART
   struct mbuf strm_state; /* Used by multi-part streaming */
 #endif
-- 
GitLab