|
|
@ -2,6 +2,11 @@ |
|
|
|
#include <stdarg.h> |
|
|
|
#include <syslog.h> |
|
|
|
#include <errno.h> |
|
|
|
#ifdef __ANDROID__ |
|
|
|
#include <android/log.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
const char *progname = "tpws"; |
|
|
|
|
|
|
|
int DLOG_FILE(FILE *F, const char *format, va_list args) |
|
|
|
{ |
|
|
@ -25,18 +30,47 @@ int DLOG_FILENAME(const char *filename, const char *format, va_list args) |
|
|
|
return r; |
|
|
|
} |
|
|
|
|
|
|
|
static char syslog_buf[1024]; |
|
|
|
static size_t syslog_buf_sz=0; |
|
|
|
static void syslog_buffered(int priority, const char *format, va_list args) |
|
|
|
typedef void (*f_log_function)(int priority, const char *line); |
|
|
|
|
|
|
|
static char log_buf[1024]; |
|
|
|
static size_t log_buf_sz=0; |
|
|
|
static void syslog_log_function(int priority, const char *line) |
|
|
|
{ |
|
|
|
syslog(priority,"%s",log_buf); |
|
|
|
} |
|
|
|
#ifdef __ANDROID__ |
|
|
|
enum android_LogPriority syslog_priority_to_android(int priority) |
|
|
|
{ |
|
|
|
if (vsnprintf(syslog_buf+syslog_buf_sz,sizeof(syslog_buf)-syslog_buf_sz,format,args)>0) |
|
|
|
enum android_LogPriority ap; |
|
|
|
switch(priority) |
|
|
|
{ |
|
|
|
case LOG_INFO: |
|
|
|
case LOG_NOTICE: ap=ANDROID_LOG_INFO; break; |
|
|
|
case LOG_ERR: ap=ANDROID_LOG_ERROR; break; |
|
|
|
case LOG_WARNING: ap=ANDROID_LOG_WARN; break; |
|
|
|
case LOG_EMERG: |
|
|
|
case LOG_ALERT: |
|
|
|
case LOG_CRIT: ap=ANDROID_LOG_FATAL; break; |
|
|
|
case LOG_DEBUG: ap=ANDROID_LOG_DEBUG; break; |
|
|
|
default: ap=ANDROID_LOG_UNKNOWN; |
|
|
|
} |
|
|
|
return ap; |
|
|
|
} |
|
|
|
static void android_log_function(int priority, const char *line) |
|
|
|
{ |
|
|
|
syslog_buf_sz=strlen(syslog_buf); |
|
|
|
__android_log_print(syslog_priority_to_android(priority), progname, "%s", line); |
|
|
|
} |
|
|
|
#endif |
|
|
|
static void log_buffered(f_log_function log_function, int syslog_priority, const char *format, va_list args) |
|
|
|
{ |
|
|
|
if (vsnprintf(log_buf+log_buf_sz,sizeof(log_buf)-log_buf_sz,format,args)>0) |
|
|
|
{ |
|
|
|
log_buf_sz=strlen(log_buf); |
|
|
|
// log when buffer is full or buffer ends with \n
|
|
|
|
if (syslog_buf_sz>=(sizeof(syslog_buf)-1) || (syslog_buf_sz && syslog_buf[syslog_buf_sz-1]=='\n')) |
|
|
|
if (log_buf_sz>=(sizeof(log_buf)-1) || (log_buf_sz && log_buf[log_buf_sz-1]=='\n')) |
|
|
|
{ |
|
|
|
syslog(priority,"%s",syslog_buf); |
|
|
|
syslog_buf_sz = 0; |
|
|
|
log_function(syslog_priority,log_buf); |
|
|
|
log_buf_sz = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -64,9 +98,16 @@ static int DLOG_VA(const char *format, int syslog_priority, bool condup, int lev |
|
|
|
break; |
|
|
|
case LOG_TARGET_SYSLOG: |
|
|
|
// skip newlines
|
|
|
|
syslog_buffered(syslog_priority,format,args); |
|
|
|
log_buffered(syslog_log_function,syslog_priority,format,args); |
|
|
|
r = 1; |
|
|
|
break; |
|
|
|
#ifdef __ANDROID__ |
|
|
|
case LOG_TARGET_ANDROID: |
|
|
|
// skip newlines
|
|
|
|
log_buffered(android_log_function,syslog_priority,format,args); |
|
|
|
r = 1; |
|
|
|
break; |
|
|
|
#endif |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|