diff options
-rw-r--r-- | src/common/log.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/common/log.c b/src/common/log.c index 26038b166..ce7e7b68b 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -139,22 +139,32 @@ logv(int severity, const char *funcname, const char *format, va_list ap) logfile_t *lf; assert(format); - for (lf = logfiles; lf; lf = lf->next) { - if (severity < lf->loglevel || severity > lf->max_loglevel) + lf = logfiles; + while(lf) { + if (severity < lf->loglevel || severity > lf->max_loglevel) { + lf = lf->next; continue; - if (!lf->file) + } + if (!lf->file) { + lf = lf->next; continue; + } if (!formatted) { - format_msg(buf, 10024, severity, funcname, format, ap); + format_msg(buf, sizeof(buf), severity, funcname, format, ap); formatted = 1; } - if(fputs(buf, lf->file) == EOF) { /* error */ - assert(0); /* XXX */ - } - if(fflush(lf->file) == EOF) { /* error */ - /* don't log the error! */ - assert(0); /* XXX fail for now. what's better to do? */ + if(fputs(buf, lf->file) == EOF || + fflush(lf->file) == EOF) { /* error */ + /* don't log the error! Blow away this log entry and continue. */ + logfile_t *victim = lf; + lf = victim->next; + if(victim == logfiles) + logfiles = lf; + tor_free(victim->filename); + tor_free(victim); + } else { + lf = lf->next; } } } @@ -194,13 +204,24 @@ void close_logs() /** Close and re-open all log files; used to rotate logs on SIGHUP. */ void reset_logs() { - logfile_t *lf; - for (lf = logfiles; lf; lf = lf->next) { + logfile_t *lf = logfiles; + while(lf) { if (lf->needs_close) { - fclose(lf->file); - lf->file = fopen(lf->filename, "a"); - log_tor_version(lf, 1); + if(fclose(lf->file)==EOF || + !(lf->file = fopen(lf->filename, "a"))) { + /* error. don't log it. delete the log entry and continue. */ + logfile_t *victim = lf; + lf = victim->next; + if(victim == logfiles) + logfiles = lf; + tor_free(victim->filename); + tor_free(victim); + continue; + } else { + log_tor_version(lf, 1); + } } + lf = lf->next; } } |