aboutsummaryrefslogtreecommitdiffstats
path: root/lib/src
diff options
context:
space:
mode:
authorJordan Augé <jordan.auge+fdio@cisco.com>2019-11-12 00:03:08 +0100
committerJordan Augé <jordan.auge+fdio@cisco.com>2019-11-14 17:16:56 +0100
commitfdb523a02680f5aa0727b862f0616ba5f8cb24cf (patch)
tree01fdf30eafde2a6f74edba52890715f55fdd6554 /lib/src
parent4f57ca72e8131e5cfb023b26417b924e774d5e73 (diff)
[HICN-386] Improve API error management in libhicnctrl
Change-Id: I332e74ebcd89798c93de50ae7a20f7af8f59f54c Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
Diffstat (limited to 'lib/src')
-rw-r--r--lib/src/CMakeLists.txt1
-rw-r--r--lib/src/policy.c2
-rw-r--r--lib/src/util/ip_address.c70
-rw-r--r--lib/src/util/log.c178
4 files changed, 211 insertions, 40 deletions
diff --git a/lib/src/CMakeLists.txt b/lib/src/CMakeLists.txt
index d8c7b11e0..f68e7a551 100644
--- a/lib/src/CMakeLists.txt
+++ b/lib/src/CMakeLists.txt
@@ -27,6 +27,7 @@ list(APPEND LIBHICN_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/protocol/ipv6.c
${CMAKE_CURRENT_SOURCE_DIR}/protocol/tcp.c
${CMAKE_CURRENT_SOURCE_DIR}/util/ip_address.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/util/log.c
)
set (COMPILER_DEFINITIONS "-DWITH_MAPME")
diff --git a/lib/src/policy.c b/lib/src/policy.c
index 336249bbb..edbb02bea 100644
--- a/lib/src/policy.c
+++ b/lib/src/policy.c
@@ -49,6 +49,8 @@ policy_tag_state_snprintf(char * s, size_t size, const policy_tag_state_t * tag_
return -1;
rc = snprintf(cur, s + size - cur, "%s%s", (tag_state->disabled == 1) ? "!" : "", policy_state_str[tag_state->state]);
+ if (rc >= s + size - cur)
+ return s + size - cur;
if (rc < 0)
return rc;
cur += rc;
diff --git a/lib/src/util/ip_address.c b/lib/src/util/ip_address.c
index 062ff8c75..2b7c69bb5 100644
--- a/lib/src/util/ip_address.c
+++ b/lib/src/util/ip_address.c
@@ -19,6 +19,7 @@
*/
#include <hicn/util/ip_address.h>
+#include <hicn/util/log.h>
#if __BYTE_ORDER == __LITTLE_ENDIAN
#ifdef __ANDROID__
@@ -110,11 +111,13 @@ ip_address_pton (const char *ip_address_str, ip_address_t * ip_address)
int pton_fd;
int family;
-
family = ip_address_get_family (ip_address_str);
switch (family) {
case AF_INET:
+ ip_address->pad[0] = 0;
+ ip_address->pad[1] = 0;
+ ip_address->pad[2] = 0;
pton_fd = inet_pton (AF_INET, ip_address_str, &ip_address->v4.buffer);
break;
case AF_INET6:
@@ -135,18 +138,26 @@ ip_address_pton (const char *ip_address_str, ip_address_t * ip_address)
int
ip_address_snprintf(char * s, size_t size, const ip_address_t * ip_address, int family)
{
+
const char * rc;
switch(family) {
case AF_INET:
+ if (size <= INET_ADDRSTRLEN)
+ return -1;
rc = inet_ntop (AF_INET, ip_address->v4.buffer, s, INET_ADDRSTRLEN);
- break;
+ if (!rc)
+ return -1;
+ return INET_ADDRSTRLEN;
case AF_INET6:
+ if (size <= INET6_ADDRSTRLEN)
+ return -1;
rc = inet_ntop (AF_INET6, ip_address->v6.buffer, s, INET6_ADDRSTRLEN);
- break;
+ if (!rc)
+ return -1;
+ return INET6_ADDRSTRLEN;
default:
return -1;
}
- return rc ? strlen(rc) : -1;
}
int
@@ -269,9 +280,10 @@ ip_prefix_ntop_short(const ip_prefix_t * ip_prefix, char *dst, size_t size)
}
if (!s)
return -1;
- size_t n = snprintf(dst, size, "%s", ip_s);
-
- return (n > 0 ? 1 : -1);
+ int rc = snprintf(dst, size, "%s", ip_s);
+ if (rc >= size)
+ return size;
+ return rc;
}
int
@@ -291,9 +303,10 @@ ip_prefix_ntop(const ip_prefix_t * ip_prefix, char *dst, size_t size)
}
if (!s)
return -1;
- size_t n = snprintf(dst, size, "%s/%d", ip_s, ip_prefix->len);
-
- return (n > 0 ? 1 : -1);
+ int rc = snprintf(dst, size, "%s/%d", ip_s, ip_prefix->len);
+ if (rc >= size)
+ return size;
+ return rc;
}
int
@@ -361,42 +374,19 @@ int
url_snprintf(char * s, size_t size, int family,
const ip_address_t * ip_address, u16 port)
{
- char * cur = s;
+ char ip_address_s[MAXSZ_IP_ADDRESS];
int rc;
/* Other address are currently not supported */
- if (!IS_VALID_FAMILY(family)) {
+ if (!IS_VALID_FAMILY(family))
return -1;
- }
-
- rc = snprintf(cur, s + size - cur, "inet%c://",
- (family == AF_INET) ? '4' : '6');
- if (rc < 0)
- return rc;
- cur += rc;
- if (size != 0 && cur >= s + size)
- return cur - s;
-
- rc = ip_address_snprintf(cur, s + size - cur, ip_address, family);
- if (rc < 0)
- return rc;
- cur += rc;
- if (size != 0 && cur >= s + size)
- return cur - s;
-
- rc = snprintf(cur, s + size - cur, ":");
- if (rc < 0)
- return rc;
- cur += rc;
- if (size != 0 && cur >= s + size)
- return cur - s;
- rc = snprintf(cur, s + size - cur, "%d", port);
+ rc = ip_address_snprintf(ip_address_s, MAXSZ_IP_ADDRESS, ip_address, family);
+ if (rc >= MAXSZ_IP_ADDRESS)
+ WARN("[url_snprintf] Unexpected ip_address truncation");
if (rc < 0)
return rc;
- cur += rc;
- if (size != 0 && cur >= s + size)
- return cur - s;
- return cur - s;
+ return snprintf(s, size, "inet%c://%s:%d", (family == AF_INET) ? '4' : '6',
+ ip_address_s, port);
}
diff --git a/lib/src/util/log.c b/lib/src/util/log.c
new file mode 100644
index 000000000..c1fc999ad
--- /dev/null
+++ b/lib/src/util/log.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2017-2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <hicn/util/log.h>
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+
+log_conf_t log_conf = DEFAULT_LOG_CONF;
+
+#define FMT_DATETIME "%02d-%02d-%04d %02d:%02d:%02d"
+#define FMT_DATETIME_LEN 20
+#define snprintf_nowarn(...) (snprintf(__VA_ARGS__) < 0 ? abort() : (void)0)
+
+
+static char ts[FMT_DATETIME_LEN];
+
+static char *timestamp(void)
+{
+ time_t tv;
+ struct tm *tm;
+
+ time(&tv);
+ tm = localtime(&tv);
+
+ snprintf_nowarn(ts, FMT_DATETIME_LEN, FMT_DATETIME, tm->tm_mday,
+ tm->tm_mon + 1, tm->tm_year + 1900, tm->tm_hour, tm->tm_min,
+ tm->tm_sec);
+ return ts;
+}
+
+void _log_va(int level, const char *fmt, va_list ap)
+{
+
+#if 0
+ if (!conf.log_system)
+ return;
+#endif
+
+ char *prefix;
+
+#ifdef __ANDROID__
+ int prio = -1;
+ if (level > log_conf.log_level)
+ return;
+
+ switch (level) {
+ case LOG_FATAL:
+ prio = ANDROID_LOG_FATAL;
+ prefix = "FATAL: ";
+ break;
+ case LOG_ERROR:
+ prio = ANDROID_LOG_ERROR;
+ prefix = "ERROR: ";
+ break;
+ case LOG_WARN:
+ prio = ANDROID_LOG_WARN;
+ prefix = "WARNING: ";
+ break;
+ case LOG_INFO:
+ prio = ANDROID_LOG_INFO;
+ prefix = "";
+ break;
+ case LOG_DEBUG:
+ prio = ANDROID_LOG_DEBUG;
+ prefix = "DEBUG: ";
+ break;
+ case LOG_TRACE:
+ prio = ANDROID_LOG_DEBUG;
+ prefix = "TRACE: ";
+ break;
+ default:
+ prio = ANDROID_LOG_INFO;
+ prefix = "";
+ break;
+ }
+
+ if (log_conf.log_file) {
+ FILE *f = log_conf.log_file;
+ fprintf(f, "%s %s", timestamp(), prefix);
+ vfprintf(f, fmt, ap);
+ fprintf(f, "\n");
+ } else {
+ __android_log_vprint(ANDROID_LOG_INFO, "HICN FACEMGR", fmt, ap);
+ }
+
+#else
+
+ if (level > log_conf.log_level)
+ return;
+
+ switch (level) {
+ case LOG_FATAL:
+ prefix = "FATAL: ";
+ break;
+ case LOG_ERROR:
+ prefix = "ERROR: ";
+ break;
+ case LOG_WARN:
+ prefix = "WARNING: ";
+ break;
+ case LOG_INFO:
+ prefix = "";
+ break;
+ case LOG_DEBUG:
+ prefix = "DEBUG: ";
+ break;
+ case LOG_TRACE:
+ prefix = "TRACE: ";
+ break;
+ default:
+ prefix = "";
+ break;
+ }
+ FILE *f = log_conf.log_file ? log_conf.log_file : stdout;
+ fprintf(f, "%s %s", timestamp(), prefix);
+ vfprintf(f, fmt, ap);
+ fprintf(f, "\n");
+#ifdef DEBUG
+ fflush(f);
+#endif
+#endif
+}
+
+void _log(int level, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ _log_va(level, fmt, ap);
+ va_end(ap);
+}
+
+#ifdef HAVE_BACKTRACE
+#include <execinfo.h>
+
+void print_trace(void)
+{
+ void *array[32];
+ size_t size;
+
+ size = backtrace(array, 32);
+ fflush(conf.log_file);
+ backtrace_symbols_fd(array, size, fileno(conf.log_file));
+}
+#endif
+
+void fatal(char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ _log_va(LOG_FATAL, fmt, ap);
+ va_end(ap);
+
+#ifdef HAVE_BACKTRACE
+ print_trace();
+#endif
+
+ exit(200);
+}