From 7951dac9d57ab16a47cacae7bc0f196617bac94c Mon Sep 17 00:00:00 2001
From: Deomid Ryabkov <rojer@cesanta.com>
Date: Fri, 27 Nov 2015 10:32:36 +0000
Subject: [PATCH] Put getting local/remote address behinf net_if

    PUBLISHED_FROM=f88056e79b632d9eee288dacf61c2f87ff3ceca5
---
 mongoose.c | 116 ++++++++++++++++++++++++++++++++---------------------
 mongoose.h |  12 +++++-
 2 files changed, 81 insertions(+), 47 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index c24e740ec..1c3eba587 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1865,12 +1865,16 @@ MG_INTERNAL void mg_call(struct mg_connection *nc,
        ev_handler == nc->handler ? "user" : "proto", ev, ev_data, nc->flags,
        (int) nc->recv_mbuf.len, (int) nc->send_mbuf.len));
 
-#ifndef MG_DISABLE_FILESYSTEM
+#if !defined(NO_LIBC) && !defined(MG_DISABLE_HEXDUMP)
   /* LCOV_EXCL_START */
   if (nc->mgr->hexdump_file != NULL && ev != MG_EV_POLL &&
       ev != MG_EV_SEND /* handled separately */) {
-    int len = (ev == MG_EV_RECV ? *(int *) ev_data : 0);
-    mg_hexdump_connection(nc, nc->mgr->hexdump_file, len, ev);
+    if (ev == MG_EV_RECV) {
+      mg_hexdump_connection(nc, nc->mgr->hexdump_file, nc->recv_mbuf.buf,
+                            *(int *) ev_data, ev);
+    } else {
+      mg_hexdump_connection(nc, nc->mgr->hexdump_file, NULL, 0, ev);
+    }
   }
 /* LCOV_EXCL_STOP */
 #endif
@@ -2385,9 +2389,9 @@ void mg_send(struct mg_connection *nc, const void *buf, int len) {
   } else {
     mg_if_tcp_send(nc, buf, len);
   }
-#ifndef MG_DISABLE_FILESYSTEM
+#if !defined(NO_LIBC) && !defined(MG_DISABLE_HEXDUMP)
   if (nc->mgr && nc->mgr->hexdump_file != NULL) {
-    mg_hexdump_connection(nc, nc->mgr->hexdump_file, len, MG_EV_SEND);
+    mg_hexdump_connection(nc, nc->mgr->hexdump_file, buf, len, MG_EV_SEND);
   }
 #endif
 }
@@ -3464,23 +3468,32 @@ int mg_socketpair(sock_t sp[2], int sock_type) {
 }
 #endif /* MG_DISABLE_SOCKETPAIR */
 
-void mg_sock_to_str(sock_t sock, char *buf, size_t len, int flags) {
-  union socket_address sa;
+static void mg_sock_get_addr(sock_t sock, int remote,
+                             union socket_address *sa) {
 #ifndef MG_CC3200
   socklen_t slen = sizeof(sa);
-#endif
-
-  memset(&sa, 0, sizeof(sa));
-#ifndef MG_CC3200
-  if (flags & MG_SOCK_STRINGIFY_REMOTE) {
-    getpeername(sock, &sa.sa, &slen);
+  memset(sa, 0, sizeof(*sa));
+  if (remote) {
+    getpeername(sock, &sa->sa, &slen);
   } else {
-    getsockname(sock, &sa.sa, &slen);
+    getsockname(sock, &sa->sa, &slen);
   }
+#else
+  memset(sa, 0, sizeof(*sa));
 #endif
+}
+
+void mg_sock_to_str(sock_t sock, char *buf, size_t len, int flags) {
+  union socket_address sa;
+  mg_sock_get_addr(sock, flags & MG_SOCK_STRINGIFY_REMOTE, &sa);
   mg_sock_addr_to_str(&sa, buf, len, flags);
 }
 
+void mg_if_get_conn_addr(struct mg_connection *nc, int remote,
+                         union socket_address *sa) {
+  mg_sock_get_addr(nc->sock, remote, sa);
+}
+
 #endif /* !MG_DISABLE_SOCKET_IF */
 #ifdef NS_MODULE_LINES
 #line 1 "src/multithreading.c"
@@ -6495,6 +6508,15 @@ void mg_sock_addr_to_str(const union socket_address *sa, char *buf, size_t len,
   }
 }
 
+void mg_conn_addr_to_str(struct mg_connection *nc, char *buf, size_t len,
+                         int flags) {
+  union socket_address sa;
+  memset(&sa, 0, sizeof(sa));
+  mg_if_get_conn_addr(nc, flags & MG_SOCK_STRINGIFY_REMOTE, &sa);
+  mg_sock_addr_to_str(&sa, buf, len, flags);
+}
+
+#ifndef MG_DISABLE_HEXDUMP
 int mg_hexdump(const void *buf, int len, char *dst, int dst_len) {
   const unsigned char *p = (const unsigned char *) buf;
   char ascii[17] = "";
@@ -6516,6 +6538,7 @@ int mg_hexdump(const void *buf, int len, char *dst, int dst_len) {
 
   return n;
 }
+#endif
 
 int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap) {
   va_list ap_copy;
@@ -6553,40 +6576,43 @@ int mg_avprintf(char **buf, size_t size, const char *fmt, va_list ap) {
   return len;
 }
 
-#ifndef MG_DISABLE_FILESYSTEM
+#if !defined(NO_LIBC) && !defined(MG_DISABLE_HEXDUMP)
 void mg_hexdump_connection(struct mg_connection *nc, const char *path,
-                           int num_bytes, int ev) {
-  const struct mbuf *io = ev == MG_EV_SEND ? &nc->send_mbuf : &nc->recv_mbuf;
-  FILE *fp;
-  char *buf, src[60], dst[60];
+                           const void *buf, int num_bytes, int ev) {
+  FILE *fp = NULL;
+  char *hexbuf, src[60], dst[60];
   int buf_size = num_bytes * 5 + 100;
 
-  if ((fp = fopen(path, "a")) != NULL) {
-#ifndef MG_DISABLE_SOCKET_IF
-    mg_sock_to_str(nc->sock, src, sizeof(src), 3);
-    mg_sock_to_str(nc->sock, dst, sizeof(dst), 7);
-#else
-    /* TODO (alashkin): should we request info from net_if? */
-    strcpy(src, "n/a");
-    strcpy(dst, "n/a");
-#endif
-    fprintf(
-        fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), nc, src,
-        ev == MG_EV_RECV ? "<-" : ev == MG_EV_SEND
-                                      ? "->"
-                                      : ev == MG_EV_ACCEPT
-                                            ? "<A"
-                                            : ev == MG_EV_CONNECT ? "C>" : "XX",
-        dst, num_bytes);
-    if (num_bytes > 0 && (buf = (char *) MG_MALLOC(buf_size)) != NULL) {
-      mg_hexdump(io->buf + (ev == MG_EV_SEND ? 0 : io->len) -
-                     (ev == MG_EV_SEND ? 0 : num_bytes),
-                 num_bytes, buf, buf_size);
-      fprintf(fp, "%s", buf);
-      MG_FREE(buf);
-    }
-    fclose(fp);
-  }
+  if (strcmp(path, "-") == 0) {
+    fp = stdout;
+  } else if (strcmp(path, "--") == 0) {
+    fp = stderr;
+#ifndef MG_DISABLE_FILESYSTEM
+  } else {
+    fp = fopen(path, "a");
+#endif
+  }
+  if (fp == NULL) return;
+
+  mg_conn_addr_to_str(nc, src, sizeof(src),
+                      MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT);
+  mg_conn_addr_to_str(nc, dst, sizeof(dst), MG_SOCK_STRINGIFY_IP |
+                                                MG_SOCK_STRINGIFY_PORT |
+                                                MG_SOCK_STRINGIFY_REMOTE);
+  fprintf(
+      fp, "%lu %p %s %s %s %d\n", (unsigned long) time(NULL), nc, src,
+      ev == MG_EV_RECV ? "<-" : ev == MG_EV_SEND
+                                    ? "->"
+                                    : ev == MG_EV_ACCEPT
+                                          ? "<A"
+                                          : ev == MG_EV_CONNECT ? "C>" : "XX",
+      dst, num_bytes);
+  if (num_bytes > 0 && (hexbuf = (char *) MG_MALLOC(buf_size)) != NULL) {
+    mg_hexdump(buf, num_bytes, hexbuf, buf_size);
+    fprintf(fp, "%s", hexbuf);
+    MG_FREE(hexbuf);
+  }
+  if (fp != stdin && fp != stdout) fclose(fp);
 }
 #endif
 
diff --git a/mongoose.h b/mongoose.h
index eae3ecde6..5fa1417c8 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -1117,6 +1117,10 @@ void mg_if_destroy_conn(struct mg_connection *nc);
 
 void mg_close_conn(struct mg_connection *nc);
 
+/* Put connection's address into *sa, local (remote = 0) or remote. */
+void mg_if_get_conn_addr(struct mg_connection *nc, int remote,
+                         union socket_address *sa);
+
 #endif /* MG_NET_IF_HEADER_INCLUDED */
 /*
  * Copyright (c) 2014 Cesanta Software Limited
@@ -1242,7 +1246,7 @@ void mg_set_close_on_exec(sock_t);
 #define MG_SOCK_STRINGIFY_PORT 2
 #define MG_SOCK_STRINGIFY_REMOTE 4
 /*
- * Convert socket's local or remote address into string.
+ * Convert connection's local or remote address into string.
  *
  * The `flags` parameter is a bit mask that controls the behavior,
  * see `MG_SOCK_STRINGIFY_*` definitions.
@@ -1254,7 +1258,11 @@ void mg_set_close_on_exec(sock_t);
  * If both port number and IP address are printed, they are separated by `:`.
  * If compiled with `-DMG_ENABLE_IPV6`, IPv6 addresses are supported.
  */
+void mg_conn_addr_to_str(struct mg_connection *nc, char *buf, size_t len,
+                         int flags);
+#ifndef MG_DISABLE_SOCKET_IF /* Legacy interface. */
 void mg_sock_to_str(sock_t sock, char *buf, size_t len, int flags);
+#endif
 
 /*
  * Convert socket's address into string.
@@ -1282,7 +1290,7 @@ int mg_hexdump(const void *buf, int len, char *dst, int dst_len);
  * event handler.
  */
 void mg_hexdump_connection(struct mg_connection *nc, const char *path,
-                           int num_bytes, int ev);
+                           const void *buf, int num_bytes, int ev);
 /*
  * Print message to buffer. If buffer is large enough to hold the message,
  * return buffer. If buffer is to small, allocate large enough buffer on heap,
-- 
GitLab