22 #include "opensync_internals.h" 24 GPrivate* current_tabs = NULL;
37 g_private_set(current_tabs, GINT_TO_POINTER(0));
53 #if defined ENABLE_TRACE 58 const char *trace = g_getenv(
"OSYNC_TRACE");
59 const char *sensitive = g_getenv(
"OSYNC_PRIVACY");
65 if (!g_file_test(trace, G_FILE_TEST_IS_DIR)) {
66 printf(
"OSYNC_TRACE argument is no directory\n");
70 if (!g_thread_supported ()) g_thread_init (NULL);
74 current_tabs = g_private_new (NULL);
76 tabs = GPOINTER_TO_INT(g_private_get(current_tabs));
78 unsigned long int id = (
unsigned long int)pthread_self();
80 char *logfile = g_strdup_printf(
"%s/Thread%lu-%i.log", trace,
id, (
int)pid);
82 va_start(arglist, message);
83 buffer = g_strdup_vprintf(message, arglist);
85 GString *tabstr = g_string_new(
"");
87 for (i = 0; i < tabs; i++) {
88 tabstr = g_string_append(tabstr,
"\t");
92 g_get_current_time(&curtime);
93 char *logmessage = NULL;
96 logmessage = g_strdup_printf(
"[%li.%li]\t%s>>>>>>> %s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
100 logmessage = g_strdup_printf(
"[%li.%li]\t%s%s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
104 logmessage = g_strdup_printf(
"[%li.%li]\t%s[SENSITIVE] %s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
106 logmessage = g_strdup_printf(
"[%li.%li]\t%s[SENSITIVE CONTENT HIDDEN]\n", curtime.tv_sec, curtime.tv_usec, tabstr->str);
109 logmessage = g_strdup_printf(
"[%li.%li]%s<<<<<<< %s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
115 logmessage = g_strdup_printf(
"[%li.%li]%s<--- ERROR --- %s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
121 logmessage = g_strdup_printf(
"[%li.%li]%sERROR: %s\n", curtime.tv_sec, curtime.tv_usec, tabstr->str, buffer);
125 g_private_set(current_tabs, GINT_TO_POINTER(tabs));
128 g_string_free(tabstr, TRUE);
130 GError *error = NULL;
131 GIOChannel *chan = g_io_channel_new_file(logfile,
"a", &error);
133 printf(
"unable to open %s for writing: %s\n", logfile, error->message);
138 g_io_channel_set_encoding(chan, NULL, NULL);
139 if (g_io_channel_write_chars(chan, logmessage, strlen(logmessage), &writen, NULL) != G_IO_STATUS_NORMAL) {
140 printf(
"unable to write trace to %s\n", logfile);
142 g_io_channel_flush(chan, NULL);
144 g_io_channel_shutdown(chan, TRUE, NULL);
145 g_io_channel_unref(chan);
161 void osync_debug(
const char *subpart,
int level,
const char *message, ...)
163 #if defined ENABLE_DEBUG 164 osync_assert_msg(level <= 4 && level >= 0,
"The debug level must be between 0 and 4.");
167 memset(buffer, 0,
sizeof(buffer));
170 va_start(arglist, message);
171 g_vsnprintf(buffer, 1024, message, arglist);
173 char *debugstr = NULL;
177 debugstr = g_strdup_printf(
"[%s] ERROR: %s", subpart, buffer);
181 debugstr = g_strdup_printf(
"[%s] WARNING: %s", subpart, buffer);
185 debugstr = g_strdup_printf(
"[%s] INFORMATION: %s", subpart, buffer);
189 debugstr = g_strdup_printf(
"[%s] DEBUG: %s", subpart, buffer);
193 debugstr = g_strdup_printf(
"[%s] FULL DEBUG: %s", subpart, buffer);
201 const char *dbgstr = g_getenv(
"OSYNC_DEBUG");
203 debug = atoi(dbgstr);
205 printf(
"%s\n", debugstr);
223 GString *str = g_string_new(
"");
224 for (t = 0; t < len; t++) {
225 if (data[t] >=
' ' && data[t] <=
'z')
226 g_string_append_c(str, data[t]);
228 g_string_append_printf(str,
" %02x ", data[t]);
230 return g_string_free(str, FALSE);
243 char *randchars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ1234567890";
249 length = g_random_int_range(1, maxlength + 1);
250 retchar = malloc(length *
sizeof(
char) + 1);
253 for (i = 0; i < length; i++) {
254 retchar[i] = randchars[g_random_int_range(0, strlen(randchars))];
char * osync_print_binary(const unsigned char *data, int len)
Used for printing binary data.
void osync_debug(const char *subpart, int level, const char *message,...)
Used for debugging.
char * osync_rand_str(int maxlength)
Creates a random string.
void osync_trace_reset_indent(void)
void osync_trace(OSyncTraceType type, const char *message,...)
Used for tracing the application.
OSyncTraceType
The type of the trace.