mirror of
https://github.com/transmission/transmission.git
synced 2026-05-08 09:39:08 +01:00
make all the log functions/structs/enums use a single 'tr_log' namespace, such as tr_logGetQueue, tr_logAddInfo, tr_logIsLevelActive
This commit is contained in:
+9
-258
@@ -56,129 +56,19 @@
|
||||
#include "fdlimit.h"
|
||||
#include "ConvertUTF.h"
|
||||
#include "list.h"
|
||||
#include "log.h"
|
||||
#include "utils.h"
|
||||
#include "platform.h" /* tr_lockLock (), TR_PATH_MAX */
|
||||
#include "variant.h"
|
||||
#include "version.h"
|
||||
|
||||
|
||||
time_t __tr_current_time = 0;
|
||||
tr_msg_level __tr_message_level = TR_MSG_ERR;
|
||||
|
||||
static bool messageQueuing = false;
|
||||
static tr_msg_list * messageQueue = NULL;
|
||||
static tr_msg_list ** messageQueueTail = &messageQueue;
|
||||
static int messageQueueCount = 0;
|
||||
|
||||
#ifndef WIN32
|
||||
/* make null versions of these win32 functions */
|
||||
static inline int IsDebuggerPresent (void) { return false; }
|
||||
static inline void OutputDebugString (const void * unused UNUSED) { }
|
||||
#endif
|
||||
time_t __tr_current_time = 0;
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
||||
static tr_lock*
|
||||
getMessageLock (void)
|
||||
{
|
||||
static tr_lock * l = NULL;
|
||||
|
||||
if (!l)
|
||||
l = tr_lockNew ();
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
void*
|
||||
tr_getLog (void)
|
||||
{
|
||||
static bool initialized = false;
|
||||
static FILE * file = NULL;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
int fd = 0;
|
||||
const char * str = getenv ("TR_DEBUG_FD");
|
||||
|
||||
if (str && *str)
|
||||
fd = atoi (str);
|
||||
|
||||
switch (fd)
|
||||
{
|
||||
case 1:
|
||||
file = stdout;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
file = stderr;
|
||||
break;
|
||||
|
||||
default:
|
||||
file = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
void
|
||||
tr_setMessageLevel (tr_msg_level level)
|
||||
{
|
||||
__tr_message_level = level;
|
||||
}
|
||||
|
||||
void
|
||||
tr_setMessageQueuing (bool enabled)
|
||||
{
|
||||
messageQueuing = enabled;
|
||||
}
|
||||
|
||||
bool
|
||||
tr_getMessageQueuing (void)
|
||||
{
|
||||
return messageQueuing != 0;
|
||||
}
|
||||
|
||||
tr_msg_list *
|
||||
tr_getQueuedMessages (void)
|
||||
{
|
||||
tr_msg_list * ret;
|
||||
tr_lockLock (getMessageLock ());
|
||||
|
||||
ret = messageQueue;
|
||||
messageQueue = NULL;
|
||||
messageQueueTail = &messageQueue;
|
||||
|
||||
messageQueueCount = 0;
|
||||
|
||||
tr_lockUnlock (getMessageLock ());
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
tr_freeMessageList (tr_msg_list * list)
|
||||
{
|
||||
tr_msg_list * next;
|
||||
|
||||
while (NULL != list)
|
||||
{
|
||||
next = list->next;
|
||||
free (list->message);
|
||||
free (list->name);
|
||||
free (list);
|
||||
list = next;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
***
|
||||
**/
|
||||
|
||||
struct tm *
|
||||
tr_localtime_r (const time_t *_clock, struct tm *_result)
|
||||
{
|
||||
@@ -192,145 +82,6 @@ tr_localtime_r (const time_t *_clock, struct tm *_result)
|
||||
#endif
|
||||
}
|
||||
|
||||
char*
|
||||
tr_getLogTimeStr (char * buf, int buflen)
|
||||
{
|
||||
char tmp[64];
|
||||
struct tm now_tm;
|
||||
struct timeval tv;
|
||||
time_t seconds;
|
||||
int milliseconds;
|
||||
|
||||
gettimeofday (&tv, NULL);
|
||||
|
||||
seconds = tv.tv_sec;
|
||||
tr_localtime_r (&seconds, &now_tm);
|
||||
strftime (tmp, sizeof (tmp), "%H:%M:%S", &now_tm);
|
||||
milliseconds = tv.tv_usec / 1000;
|
||||
tr_snprintf (buf, buflen, "%s.%03d", tmp, milliseconds);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
bool
|
||||
tr_deepLoggingIsActive (void)
|
||||
{
|
||||
static int8_t deepLoggingIsActive = -1;
|
||||
|
||||
if (deepLoggingIsActive < 0)
|
||||
deepLoggingIsActive = IsDebuggerPresent () || (tr_getLog ()!=NULL);
|
||||
|
||||
return deepLoggingIsActive != 0;
|
||||
}
|
||||
|
||||
void
|
||||
tr_deepLog (const char * file,
|
||||
int line,
|
||||
const char * name,
|
||||
const char * fmt,
|
||||
...)
|
||||
{
|
||||
FILE * fp = tr_getLog ();
|
||||
if (fp || IsDebuggerPresent ())
|
||||
{
|
||||
va_list args;
|
||||
char timestr[64];
|
||||
char * message;
|
||||
struct evbuffer * buf = evbuffer_new ();
|
||||
char * base = tr_basename (file);
|
||||
|
||||
evbuffer_add_printf (buf, "[%s] ",
|
||||
tr_getLogTimeStr (timestr, sizeof (timestr)));
|
||||
if (name)
|
||||
evbuffer_add_printf (buf, "%s ", name);
|
||||
va_start (args, fmt);
|
||||
evbuffer_add_vprintf (buf, fmt, args);
|
||||
va_end (args);
|
||||
evbuffer_add_printf (buf, " (%s:%d)\n", base, line);
|
||||
/* FIXME (libevent2) ifdef this out for nonwindows platforms */
|
||||
message = evbuffer_free_to_str (buf);
|
||||
OutputDebugString (message);
|
||||
if (fp)
|
||||
fputs (message, fp);
|
||||
|
||||
tr_free (message);
|
||||
tr_free (base);
|
||||
}
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
||||
void
|
||||
tr_msg (const char * file, int line,
|
||||
tr_msg_level level,
|
||||
const char * name,
|
||||
const char * fmt, ...)
|
||||
{
|
||||
const int err = errno; /* message logging shouldn't affect errno */
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
tr_lockLock (getMessageLock ());
|
||||
|
||||
/* build the text message */
|
||||
*buf = '\0';
|
||||
va_start (ap, fmt);
|
||||
evutil_vsnprintf (buf, sizeof (buf), fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
OutputDebugString (buf);
|
||||
|
||||
if (*buf)
|
||||
{
|
||||
if (messageQueuing)
|
||||
{
|
||||
tr_msg_list * newmsg;
|
||||
newmsg = tr_new0 (tr_msg_list, 1);
|
||||
newmsg->level = level;
|
||||
newmsg->when = tr_time ();
|
||||
newmsg->message = tr_strdup (buf);
|
||||
newmsg->file = file;
|
||||
newmsg->line = line;
|
||||
newmsg->name = tr_strdup (name);
|
||||
|
||||
*messageQueueTail = newmsg;
|
||||
messageQueueTail = &newmsg->next;
|
||||
++messageQueueCount;
|
||||
|
||||
if (messageQueueCount > TR_MAX_MSG_LOG)
|
||||
{
|
||||
tr_msg_list * old = messageQueue;
|
||||
messageQueue = old->next;
|
||||
old->next = NULL;
|
||||
tr_freeMessageList (old);
|
||||
--messageQueueCount;
|
||||
assert (messageQueueCount == TR_MAX_MSG_LOG);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FILE * fp;
|
||||
char timestr[64];
|
||||
|
||||
fp = tr_getLog ();
|
||||
if (fp == NULL)
|
||||
fp = stderr;
|
||||
|
||||
tr_getLogTimeStr (timestr, sizeof (timestr));
|
||||
|
||||
if (name)
|
||||
fprintf (fp, "[%s] %s: %s\n", timestr, name, buf);
|
||||
else
|
||||
fprintf (fp, "[%s] %s\n", timestr, buf);
|
||||
fflush (fp);
|
||||
}
|
||||
}
|
||||
|
||||
tr_lockUnlock (getMessageLock ());
|
||||
errno = err;
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
@@ -446,14 +197,14 @@ tr_loadFile (const char * path,
|
||||
if (stat (path, &sb))
|
||||
{
|
||||
const int err = errno;
|
||||
tr_dbg (err_fmt, path, tr_strerror (errno));
|
||||
tr_logAddDebug (err_fmt, path, tr_strerror (errno));
|
||||
errno = err;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((sb.st_mode & S_IFMT) != S_IFREG)
|
||||
{
|
||||
tr_err (err_fmt, path, _("Not a regular file"));
|
||||
tr_logAddError (err_fmt, path, _("Not a regular file"));
|
||||
errno = EISDIR;
|
||||
return NULL;
|
||||
}
|
||||
@@ -463,7 +214,7 @@ tr_loadFile (const char * path,
|
||||
if (fd < 0)
|
||||
{
|
||||
const int err = errno;
|
||||
tr_err (err_fmt, path, tr_strerror (errno));
|
||||
tr_logAddError (err_fmt, path, tr_strerror (errno));
|
||||
errno = err;
|
||||
return NULL;
|
||||
}
|
||||
@@ -471,7 +222,7 @@ tr_loadFile (const char * path,
|
||||
if (!buf)
|
||||
{
|
||||
const int err = errno;
|
||||
tr_err (err_fmt, path, _("Memory allocation failed"));
|
||||
tr_logAddError (err_fmt, path, _("Memory allocation failed"));
|
||||
tr_close_file (fd);
|
||||
errno = err;
|
||||
return NULL;
|
||||
@@ -480,7 +231,7 @@ tr_loadFile (const char * path,
|
||||
if (n == -1)
|
||||
{
|
||||
const int err = errno;
|
||||
tr_err (err_fmt, path, tr_strerror (errno));
|
||||
tr_logAddError (err_fmt, path, tr_strerror (errno));
|
||||
tr_close_file (fd);
|
||||
free (buf);
|
||||
errno = err;
|
||||
@@ -579,7 +330,7 @@ tr_mkdirp (const char * path_in,
|
||||
if (tr_mkdir (path, permissions))
|
||||
{
|
||||
tmperr = errno;
|
||||
tr_err (_("Couldn't create \"%1$s\": %2$s"), path, tr_strerror (tmperr));
|
||||
tr_logAddError (_("Couldn't create \"%1$s\": %2$s"), path, tr_strerror (tmperr));
|
||||
tr_free (path);
|
||||
errno = tmperr;
|
||||
return -1;
|
||||
@@ -589,7 +340,7 @@ tr_mkdirp (const char * path_in,
|
||||
{
|
||||
/* Node exists but isn't a folder */
|
||||
char * buf = tr_strdup_printf (_("File \"%s\" is in the way"), path);
|
||||
tr_err (_("Couldn't create \"%1$s\": %2$s"), path_in, buf);
|
||||
tr_logAddError (_("Couldn't create \"%1$s\": %2$s"), path_in, buf);
|
||||
tr_free (buf);
|
||||
tr_free (path);
|
||||
errno = ENOTDIR;
|
||||
|
||||
Reference in New Issue
Block a user