diff options
author | james <> | 2008-02-22 14:52:24 +0000 |
---|---|---|
committer | james <> | 2008-02-22 14:52:24 +0000 |
commit | 980bd369ac8759c8a1df6fea7cbb5bfc8fee7afc (patch) | |
tree | bf0b098c6a75e2b577f5c9b40bb8092be77a2bbd /src/log.c | |
parent | 93781eb2af7b9bf6b45dc6ddfbaa700104cb489a (diff) | |
download | sympathy-980bd369ac8759c8a1df6fea7cbb5bfc8fee7afc.tar.gz sympathy-980bd369ac8759c8a1df6fea7cbb5bfc8fee7afc.tar.bz2 sympathy-980bd369ac8759c8a1df6fea7cbb5bfc8fee7afc.zip |
*** empty log message ***
Diffstat (limited to 'src/log.c')
-rw-r--r-- | src/log.c | 57 |
1 files changed, 56 insertions, 1 deletions
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/22 14:51:54 james + * *** empty log message *** + * * Revision 1.1 2008/02/14 12:14:50 james * *** empty log message *** * @@ -20,6 +23,7 @@ static char rcsid[] = "$Id$"; typedef struct { LOG_SIGNATURE; + int do_close; FILE *fp; } File_Log; @@ -53,11 +57,14 @@ flog_log (Log * _l, char *buf) fflush (l->fp); } + + + static void flog_close (Log * _l) { File_Log *l = (File_Log *) _l; - if (l->fp) + if (l->fp && l->do_close) fclose (l->fp); free (l); } @@ -67,16 +74,64 @@ file_log_new (char *fn) { File_Log *l; FILE *f; + int dc=1; + if (fn && strcmp(fn,"-")) { f = fopen (fn, "a+"); if (!f) return NULL; + } else { + f=stderr; + dc=0; + } l = malloc (sizeof (File_Log)); l->log = flog_log; l->close = flog_close; l->fp = f; + l->do_close=dc; return (Log *) l; } +void +log_f (Log *log,char *fmt, ...) +{ + + int n; + static char *buf; + va_list ap; + static int size; + + if (!log) return; + + if (!size) { + size = 128; + buf = malloc (size); + } + + if (!buf) + return; + + while (1) + { + va_start (ap, fmt); + n = vsnprintf (buf , size, fmt, ap); + va_end (ap); + + if (n > -1 && n < size) { + log->log(log,buf); + return; + } + + if (n > -1) /* glibc 2.1 */ + size = n + 1; + else /* glibc 2.0 */ + size *= 2; /* twice the old size */ + + buf = realloc (buf, size); + + if (!buf) + return; + } +} |