Merge remote-tracking branch 'origin/routing-manager'
[platform/upstream/iotivity.git] / resource / csdk / connectivity / common / src / logger.c
index 318c914..19b01e2 100644 (file)
 // (IEEE Std 1003.1b-1993) specification
 //
 // For this specific file, see use of clock_gettime,
-// Refer http://man7.org/linux/man-pages/man2/clock_gettime.2.html
+// Refer to http://pubs.opengroup.org/stage7tc1/functions/clock_gettime.html
+// and to http://man7.org/linux/man-pages/man2/clock_gettime.2.html
 #ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199309L
+#define _POSIX_C_SOURCE 200809L
 #endif
 
 // Platform check can be extended to check and/or define more, or could be
 // clock_gettime() support.
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
 
-#ifdef  _POSIX_TIMERS
+// if we have unistd.h, we're a Unix system
 #include <time.h>
+#include <sys/time.h>
 #endif
 
 #include "logger.h"
 #ifndef __TIZEN__
 static oic_log_ctx_t *logCtx = 0;
 
+#ifndef __ANDROID__
 static oic_log_level LEVEL_XTABLE[] =
 { OIC_LOG_DEBUG, OIC_LOG_INFO, OIC_LOG_WARNING, OIC_LOG_ERROR, OIC_LOG_FATAL };
+#endif
 
 #endif
 
@@ -71,7 +74,7 @@ static const char *LEVEL[] =
 static android_LogPriority LEVEL[] =
 {   ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
 #endif
-#elif defined __linux__
+#elif defined (__linux__) || defined (__APPLE__)
 static const char *LEVEL[] __attribute__ ((unused)) =
 {   "DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
 #elif defined ARDUINO
@@ -113,7 +116,7 @@ void OICLogInit()
 
 void OICLogShutdown()
 {
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
     if (logCtx && logCtx->destroy)
     {
         logCtx->destroy(logCtx);
@@ -144,7 +147,7 @@ void OICLog(LogLevel level, const char *tag, const char *logStr)
     __android_log_write(LEVEL[level], tag, logStr);
 #endif
 
-#elif defined __linux__
+#elif defined __linux__ || defined __APPLE__
     if (logCtx && logCtx->write_level)
     {
         logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
@@ -152,16 +155,30 @@ void OICLog(LogLevel level, const char *tag, const char *logStr)
     }
     else
     {
-        struct timespec when = {};
         int min = 0;
         int sec = 0;
         int ms = 0;
-        if (!clock_gettime(CLOCK_REALTIME_COARSE, &when))
+#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
+        struct timespec when = { 0, 0 };
+        clockid_t clk = CLOCK_REALTIME;
+#ifdef CLOCK_REALTIME_COARSE
+        clk = CLOCK_REALTIME_COARSE;
+#endif
+        if (!clock_gettime(clk, &when))
         {
             min = (when.tv_sec / 60) % 60;
             sec = when.tv_sec % 60;
             ms = when.tv_nsec / 1000000;
         }
+#else
+        struct timeval now;
+        if (!gettimeofday(&now, NULL))
+        {
+            min = (now.tv_sec / 60) % 60;
+            sec = now.tv_sec % 60;
+            ms = now.tv_usec * 1000;
+        }
+#endif
         printf("%02d:%02d.%03d %s: %s: %s\n", min, sec, ms, LEVEL[level], tag, logStr);
     }
 #endif
@@ -181,8 +198,7 @@ void OICLogv(LogLevel level, const char *tag, const char *format, ...)
     {
         return;
     }
-    char buffer[MAX_LOG_V_BUFFER_SIZE];
-    memset(buffer, 0, sizeof buffer);
+    char buffer[MAX_LOG_V_BUFFER_SIZE] = {};
     va_list args;
     va_start(args, format);
     vsnprintf(buffer, sizeof buffer - 1, format, args);
@@ -205,6 +221,8 @@ void OICLogBuffer(LogLevel level, const char *tag, const uint8_t *buffer, uint16
         return;
     }
 
+    // I've got no idea why static initialization doesn't work here.  It seems that the compiler
+    // seems to think that this is a variable-sized object
     char lineBuffer[LINE_BUFFER_SIZE];
     memset(lineBuffer, 0, sizeof lineBuffer);
     int lineIndex = 0;
@@ -212,7 +230,8 @@ void OICLogBuffer(LogLevel level, const char *tag, const uint8_t *buffer, uint16
     for (i = 0; i < bufferSize; i++)
     {
         // Format the buffer data into a line
-        sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
+        snprintf(&lineBuffer[lineIndex*3], sizeof(lineBuffer)-lineIndex*3, "%02X ", buffer[i]);
+        lineIndex++;
         // Output 16 values per line
         if (((i + 1) % 16) == 0)
         {
@@ -256,7 +275,7 @@ void OICLogInit()
          return;
      }
 
-     char buffer[LINE_BUFFER_SIZE] = {0};
+     char buffer[LINE_BUFFER_SIZE] = {};
      strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
      Serial.print(buffer);
 
@@ -293,8 +312,9 @@ void OICLogInit()
      uint8_t lineIndex = 0;
      for (uint8_t i = 0; i < bufferSize; i++)
      {
-         // Format the buffer data into a line
-         sprintf(&lineBuffer[lineIndex++ * 3], "%02X ", buffer[i]);
+        // Format the buffer data into a line
+        snprintf(&lineBuffer[lineIndex*3], sizeof(lineBuffer)-lineIndex*3, "%02X ", buffer[i]);
+        lineIndex++;
          // Output 16 values per line
          if (((i+1)%16) == 0)
          {
@@ -326,7 +346,7 @@ void OICLog(LogLevel level, PROGMEM const char *tag, const int16_t lineNum,
         return;
     }
     char buffer[LINE_BUFFER_SIZE] = {0};
-    strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
     Serial.print(buffer);
     char c;
     Serial.print(F(": "));
@@ -360,7 +380,7 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum,
     char buffer[LINE_BUFFER_SIZE];
     va_list ap;
     va_start(ap, format);
-    strcpy_P(buffer, (char*)pgm_read_word(&(LEVEL[level])));
+    GET_PROGMEM_BUFFER(buffer, &(LEVEL[level]));
     Serial.print(buffer);
 
     char c;
@@ -373,7 +393,11 @@ void OICLogv(LogLevel level, PROGMEM const char *tag, const int16_t lineNum,
     Serial.print(lineNum);
     Serial.print(F(": "));
 
+#ifdef __AVR__
     vsnprintf_P(buffer, sizeof(buffer), format, ap);
+#else
+    vsnprintf(buffer, sizeof(buffer), format, ap);
+#endif
     for (char *p = &buffer[0]; *p; p++)
     {
         // emulate cooked mode for newlines
@@ -433,5 +457,4 @@ void OICLogv(LogLevel level, const char *tag, const __FlashStringHelper *format,
     va_end(ap);
 }
 
-#endif //ARDUINO
-
+#endif //ARDUINO
\ No newline at end of file