diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-10-22 16:14:07 -0400 |
---|---|---|
committer | William Jon McCann <mccann@jhu.edu> | 2007-10-22 16:14:07 -0400 |
commit | 4c842f1e108a0e9a412ac599cc4cfc954d801e62 (patch) | |
tree | 67197ba2cbba83620ff6b14a09008dfdb4886055 /tools | |
parent | 7e30b7d07d2f6216b6a8d2f75f3494d3947f0584 (diff) |
add support for reporting from logrotated files
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile.am | 6 | ||||
-rw-r--r-- | tools/ck-history.c | 128 |
2 files changed, 122 insertions, 12 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index ad9e589..61d60cc 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -27,6 +27,7 @@ INCLUDES = \ -DDATADIR=\""$(datadir)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DLOCALSTATEDIR=\""$(localstatedir)"\" \ + $(HISTORY_CFLAGS) \ $(WARN_CFLAGS) \ $(DEBUG_CFLAGS) \ $(DBUS_CFLAGS) \ @@ -49,8 +50,9 @@ ck_history_SOURCES = \ ck-history.c \ $(NULL) -ck_history_LDADD = \ - $(CONSOLE_KIT_LIBS) \ +ck_history_LDADD = \ + $(HISTORY_LIBS) \ + $(Z_LIBS) \ $(top_builddir)/src/libck-event-log.la \ $(NULL) diff --git a/tools/ck-history.c b/tools/ck-history.c index a8ef30b..0629bdf 100644 --- a/tools/ck-history.c +++ b/tools/ck-history.c @@ -23,12 +23,14 @@ #include <stdlib.h> #include <stdio.h> +#include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <string.h> #include <errno.h> #include <locale.h> +#include <zlib.h> #include <glib.h> #include <glib/gi18n.h> @@ -67,6 +69,22 @@ process_event_line (const char *line) } static gboolean +process_log_gzstream (gzFile *fstream) +{ + char line[MAX_LINE_LEN]; + + while (gzgets (fstream, line, sizeof (line)) != Z_NULL) { + if (strlen (line) == sizeof (line) - 1) { + g_warning ("Log line truncated"); + } + + process_event_line (line); + } + + return TRUE; +} + +static gboolean process_log_stream (FILE *fstream) { char line[MAX_LINE_LEN]; @@ -85,17 +103,107 @@ process_log_stream (FILE *fstream) static gboolean process_log_file (const char *filename) { - FILE *f; - - f = g_fopen (filename, "r"); - if (f == NULL) { - g_warning ("Error opening %s (%s)\n", - filename, - g_strerror (errno)); - return FALSE; + gboolean ret; + + g_debug ("Processing %s...", filename); + + if (g_str_has_suffix (filename, ".gz")) { + gzFile *f; + f = gzopen (filename, "r"); + if (f == NULL) { + int errnum; + const char *errmsg; + errmsg = gzerror (f, &errnum); + if (errnum == Z_ERRNO) { + errmsg = g_strerror (errno); + } + g_warning ("Error opening %s (%s)\n", + filename, + errmsg); + return FALSE; + } + ret = process_log_gzstream (f); + gzclose (f); + } else { + FILE *f; + + f = g_fopen (filename, "r"); + if (f == NULL) { + g_warning ("Error opening %s (%s)\n", + filename, + g_strerror (errno)); + return FALSE; + } + ret = process_log_stream (f); + fclose (f); } - return process_log_stream (f); + return ret; +} + +static GList * +get_log_file_list (void) +{ + int num; + GList *files; + + /* always try the primary file */ + files = NULL; + files = g_list_prepend (files, g_strdup (DEFAULT_LOG_FILENAME)); + num = 1; + while (1) { + char *filename; + filename = g_strdup_printf ("%s.%d", DEFAULT_LOG_FILENAME, num); + if (g_access (filename, R_OK) != 0) { + char *filename_gz; + + /* check for .gz */ + filename_gz = g_strdup_printf ("%s.gz", filename); + g_free (filename); + + if (g_access (filename_gz, R_OK) != 0) { + g_free (filename_gz); + break; + } + filename = filename_gz; + } + num++; + files = g_list_prepend (files, filename); + }; + + return files; +} + +static gboolean +process_logs (void) +{ + gboolean ret; + GList *files; + GList *l; + + ret = FALSE; + + files = get_log_file_list (); + + for (l = files; l != NULL; l = l->next) { + gboolean res; + char *filename; + + filename = l->data; + + res = process_log_file (filename); + if (! res) { + goto out; + } + } + + ret = TRUE; + + out: + g_list_foreach (files, (GFunc)g_free, NULL); + g_list_free (files); + + return ret; } static void @@ -599,7 +707,7 @@ main (int argc, uid = -1; } - process_log_file (DEFAULT_LOG_FILENAME); + process_logs (); generate_report (report_type, uid, seat); free_events (); |