/* log the line to the UI (GUI, stderr, etc.) */ if(log_mode==LOG_MODE_ERROR || (log_mode==LOG_MODE_INFO && level<LOG_DEBUG) || #if defined(USE_WIN32) || defined(USE_JNI) level<=opt->log_level #else (level<=opt->log_level && global_options.option.log_stderr) #endif ) ui_new_log(line); str_free(line); } #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wformat-extra-args" #endif /* __GNUC__ */ char *log_id(CLI *c) { const char table[62]= "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned char rnd[22]; char *uniq; size_t i; unsigned long tid; switch(c->opt->log_id) { case LOG_ID_SEQUENTIAL: return str_printf("%llu", c->seq); case LOG_ID_UNIQUE: if(RAND_bytes(rnd, sizeof rnd)<=0) /* log2(62^22)=130.99 */ return str_dup("error"); for(i=0; i<sizeof rnd; ++i) { rnd[i]&=63; while(rnd[i]>=62) { if(RAND_bytes(rnd+i, 1)<=0) return str_dup("error"); rnd[i]&=63; } } uniq=str_alloc(sizeof rnd+1); for(i=0; i<sizeof rnd; ++i) uniq[i]=table[rnd[i]]; uniq[sizeof rnd]='\0'; return uniq; case LOG_ID_THREAD: tid=stunnel_thread_id(); if(!tid) /* currently USE_FORK */ tid=stunnel_process_id(); return str_printf("%lu", tid); } return str_dup("error"); }
void log(int level, const char *format, ...) { va_list arglist; char text[STRLEN], timestamped[STRLEN]; FILE *out; time_t gmt; struct tm *timeptr; #ifdef HAVE_LOCALTIME_R struct tm timestruct; #endif if(level>options.debug_level) return; va_start(arglist, format); #ifdef HAVE_VSNPRINTF vsnprintf(text, STRLEN, format, arglist); #else vsprintf(text, format, arglist); #endif va_end(arglist); #if !defined (USE_WIN32) && !defined (__vms) if(!outfile && options.option.syslog) { syslog(level, "%s", text); return; } #endif /* USE_WIN32, __vms */ out=outfile?outfile:stderr; time(&gmt); #ifdef HAVE_LOCALTIME_R timeptr=localtime_r(&gmt, ×truct); #else timeptr=localtime(&gmt); #endif #ifdef HAVE_SNPRINTF snprintf(timestamped, STRLEN, #else sprintf(timestamped, #endif "%04d.%02d.%02d %02d:%02d:%02d LOG%d[%lu:%lu]: %s", timeptr->tm_year+1900, timeptr->tm_mon+1, timeptr->tm_mday, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, level, stunnel_process_id(), stunnel_thread_id(), text); #ifdef USE_WIN32 win_log(timestamped); /* Always log to the GUI window */ if(outfile) /* to the file - only if it exists */ #endif { fprintf(out, "%s\n", timestamped); fflush(out); } }
NOEXPORT void threadid_func(CRYPTO_THREADID *tid) { CRYPTO_THREADID_set_numeric(tid, stunnel_thread_id()); }