summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-17 17:09:03 -0400
committerWilliam Jon McCann <mccann@jhu.edu>2007-10-17 17:09:03 -0400
commit1773b5f77b9c575ab8fc3e3d692e8a7056fe2959 (patch)
tree30b8a4f304544637371fbb09acf7c4dead557fb7
parent0011a7aa94a9dbb00a322a1c08d5ac6a6dfdc21c (diff)
add a basic ck-history command
Refactor some event logging code to share with ck-history. At the moment the command only prints the events.
-rw-r--r--src/Makefile.am10
-rw-r--r--src/ck-event-logger.c486
-rw-r--r--src/ck-event-logger.h99
-rw-r--r--src/ck-log-event.c1084
-rw-r--r--src/ck-log-event.h131
-rw-r--r--src/ck-manager.c42
-rw-r--r--src/test-event-logger.c10
-rw-r--r--tools/Makefile.am10
-rw-r--r--tools/ck-history.c157
-rw-r--r--tools/list-sessions.c58
10 files changed, 1458 insertions, 629 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 54e37cb..3d08222 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -25,9 +25,15 @@ INCLUDES = \
$(NULL)
noinst_LTLIBRARIES = \
- libck.la \
+ libck.la \
+ libck-event-log.la \
$(NULL)
+libck_event_log_la_SOURCES = \
+ ck-log-event.h \
+ ck-log-event.c \
+ $(NULL)
+
libck_la_SOURCES = \
ck-sysdeps.h \
ck-sysdeps-unix.c \
@@ -122,6 +128,7 @@ EXTRA_console_kit_daemon_SOURCES = \
console_kit_daemon_LDADD = \
$(CONSOLE_KIT_LIBS) \
libck.la \
+ libck-event-log.la \
$(NULL)
noinst_PROGRAMS = \
@@ -138,6 +145,7 @@ test_event_logger_SOURCES = \
test_event_logger_LDADD = \
$(CONSOLE_KIT_LIBS) \
+ libck-event-log.la \
$(NULL)
test_vt_monitor_SOURCES = \
diff --git a/src/ck-event-logger.c b/src/ck-event-logger.c
index b9e41ee..66c7ab2 100644
--- a/src/ck-event-logger.c
+++ b/src/ck-event-logger.c
@@ -37,6 +37,7 @@
#include <glib-object.h>
#include "ck-event-logger.h"
+#include "ck-log-event.h"
#define CK_EVENT_LOGGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CK_TYPE_EVENT_LOGGER, CkEventLoggerPrivate))
@@ -73,301 +74,18 @@ ck_event_logger_error_quark (void)
return ret;
}
-static void
-event_seat_added_free (CkEventLoggerSeatAddedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
-}
-
-static void
-event_seat_removed_free (CkEventLoggerSeatRemovedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
-}
-
-static void
-event_seat_session_added_free (CkEventLoggerSeatSessionAddedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
-
- g_free (event->session_id);
- event->session_id = NULL;
- g_free (event->session_type);
- event->session_type = NULL;
- g_free (event->session_x11_display);
- event->session_x11_display = NULL;
- g_free (event->session_x11_display_device);
- event->session_x11_display_device = NULL;
- g_free (event->session_display_device);
- event->session_display_device = NULL;
- g_free (event->session_remote_host_name);
- event->session_remote_host_name = NULL;
- g_free (event->session_creation_time);
- event->session_creation_time = NULL;
-}
-
-static void
-event_seat_session_removed_free (CkEventLoggerSeatSessionRemovedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
-
- g_free (event->session_id);
- event->session_id = NULL;
- g_free (event->session_type);
- event->session_type = NULL;
- g_free (event->session_x11_display);
- event->session_x11_display = NULL;
- g_free (event->session_x11_display_device);
- event->session_x11_display_device = NULL;
- g_free (event->session_display_device);
- event->session_display_device = NULL;
- g_free (event->session_remote_host_name);
- event->session_remote_host_name = NULL;
- g_free (event->session_creation_time);
- event->session_creation_time = NULL;
-}
-
-static void
-event_seat_active_session_changed_free (CkEventLoggerSeatActiveSessionChangedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
-
- g_free (event->session_id);
- event->session_id = NULL;
-}
-
-static void
-event_seat_device_added_free (CkEventLoggerSeatDeviceAddedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
- g_free (event->device_id);
- event->device_id = NULL;
- g_free (event->device_type);
- event->device_type = NULL;
-}
-
-static void
-event_seat_device_removed_free (CkEventLoggerSeatDeviceRemovedEvent *event)
-{
- g_assert (event != NULL);
-
- g_free (event->seat_id);
- event->seat_id = NULL;
- g_free (event->device_id);
- event->device_id = NULL;
- g_free (event->device_type);
- event->device_type = NULL;
-}
-
-static void
-event_seat_added_copy (CkEventLoggerSeatAddedEvent *event,
- CkEventLoggerSeatAddedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->seat_kind = event->seat_kind;
-}
-
-static void
-event_seat_removed_copy (CkEventLoggerSeatRemovedEvent *event,
- CkEventLoggerSeatRemovedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->seat_kind = event->seat_kind;
-}
-
-static void
-event_seat_session_added_copy (CkEventLoggerSeatSessionAddedEvent *event,
- CkEventLoggerSeatSessionAddedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->session_id = g_strdup (event->session_id);
- event_copy->session_type = g_strdup (event->session_type);
- event_copy->session_x11_display = g_strdup (event->session_x11_display);
- event_copy->session_x11_display_device = g_strdup (event->session_x11_display_device);
- event_copy->session_display_device = g_strdup (event->session_display_device);
- event_copy->session_remote_host_name = g_strdup (event->session_remote_host_name);
- event_copy->session_is_local = event->session_is_local;
- event_copy->session_unix_user = event->session_unix_user;
- event_copy->session_creation_time = g_strdup (event->session_creation_time);
-}
-
-static void
-event_seat_session_removed_copy (CkEventLoggerSeatSessionRemovedEvent *event,
- CkEventLoggerSeatSessionRemovedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->session_id = g_strdup (event->session_id);
- event_copy->session_type = g_strdup (event->session_type);
- event_copy->session_x11_display = g_strdup (event->session_x11_display);
- event_copy->session_x11_display_device = g_strdup (event->session_x11_display_device);
- event_copy->session_display_device = g_strdup (event->session_display_device);
- event_copy->session_remote_host_name = g_strdup (event->session_remote_host_name);
- event_copy->session_is_local = event->session_is_local;
- event_copy->session_unix_user = event->session_unix_user;
- event_copy->session_creation_time = g_strdup (event->session_creation_time);
-}
-
-static void
-event_seat_active_session_changed_copy (CkEventLoggerSeatActiveSessionChangedEvent *event,
- CkEventLoggerSeatActiveSessionChangedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->session_id = g_strdup (event->session_id);
-}
-
-static void
-event_seat_device_added_copy (CkEventLoggerSeatDeviceAddedEvent *event,
- CkEventLoggerSeatDeviceAddedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->device_id = g_strdup (event->device_id);
- event_copy->device_type = g_strdup (event->device_type);
-}
-
-static void
-event_seat_device_removed_copy (CkEventLoggerSeatDeviceRemovedEvent *event,
- CkEventLoggerSeatDeviceRemovedEvent *event_copy)
-{
- g_assert (event != NULL);
- g_assert (event_copy != NULL);
-
- event_copy->seat_id = g_strdup (event->seat_id);
- event_copy->device_id = g_strdup (event->device_id);
- event_copy->device_type = g_strdup (event->device_type);
-}
-
-CkEventLoggerEvent *
-ck_event_logger_event_copy (CkEventLoggerEvent *event)
-{
- CkEventLoggerEvent *event_copy;
-
- if (event == NULL) {
- return NULL;
- }
-
- event_copy = g_new0 (CkEventLoggerEvent, 1);
-
- event_copy->type = event->type;
- event_copy->timestamp = event->timestamp;
-
- switch (event->type) {
- case CK_EVENT_LOGGER_EVENT_SEAT_ADDED:
- event_seat_added_copy ((CkEventLoggerSeatAddedEvent *) event,
- (CkEventLoggerSeatAddedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_REMOVED:
- event_seat_removed_copy ((CkEventLoggerSeatRemovedEvent *) event,
- (CkEventLoggerSeatRemovedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED:
- event_seat_session_added_copy ((CkEventLoggerSeatSessionAddedEvent *) event,
- (CkEventLoggerSeatSessionAddedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED:
- event_seat_session_removed_copy ((CkEventLoggerSeatSessionRemovedEvent *) event,
- (CkEventLoggerSeatSessionRemovedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED:
- event_seat_device_added_copy ((CkEventLoggerSeatDeviceAddedEvent *) event,
- (CkEventLoggerSeatDeviceAddedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED:
- event_seat_device_removed_copy ((CkEventLoggerSeatDeviceRemovedEvent *) event,
- (CkEventLoggerSeatDeviceRemovedEvent *) event_copy);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
- event_seat_active_session_changed_copy ((CkEventLoggerSeatActiveSessionChangedEvent *) event,
- (CkEventLoggerSeatActiveSessionChangedEvent *) event_copy);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- return event_copy;
-}
-
-void
-ck_event_logger_event_free (CkEventLoggerEvent *event)
-{
- switch (event->type) {
- case CK_EVENT_LOGGER_EVENT_SEAT_ADDED:
- event_seat_added_free ((CkEventLoggerSeatAddedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_REMOVED:
- event_seat_removed_free ((CkEventLoggerSeatRemovedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED:
- event_seat_session_added_free ((CkEventLoggerSeatSessionAddedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED:
- event_seat_session_removed_free ((CkEventLoggerSeatSessionRemovedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED:
- event_seat_device_added_free ((CkEventLoggerSeatDeviceAddedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED:
- event_seat_device_removed_free ((CkEventLoggerSeatDeviceRemovedEvent *) event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
- event_seat_active_session_changed_free ((CkEventLoggerSeatActiveSessionChangedEvent *) event);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- g_free (event);
-}
-
gboolean
ck_event_logger_queue_event (CkEventLogger *event_logger,
- CkEventLoggerEvent *event,
+ CkLogEvent *event,
GError **error)
{
- CkEventLoggerEvent *event_copy;
- gboolean ret;
+ CkLogEvent *event_copy;
+ gboolean ret;
g_return_val_if_fail (CK_IS_EVENT_LOGGER (event_logger), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
- event_copy = ck_event_logger_event_copy (event);
+ event_copy = ck_log_event_copy (event);
g_async_queue_push (event_logger->priv->event_queue,
event_copy);
@@ -446,199 +164,15 @@ retry:
return TRUE;
}
-static void
-add_log_for_seat_added (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatAddedEvent *e;
-
- e = (CkEventLoggerSeatAddedEvent *)event;
- g_string_append_printf (str,
- " seat-id=%s seat-kind=%d",
- e->seat_id,
- e->seat_kind);
-}
-
-static void
-add_log_for_seat_removed (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatRemovedEvent *e;
-
- e = (CkEventLoggerSeatRemovedEvent *)event;
- g_string_append_printf (str,
- " seat-id=%s seat-kind=%d",
- e->seat_id,
- e->seat_kind);
-}
-
-static void
-add_log_for_seat_session_added (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatSessionAddedEvent *e;
-
- e = (CkEventLoggerSeatSessionAddedEvent *)event;
- g_string_append_printf (str,
- " seat-id='%s' session-id='%s' session-type='%s' session-x11-display='%s' session-x11-display-device='%s' session-display-device='%s' session-remote-host-name='%s' session-is-local=%s session-unix-user=%u session-creation-time='%s'",
- e->seat_id ? e->seat_id : "",
- e->session_id ? e->session_id : "",
- e->session_type ? e->session_type : "",
- e->session_x11_display ? e->session_x11_display : "",
- e->session_x11_display_device ? e->session_x11_display_device : "",
- e->session_display_device ? e->session_display_device : "",
- e->session_remote_host_name ? e->session_remote_host_name : "",
- e->session_is_local ? "TRUE" : "FALSE",
- e->session_unix_user,
- e->session_creation_time ? e->session_creation_time : "");
-}
-
-static void
-add_log_for_seat_session_removed (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatSessionRemovedEvent *e;
-
- e = (CkEventLoggerSeatSessionRemovedEvent *)event;
- g_string_append_printf (str,
- " seat-id='%s' session-id='%s' session-type='%s' session-x11-display='%s' session-x11-display-device='%s' session-display-device='%s' session-remote-host-name='%s' session-is-local=%s session-unix-user=%u session-creation-time='%s'",
- e->seat_id ? e->seat_id : "",
- e->session_id ? e->session_id : "",
- e->session_type ? e->session_type : "",
- e->session_x11_display ? e->session_x11_display : "",
- e->session_x11_display_device ? e->session_x11_display_device : "",
- e->session_display_device ? e->session_display_device : "",
- e->session_remote_host_name ? e->session_remote_host_name : "",
- e->session_is_local ? "TRUE" : "FALSE",
- e->session_unix_user,
- e->session_creation_time ? e->session_creation_time : "");
-}
-
-static void
-add_log_for_seat_active_session_changed (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatActiveSessionChangedEvent *e;
-
- e = (CkEventLoggerSeatActiveSessionChangedEvent *)event;
- g_string_append_printf (str,
- " seat-id='%s' session-id='%s'",
- e->seat_id ? e->seat_id : "",
- e->session_id ? e->session_id : "");
-}
-
-static void
-add_log_for_seat_device_added (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatDeviceAddedEvent *e;
-
- e = (CkEventLoggerSeatDeviceAddedEvent *)event;
- g_string_append_printf (str,
- " seat-id='%s' device-id='%s' device-type='%s'",
- e->seat_id ? e->seat_id : "",
- e->device_id ? e->device_id : "",
- e->device_type ? e->device_type : "");
-}
-
-static void
-add_log_for_seat_device_removed (GString *str,
- CkEventLoggerEvent *event)
-{
- CkEventLoggerSeatDeviceRemovedEvent *e;
-
- e = (CkEventLoggerSeatDeviceRemovedEvent *)event;
- g_string_append_printf (str,
- " seat-id='%s' device-id='%s' device-type='%s'",
- e->seat_id ? e->seat_id : "",
- e->device_id ? e->device_id : "",
- e->device_type ? e->device_type : "");
-}
-
-static const char *
-event_type_to_name (int event_type)
-{
- const char *str;
- switch (event_type) {
- case CK_EVENT_LOGGER_EVENT_SEAT_ADDED:
- str = "SEAT_ADDED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_REMOVED:
- str = "SEAT_REMOVED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED:
- str = "SEAT_SESSION_ADDED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED:
- str = "SEAT_SESSION_REMOVED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED:
- str = "SEAT_DEVICE_ADDED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED:
- str = "SEAT_DEVICE_REMOVED";
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
- str = "SEAT_ACTIVE_SESSION_CHANGED";
- break;
- default:
- str = "UNKNOWN";
- break;
- }
- return str;
-}
-
-static void
-add_log_for_any (GString *str,
- CkEventLoggerEvent *event)
-{
- char *tstr;
-
- tstr = g_time_val_to_iso8601 (&event->timestamp);
-
- g_string_append_printf (str,
- "%s type=%s",
- tstr,
- event_type_to_name (event->type));
- g_free (tstr);
-}
-
static gboolean
-write_log_for_event (CkEventLogger *event_logger,
- CkEventLoggerEvent *event)
+write_log_for_event (CkEventLogger *event_logger,
+ CkLogEvent *event)
{
GString *str;
str = g_string_new (NULL);
- add_log_for_any (str, event);
-
- switch (event->type) {
- case CK_EVENT_LOGGER_EVENT_SEAT_ADDED:
- add_log_for_seat_added (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_REMOVED:
- add_log_for_seat_removed (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED:
- add_log_for_seat_session_added (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED:
- add_log_for_seat_session_removed (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED:
- add_log_for_seat_device_added (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED:
- add_log_for_seat_device_removed (str, event);
- break;
- case CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
- add_log_for_seat_active_session_changed (str, event);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
+ ck_log_event_to_string (event, str);
g_debug ("Writing log for event: %s", str->str);
@@ -660,11 +194,11 @@ write_log_for_event (CkEventLogger *event_logger,
static void *
writer_thread_start (CkEventLogger *event_logger)
{
- CkEventLoggerEvent *event;
+ CkLogEvent *event;
while ((event = g_async_queue_pop (event_logger->priv->event_queue)) != NULL) {
write_log_for_event (event_logger, event);
- ck_event_logger_event_free (event);
+ ck_log_event_free (event);
}
g_thread_exit (NULL);
diff --git a/src/ck-event-logger.h b/src/ck-event-logger.h
index c49136e..d4645f7 100644
--- a/src/ck-event-logger.h
+++ b/src/ck-event-logger.h
@@ -22,6 +22,7 @@
#define __CK_EVENT_LOGGER_H
#include <glib-object.h>
+#include "ck-log-event.h"
G_BEGIN_DECLS
@@ -47,98 +48,6 @@ typedef struct
typedef enum
{
- CK_EVENT_LOGGER_EVENT_START = 0,
- CK_EVENT_LOGGER_EVENT_STOP,
- CK_EVENT_LOGGER_EVENT_SYSTEM_SHUTDOWN,
- CK_EVENT_LOGGER_EVENT_SYSTEM_RUNLEVEL_CHANGED,
- CK_EVENT_LOGGER_EVENT_SEAT_ADDED,
- CK_EVENT_LOGGER_EVENT_SEAT_REMOVED,
- CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED,
- CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED,
- CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED,
- CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED,
- CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED,
-} CkEventLoggerEventType;
-
-typedef struct
-{
- char *seat_id;
- int seat_kind;
-} CkEventLoggerSeatAddedEvent;
-
-typedef struct
-{
- char *seat_id;
- int seat_kind;
-} CkEventLoggerSeatRemovedEvent;
-
-typedef struct
-{
- char *seat_id;
- char *session_id;
- char *session_type;
- char *session_x11_display;
- char *session_x11_display_device;
- char *session_display_device;
- char *session_remote_host_name;
- gboolean session_is_local;
- guint session_unix_user;
- char *session_creation_time;
-} CkEventLoggerSeatSessionAddedEvent;
-
-typedef struct
-{
- char *seat_id;
- char *session_id;
- char *session_type;
- char *session_x11_display;
- char *session_x11_display_device;
- char *session_display_device;
- char *session_remote_host_name;
- gboolean session_is_local;
- guint session_unix_user;
- char *session_creation_time;
-} CkEventLoggerSeatSessionRemovedEvent;
-
-typedef struct
-{
- char *seat_id;
- char *session_id;
-} CkEventLoggerSeatActiveSessionChangedEvent;
-
-typedef struct
-{
- char *seat_id;
- char *device_type;
- char *device_id;
-} CkEventLoggerSeatDeviceAddedEvent;
-
-typedef struct
-{
- char *seat_id;
- char *device_type;
- char *device_id;
-} CkEventLoggerSeatDeviceRemovedEvent;
-
-typedef struct
-{
- union {
- CkEventLoggerSeatAddedEvent seat_added;
- CkEventLoggerSeatRemovedEvent seat_removed;
- CkEventLoggerSeatSessionAddedEvent seat_session_added;
- CkEventLoggerSeatSessionRemovedEvent seat_session_removed;
- CkEventLoggerSeatActiveSessionChangedEvent seat_active_session_changed;
- CkEventLoggerSeatDeviceAddedEvent seat_device_added;
- CkEventLoggerSeatDeviceRemovedEvent seat_device_removed;
- } event;
-
- GTimeVal timestamp;
- CkEventLoggerEventType type;
-} CkEventLoggerEvent;
-
-
-typedef enum
-{
CK_EVENT_LOGGER_ERROR_GENERAL
} CkEventLoggerError;
@@ -149,13 +58,9 @@ GType ck_event_logger_get_type (void);
CkEventLogger * ck_event_logger_new (const char *filename);
gboolean ck_event_logger_queue_event (CkEventLogger *event_logger,
- CkEventLoggerEvent *event,
+ CkLogEvent *event,
GError **error);
-CkEventLoggerEvent * ck_event_logger_event_copy (CkEventLoggerEvent *event);
-void ck_event_logger_event_free (CkEventLoggerEvent *event);
-
-
G_END_DECLS
#endif /* __CK_EVENT_LOGGER_H */
diff --git a/src/ck-log-event.c b/src/ck-log-event.c
new file mode 100644
index 0000000..5cdaa95
--- /dev/null
+++ b/src/ck-log-event.c
@@ -0,0 +1,1084 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include "ck-log-event.h"
+
+static void
+event_seat_added_free (CkLogSeatAddedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+}
+
+static void
+event_seat_removed_free (CkLogSeatRemovedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+}
+
+static void
+event_seat_session_added_free (CkLogSeatSessionAddedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+
+ g_free (event->session_id);
+ event->session_id = NULL;
+ g_free (event->session_type);
+ event->session_type = NULL;
+ g_free (event->session_x11_display);
+ event->session_x11_display = NULL;
+ g_free (event->session_x11_display_device);
+ event->session_x11_display_device = NULL;
+ g_free (event->session_display_device);
+ event->session_display_device = NULL;
+ g_free (event->session_remote_host_name);
+ event->session_remote_host_name = NULL;
+ g_free (event->session_creation_time);
+ event->session_creation_time = NULL;
+}
+
+static void
+event_seat_session_removed_free (CkLogSeatSessionRemovedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+
+ g_free (event->session_id);
+ event->session_id = NULL;
+ g_free (event->session_type);
+ event->session_type = NULL;
+ g_free (event->session_x11_display);
+ event->session_x11_display = NULL;
+ g_free (event->session_x11_display_device);
+ event->session_x11_display_device = NULL;
+ g_free (event->session_display_device);
+ event->session_display_device = NULL;
+ g_free (event->session_remote_host_name);
+ event->session_remote_host_name = NULL;
+ g_free (event->session_creation_time);
+ event->session_creation_time = NULL;
+}
+
+static void
+event_seat_active_session_changed_free (CkLogSeatActiveSessionChangedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+
+ g_free (event->session_id);
+ event->session_id = NULL;
+}
+
+static void
+event_seat_device_added_free (CkLogSeatDeviceAddedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+ g_free (event->device_id);
+ event->device_id = NULL;
+ g_free (event->device_type);
+ event->device_type = NULL;
+}
+
+static void
+event_seat_device_removed_free (CkLogSeatDeviceRemovedEvent *event)
+{
+ g_assert (event != NULL);
+
+ g_free (event->seat_id);
+ event->seat_id = NULL;
+ g_free (event->device_id);
+ event->device_id = NULL;
+ g_free (event->device_type);
+ event->device_type = NULL;
+}
+
+static void
+event_seat_added_copy (CkLogSeatAddedEvent *event,
+ CkLogSeatAddedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->seat_kind = event->seat_kind;
+}
+
+static void
+event_seat_removed_copy (CkLogSeatRemovedEvent *event,
+ CkLogSeatRemovedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->seat_kind = event->seat_kind;
+}
+
+static void
+event_seat_session_added_copy (CkLogSeatSessionAddedEvent *event,
+ CkLogSeatSessionAddedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->session_id = g_strdup (event->session_id);
+ event_copy->session_type = g_strdup (event->session_type);
+ event_copy->session_x11_display = g_strdup (event->session_x11_display);
+ event_copy->session_x11_display_device = g_strdup (event->session_x11_display_device);
+ event_copy->session_display_device = g_strdup (event->session_display_device);
+ event_copy->session_remote_host_name = g_strdup (event->session_remote_host_name);
+ event_copy->session_is_local = event->session_is_local;
+ event_copy->session_unix_user = event->session_unix_user;
+ event_copy->session_creation_time = g_strdup (event->session_creation_time);
+}
+
+static void
+event_seat_session_removed_copy (CkLogSeatSessionRemovedEvent *event,
+ CkLogSeatSessionRemovedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->session_id = g_strdup (event->session_id);
+ event_copy->session_type = g_strdup (event->session_type);
+ event_copy->session_x11_display = g_strdup (event->session_x11_display);
+ event_copy->session_x11_display_device = g_strdup (event->session_x11_display_device);
+ event_copy->session_display_device = g_strdup (event->session_display_device);
+ event_copy->session_remote_host_name = g_strdup (event->session_remote_host_name);
+ event_copy->session_is_local = event->session_is_local;
+ event_copy->session_unix_user = event->session_unix_user;
+ event_copy->session_creation_time = g_strdup (event->session_creation_time);
+}
+
+static void
+event_seat_active_session_changed_copy (CkLogSeatActiveSessionChangedEvent *event,
+ CkLogSeatActiveSessionChangedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->session_id = g_strdup (event->session_id);
+}
+
+static void
+event_seat_device_added_copy (CkLogSeatDeviceAddedEvent *event,
+ CkLogSeatDeviceAddedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->device_id = g_strdup (event->device_id);
+ event_copy->device_type = g_strdup (event->device_type);
+}
+
+static void
+event_seat_device_removed_copy (CkLogSeatDeviceRemovedEvent *event,
+ CkLogSeatDeviceRemovedEvent *event_copy)
+{
+ g_assert (event != NULL);
+ g_assert (event_copy != NULL);
+
+ event_copy->seat_id = g_strdup (event->seat_id);
+ event_copy->device_id = g_strdup (event->device_id);
+ event_copy->device_type = g_strdup (event->device_type);
+}
+
+CkLogEvent *
+ck_log_event_copy (CkLogEvent *event)
+{
+ CkLogEvent *event_copy;
+
+ if (event == NULL) {
+ return NULL;
+ }
+
+ event_copy = g_new0 (CkLogEvent, 1);
+
+ event_copy->type = event->type;
+ event_copy->timestamp = event->timestamp;
+
+ switch (event->type) {
+ case CK_LOG_EVENT_SEAT_ADDED:
+ event_seat_added_copy ((CkLogSeatAddedEvent *) event,
+ (CkLogSeatAddedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_REMOVED:
+ event_seat_removed_copy ((CkLogSeatRemovedEvent *) event,
+ (CkLogSeatRemovedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_ADDED:
+ event_seat_session_added_copy ((CkLogSeatSessionAddedEvent *) event,
+ (CkLogSeatSessionAddedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_REMOVED:
+ event_seat_session_removed_copy ((CkLogSeatSessionRemovedEvent *) event,
+ (CkLogSeatSessionRemovedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_ADDED:
+ event_seat_device_added_copy ((CkLogSeatDeviceAddedEvent *) event,
+ (CkLogSeatDeviceAddedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_REMOVED:
+ event_seat_device_removed_copy ((CkLogSeatDeviceRemovedEvent *) event,
+ (CkLogSeatDeviceRemovedEvent *) event_copy);
+ break;
+ case CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
+ event_seat_active_session_changed_copy ((CkLogSeatActiveSessionChangedEvent *) event,
+ (CkLogSeatActiveSessionChangedEvent *) event_copy);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return event_copy;
+}
+
+void
+ck_log_event_free (CkLogEvent *event)
+{
+ switch (event->type) {
+ case CK_LOG_EVENT_SEAT_ADDED:
+ event_seat_added_free ((CkLogSeatAddedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_REMOVED:
+ event_seat_removed_free ((CkLogSeatRemovedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_ADDED:
+ event_seat_session_added_free ((CkLogSeatSessionAddedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_REMOVED:
+ event_seat_session_removed_free ((CkLogSeatSessionRemovedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_ADDED:
+ event_seat_device_added_free ((CkLogSeatDeviceAddedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_REMOVED:
+ event_seat_device_removed_free ((CkLogSeatDeviceRemovedEvent *) event);
+ break;
+ case CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
+ event_seat_active_session_changed_free ((CkLogSeatActiveSessionChangedEvent *) event);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_free (event);
+}
+
+static void
+add_log_for_seat_added (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatAddedEvent *e;
+
+ e = (CkLogSeatAddedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' seat-kind=%d",
+ e->seat_id,
+ e->seat_kind);
+}
+
+static void
+add_log_for_seat_removed (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatRemovedEvent *e;
+
+ e = (CkLogSeatRemovedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' seat-kind=%d",
+ e->seat_id,
+ e->seat_kind);
+}
+
+static void
+add_log_for_seat_session_added (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatSessionAddedEvent *e;
+
+ e = (CkLogSeatSessionAddedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' session-id='%s' session-type='%s' session-x11-display='%s' session-x11-display-device='%s' session-display-device='%s' session-remote-host-name='%s' session-is-local=%s session-unix-user=%u session-creation-time='%s'",
+ e->seat_id ? e->seat_id : "",
+ e->session_id ? e->session_id : "",
+ e->session_type ? e->session_type : "",
+ e->session_x11_display ? e->session_x11_display : "",
+ e->session_x11_display_device ? e->session_x11_display_device : "",
+ e->session_display_device ? e->session_display_device : "",
+ e->session_remote_host_name ? e->session_remote_host_name : "",
+ e->session_is_local ? "TRUE" : "FALSE",
+ e->session_unix_user,
+ e->session_creation_time ? e->session_creation_time : "");
+}
+
+static void
+add_log_for_seat_session_removed (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatSessionRemovedEvent *e;
+
+ e = (CkLogSeatSessionRemovedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' session-id='%s' session-type='%s' session-x11-display='%s' session-x11-display-device='%s' session-display-device='%s' session-remote-host-name='%s' session-is-local=%s session-unix-user=%u session-creation-time='%s'",
+ e->seat_id ? e->seat_id : "",
+ e->session_id ? e->session_id : "",
+ e->session_type ? e->session_type : "",
+ e->session_x11_display ? e->session_x11_display : "",
+ e->session_x11_display_device ? e->session_x11_display_device : "",
+ e->session_display_device ? e->session_display_device : "",
+ e->session_remote_host_name ? e->session_remote_host_name : "",
+ e->session_is_local ? "TRUE" : "FALSE",
+ e->session_unix_user,
+ e->session_creation_time ? e->session_creation_time : "");
+}
+
+static void
+add_log_for_seat_active_session_changed (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatActiveSessionChangedEvent *e;
+
+ e = (CkLogSeatActiveSessionChangedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' session-id='%s'",
+ e->seat_id ? e->seat_id : "",
+ e->session_id ? e->session_id : "");
+}
+
+static void
+add_log_for_seat_device_added (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatDeviceAddedEvent *e;
+
+ e = (CkLogSeatDeviceAddedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' device-id='%s' device-type='%s'",
+ e->seat_id ? e->seat_id : "",
+ e->device_id ? e->device_id : "",
+ e->device_type ? e->device_type : "");
+}
+
+static void
+add_log_for_seat_device_removed (GString *str,
+ CkLogEvent *event)
+{
+ CkLogSeatDeviceRemovedEvent *e;
+
+ e = (CkLogSeatDeviceRemovedEvent *)event;
+ g_string_append_printf (str,
+ " seat-id='%s' device-id='%s' device-type='%s'",
+ e->seat_id ? e->seat_id : "",
+ e->device_id ? e->device_id : "",
+ e->device_type ? e->device_type : "");
+}
+
+static const char *
+event_type_to_name (CkLogEventType event_type)
+{
+ const char *str;
+ switch (event_type) {
+ case CK_LOG_EVENT_SEAT_ADDED:
+ str = "SEAT_ADDED";
+ break;
+ case CK_LOG_EVENT_SEAT_REMOVED:
+ str = "SEAT_REMOVED";
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_ADDED:
+ str = "SEAT_SESSION_ADDED";
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_REMOVED:
+ str = "SEAT_SESSION_REMOVED";
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_ADDED:
+ str = "SEAT_DEVICE_ADDED";
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_REMOVED:
+ str = "SEAT_DEVICE_REMOVED";
+ break;
+ case CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
+ str = "SEAT_ACTIVE_SESSION_CHANGED";
+ break;
+ default:
+ str = "UNKNOWN";
+ break;
+ }
+ return str;
+}
+
+static gboolean
+event_name_to_type (const char *event_name,
+ CkLogEventType *event_type)
+{
+ gboolean ret;
+
+ ret = TRUE;
+
+ if (strcmp (event_name, "SEAT_ADDED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_ADDED;
+ } else if (strcmp (event_name, "SEAT_REMOVED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_REMOVED;
+ } else if (strcmp (event_name, "SEAT_SESSION_ADDED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_SESSION_ADDED;
+ } else if (strcmp (event_name, "SEAT_SESSION_REMOVED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_SESSION_REMOVED;
+ } else if (strcmp (event_name, "SEAT_DEVICE_ADDED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_DEVICE_ADDED;
+ } else if (strcmp (event_name, "SEAT_DEVICE_REMOVED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_DEVICE_REMOVED;
+ } else if (strcmp (event_name, "SEAT_ACTIVE_SESSION_CHANGED") == 0) {
+ *event_type = CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED;
+ } else {
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+static void
+add_log_for_any (GString *str,
+ CkLogEvent *event)
+{
+ g_string_append_printf (str,
+ "%lu.%03u type=%s :",
+ (gulong)event->timestamp.tv_sec,
+ (guint)(event->timestamp.tv_usec / 1000),
+ event_type_to_name (event->type));
+}
+
+void
+ck_log_event_to_string (CkLogEvent *event,
+ GString *str)
+{
+
+ add_log_for_any (str, event);
+
+ switch (event->type) {
+ case CK_LOG_EVENT_SEAT_ADDED:
+ add_log_for_seat_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_REMOVED:
+ add_log_for_seat_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_ADDED:
+ add_log_for_seat_session_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_REMOVED:
+ add_log_for_seat_session_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_ADDED:
+ add_log_for_seat_device_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_REMOVED:
+ add_log_for_seat_device_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
+ add_log_for_seat_active_session_changed (str, event);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+static char *
+skip_header (const char *str,
+ gssize len)
+{
+ char *r;
+ r = g_strstr_len (str,
+ len,
+ " : ");
+ if (r != NULL) {
+ r += 3;
+ }
+
+ return r;
+}
+
+static gboolean
+parse_value_as_ulong (const char *value,
+ gulong *intval)
+{
+ char *end_of_valid_int;
+ glong ulong_value;
+
+ ulong_value = strtoul (value, &end_of_valid_int, 10);
+
+ if (*value == '\0' || *end_of_valid_int != '\0') {
+ return FALSE;
+ }
+
+ *intval = ulong_value;
+
+ return TRUE;
+}
+
+static gboolean
+parse_log_for_seat_added (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ char *tmp;
+ CkLogSeatAddedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' seat-kind=(?P<sessionid>[0-9]*)", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatAddedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+
+ tmp = g_match_info_fetch_named (match_info, "seatkind");
+ if (tmp != NULL) {
+ gulong l;
+ if (parse_value_as_ulong (tmp, &l)) {
+ e->seat_kind = l;
+ }
+ }
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_removed (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ char *tmp;
+ CkLogSeatRemovedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' seat-kind=(?P<sessionid>[0-9]*)", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatRemovedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+
+ tmp = g_match_info_fetch_named (match_info, "seatkind");
+ if (tmp != NULL) {
+ gulong l;
+ if (parse_value_as_ulong (tmp, &l)) {
+ e->seat_kind = l;
+ }
+ }
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_session_added (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ char *tmp;
+ CkLogSeatSessionAddedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' session-id='(?P<sessionid>[a-zA-Z0-9/]+)' session-type='(?P<sessiontype>[a-zA-Z0-9 ]*)' session-x11-display='(?P<sessionx11display>[0-9a-zA-Z.:]*)' session-x11-display-device='(?P<sessionx11displaydevice>[^']*)' session-display-device='(?P<sessiondisplaydevice>[^']*)' session-remote-host-name='(?P<sessionremovehostname>[^']*)' session-is-local=(?P<sessionislocal>[a-zA-Z]*) session-unix-user=(?P<sessionunixuser>[0-9]*) session-creation-time='(?P<sessioncreationtime>[^']*)'", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatSessionAddedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+ e->session_id = g_match_info_fetch_named (match_info, "sessionid");
+ e->session_type = g_match_info_fetch_named (match_info, "sessiontype");
+ e->session_x11_display = g_match_info_fetch_named (match_info, "sessionx11display");
+ e->session_x11_display_device = g_match_info_fetch_named (match_info, "sessionx11displaydevice");
+ e->session_display_device = g_match_info_fetch_named (match_info, "sessiondisplaydevice");
+ e->session_remote_host_name = g_match_info_fetch_named (match_info, "sessionremotehostname");
+ e->session_creation_time = g_match_info_fetch_named (match_info, "sessioncreationtime");
+
+ tmp = g_match_info_fetch_named (match_info, "sessionislocal");
+ if (tmp != NULL && strcmp (tmp, "TRUE") == 0) {
+ e->session_is_local = TRUE;
+ } else {
+ e->session_is_local = FALSE;
+ }
+ g_free (tmp);
+
+ tmp = g_match_info_fetch_named (match_info, "sessionunixuser");
+ if (tmp != NULL) {
+ gulong l;
+ if (parse_value_as_ulong (tmp, &l)) {
+ e->session_unix_user = l;
+ }
+ }
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_session_removed (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ char *tmp;
+ CkLogSeatSessionRemovedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' session-id='(?P<sessionid>[a-zA-Z0-9/]+)' session-type='(?P<sessiontype>[a-zA-Z0-9 ]*)' session-x11-display='(?P<sessionx11display>[0-9a-zA-Z.:]*)' session-x11-display-device='(?P<sessionx11displaydevice>[^']*)' session-display-device='(?P<sessiondisplaydevice>[^']*)' session-remote-host-name='(?P<sessionremovehostname>[^']*)' session-is-local=(?P<sessionislocal>[a-zA-Z]*) session-unix-user=(?P<sessionunixuser>[0-9]*) session-creation-time='(?P<sessioncreationtime>[^']*)'", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatSessionRemovedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+ e->session_id = g_match_info_fetch_named (match_info, "sessionid");
+ e->session_type = g_match_info_fetch_named (match_info, "sessiontype");
+ e->session_x11_display = g_match_info_fetch_named (match_info, "sessionx11display");
+ e->session_x11_display_device = g_match_info_fetch_named (match_info, "sessionx11displaydevice");
+ e->session_display_device = g_match_info_fetch_named (match_info, "sessiondisplaydevice");
+ e->session_remote_host_name = g_match_info_fetch_named (match_info, "sessionremotehostname");
+ e->session_creation_time = g_match_info_fetch_named (match_info, "sessioncreationtime");
+
+ tmp = g_match_info_fetch_named (match_info, "sessionislocal");
+ if (tmp != NULL && strcmp (tmp, "TRUE") == 0) {
+ e->session_is_local = TRUE;
+ } else {
+ e->session_is_local = FALSE;
+ }
+ g_free (tmp);
+
+ tmp = g_match_info_fetch_named (match_info, "sessionunixuser");
+ if (tmp != NULL) {
+ gulong l;
+ if (parse_value_as_ulong (tmp, &l)) {
+ e->session_unix_user = l;
+ }
+ }
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_active_session_changed (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ CkLogSeatActiveSessionChangedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' session-id='(?P<sessionid>[a-zA-Z0-9/]*)'", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatActiveSessionChangedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+ e->session_id = g_match_info_fetch_named (match_info, "sessionid");
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_device_added (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ CkLogSeatDeviceAddedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' device-id='(?P<deviceid>[^']+)' device-type='(?P<devicetype>[^']+)'", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatDeviceAddedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+ e->device_id = g_match_info_fetch_named (match_info, "deviceid");
+ e->device_type = g_match_info_fetch_named (match_info, "devicetype");
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_seat_device_removed (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ char *s;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+ CkLogSeatDeviceRemovedEvent *e;
+
+ re = NULL;
+ match_info = NULL;
+ ret = FALSE;
+
+ s = skip_header (str->str, str->len);
+ if (s == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ re = g_regex_new ("seat-id='(?P<seatid>[a-zA-Z0-9/]+)' device-id='(?P<deviceid>[^']+)' device-type='(?P<devicetype>[^']+)'", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, s, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse event: %s", s);
+ goto out;
+ }
+
+ e = (CkLogSeatDeviceRemovedEvent *)event;
+ e->seat_id = g_match_info_fetch_named (match_info, "seatid");
+ e->device_id = g_match_info_fetch_named (match_info, "deviceid");
+ e->device_type = g_match_info_fetch_named (match_info, "devicetype");
+
+ ret = TRUE;
+ out:
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ return ret;
+}
+
+static gboolean
+parse_log_for_any (const GString *str,
+ CkLogEvent *event)
+{
+ gboolean ret;
+ int res;
+ gulong sec;
+ guint frac;
+ char buf[32];
+
+ ret = FALSE;
+
+ res = sscanf (str->str, "%lu.%u type=%30s :",
+ &sec,
+ &frac,
+ buf);
+ if (res == 3) {
+ res = event_name_to_type (buf, &event->type);
+ if (! res) {
+ goto out;
+ }
+
+ event->timestamp.tv_sec = sec;
+ event->timestamp.tv_usec = 1000 * frac;
+
+ ret = TRUE;
+ }
+ out:
+ return ret;
+}
+
+gboolean
+ck_log_event_fill_from_string (CkLogEvent *event,
+ const GString *str)
+{
+ gboolean res;
+ gboolean ret;
+
+ g_return_val_if_fail (str != NULL, FALSE);
+
+ ret = FALSE;
+
+ res = parse_log_for_any (str, event);
+ if (! res) {
+ goto out;
+ }
+
+ switch (event->type) {
+ case CK_LOG_EVENT_SEAT_ADDED:
+ res = parse_log_for_seat_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_REMOVED:
+ res = parse_log_for_seat_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_ADDED:
+ res = parse_log_for_seat_session_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_SESSION_REMOVED:
+ res = parse_log_for_seat_session_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_ADDED:
+ res = parse_log_for_seat_device_added (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_DEVICE_REMOVED:
+ res = parse_log_for_seat_device_removed (str, event);
+ break;
+ case CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED:
+ res = parse_log_for_seat_active_session_changed (str, event);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ if (! res) {
+ goto out;
+ }
+ ret = TRUE;
+ out:
+ return ret;
+}
+
+CkLogEvent *
+ck_log_event_new_from_string (const GString *str)
+{
+ CkLogEvent *event;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ event = g_new0 (CkLogEvent, 1);
+ ck_log_event_fill_from_string (event, str);
+
+ return event;
+}
diff --git a/src/ck-log-event.h b/src/ck-log-event.h
new file mode 100644
index 0000000..f5defed
--- /dev/null
+++ b/src/ck-log-event.h
@@ -0,0 +1,131 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __CK_LOG_EVENT_H
+#define __CK_LOG_EVENT_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+ CK_LOG_EVENT_START = 0,
+ CK_LOG_EVENT_STOP,
+ CK_LOG_EVENT_SYSTEM_SHUTDOWN,
+ CK_LOG_EVENT_SYSTEM_RUNLEVEL_CHANGED,
+ CK_LOG_EVENT_SEAT_ADDED,
+ CK_LOG_EVENT_SEAT_REMOVED,
+ CK_LOG_EVENT_SEAT_SESSION_ADDED,
+ CK_LOG_EVENT_SEAT_SESSION_REMOVED,
+ CK_LOG_EVENT_SEAT_DEVICE_ADDED,
+ CK_LOG_EVENT_SEAT_DEVICE_REMOVED,
+ CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED,
+} CkLogEventType;
+
+typedef struct
+{
+ char *seat_id;
+ int seat_kind;
+} CkLogSeatAddedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ int seat_kind;
+} CkLogSeatRemovedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ char *session_id;
+ char *session_type;
+ char *session_x11_display;
+ char *session_x11_display_device;
+ char *session_display_device;
+ char *session_remote_host_name;
+ gboolean session_is_local;
+ guint session_unix_user;
+ char *session_creation_time;
+} CkLogSeatSessionAddedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ char *session_id;
+ char *session_type;
+ char *session_x11_display;
+ char *session_x11_display_device;
+ char *session_display_device;
+ char *session_remote_host_name;
+ gboolean session_is_local;
+ guint session_unix_user;
+ char *session_creation_time;
+} CkLogSeatSessionRemovedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ char *session_id;
+} CkLogSeatActiveSessionChangedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ char *device_type;
+ char *device_id;
+} CkLogSeatDeviceAddedEvent;
+
+typedef struct
+{
+ char *seat_id;
+ char *device_type;
+ char *device_id;
+} CkLogSeatDeviceRemovedEvent;
+
+typedef struct
+{
+ union {
+ CkLogSeatAddedEvent seat_added;
+ CkLogSeatRemovedEvent seat_removed;
+ CkLogSeatSessionAddedEvent seat_session_added;
+ CkLogSeatSessionRemovedEvent seat_session_removed;
+ CkLogSeatActiveSessionChangedEvent seat_active_session_changed;
+ CkLogSeatDeviceAddedEvent seat_device_added;
+ CkLogSeatDeviceRemovedEvent seat_device_removed;
+ } event;
+
+ GTimeVal timestamp;
+ CkLogEventType type;
+} CkLogEvent;
+
+CkLogEvent * ck_log_event_copy (CkLogEvent *event);
+void ck_log_event_free (CkLogEvent *event);
+
+CkLogEvent * ck_log_event_new_from_string (const GString *str);
+gboolean ck_log_event_fill_from_string (CkLogEvent *event,
+ const GString *str);
+
+void ck_log_event_to_string (CkLogEvent *event,
+ GString *str);
+
+G_END_DECLS
+
+#endif /* __CK_LOG_EVENT_H */
diff --git a/src/ck-manager.c b/src/ck-manager.c
index b3f1b63..0dba42a 100644
--- a/src/ck-manager.c
+++ b/src/ck-manager.c
@@ -394,15 +394,15 @@ static void
log_seat_added_event (CkManager *manager,
CkSeat *seat)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
CkSeatKind seat_kind;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_ADDED;
+ event.type = CK_LOG_EVENT_SEAT_ADDED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -426,15 +426,15 @@ static void
log_seat_removed_event (CkManager *manager,
CkSeat *seat)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
CkSeatKind seat_kind;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_REMOVED;
+ event.type = CK_LOG_EVENT_SEAT_REMOVED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -459,15 +459,15 @@ log_seat_session_added_event (CkManager *manager,
CkSeat *seat,
const char *ssid)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
CkSession *session;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED;
+ event.type = CK_LOG_EVENT_SEAT_SESSION_ADDED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -514,15 +514,15 @@ log_seat_session_removed_event (CkManager *manager,
CkSeat *seat,
const char *ssid)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
CkSession *session;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_SESSION_REMOVED;
+ event.type = CK_LOG_EVENT_SEAT_SESSION_REMOVED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -568,14 +568,14 @@ log_seat_active_session_changed_event (CkManager *manager,
CkSeat *seat,
const char *ssid)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_ACTIVE_SESSION_CHANGED;
+ event.type = CK_LOG_EVENT_SEAT_ACTIVE_SESSION_CHANGED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -599,7 +599,7 @@ log_seat_device_added_event (CkManager *manager,
CkSeat *seat,
GValueArray *device)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
@@ -607,9 +607,9 @@ log_seat_device_added_event (CkManager *manager,
char *device_id;
char *device_type;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_ADDED;
+ event.type = CK_LOG_EVENT_SEAT_DEVICE_ADDED;
g_get_current_time (&event.timestamp);
sid = NULL;
@@ -647,7 +647,7 @@ log_seat_device_removed_event (CkManager *manager,
CkSeat *seat,
GValueArray *device)
{
- CkEventLoggerEvent event;
+ CkLogEvent event;
gboolean res;
GError *error;
char *sid;
@@ -655,9 +655,9 @@ log_seat_device_removed_event (CkManager *manager,
char *device_id;
char *device_type;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_DEVICE_REMOVED;
+ event.type = CK_LOG_EVENT_SEAT_DEVICE_REMOVED;
g_get_current_time (&event.timestamp);
sid = NULL;
diff --git a/src/test-event-logger.c b/src/test-event-logger.c
index cc5d80b..e3d7db0 100644
--- a/src/test-event-logger.c
+++ b/src/test-event-logger.c
@@ -41,13 +41,13 @@
static gboolean
write_to_log (CkEventLogger *logger)
{
- CkEventLoggerEvent event;
- GError *error;
- gboolean res;
+ CkLogEvent event;
+ GError *error;
+ gboolean res;
- memset (&event, 0, sizeof (CkEventLoggerEvent));
+ memset (&event, 0, sizeof (CkLogEvent));
- event.type = CK_EVENT_LOGGER_EVENT_SEAT_SESSION_ADDED;
+ event.type = CK_LOG_EVENT_SEAT_SESSION_ADDED;
g_get_current_time (&event.timestamp);
event.event.seat_session_added.session_id = "Session1";
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 5283e18..ad9e589 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -26,6 +26,7 @@ INCLUDES = \
-DLIBEXECDIR=\""$(libexecdir)"\" \
-DDATADIR=\""$(datadir)"\" \
-DSYSCONFDIR=\""$(sysconfdir)"\" \
+ -DLOCALSTATEDIR=\""$(localstatedir)"\" \
$(WARN_CFLAGS) \
$(DEBUG_CFLAGS) \
$(DBUS_CFLAGS) \
@@ -33,6 +34,7 @@ INCLUDES = \
bin_PROGRAMS = \
ck-list-sessions \
+ ck-history \
$(NULL)
ck_list_sessions_SOURCES = \
@@ -43,6 +45,14 @@ ck_list_sessions_LDADD = \
$(CONSOLE_KIT_LIBS) \
$(NULL)
+ck_history_SOURCES = \
+ ck-history.c \
+ $(NULL)
+
+ck_history_LDADD = \
+ $(CONSOLE_KIT_LIBS) \
+ $(top_builddir)/src/libck-event-log.la \
+ $(NULL)
libexec_PROGRAMS = \
ck-collect-session-info \
diff --git a/tools/ck-history.c b/tools/ck-history.c
new file mode 100644
index 0000000..9584ee1
--- /dev/null
+++ b/tools/ck-history.c
@@ -0,0 +1,157 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <locale.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
+#include "ck-log-event.h"
+
+typedef enum {
+ REPORT_TYPE_SUMMARY = 0,
+} ReportType;
+
+#define DEFAULT_LOG_FILENAME LOCALSTATEDIR "/run/ConsoleKit/history"
+#define MAX_LINE_LEN 2048
+
+static GList *events = NULL;
+
+static gboolean
+process_event_line (const char *line)
+{
+ GString *str;
+ CkLogEvent *event;
+
+ str = g_string_new (line);
+ event = ck_log_event_new_from_string (str);
+ g_string_free (str, TRUE);
+
+ if (event != NULL) {
+ events = g_list_prepend (events, event);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+process_log_stream (FILE *fstream)
+{
+ char line[MAX_LINE_LEN];
+
+ while (fgets (line, sizeof (line), fstream) != NULL) {
+ if (strlen (line) == sizeof (line) - 1) {
+ g_warning ("Log line truncated");
+ }
+
+ process_event_line (line);
+ }
+
+ return TRUE;
+}
+
+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;
+ }
+
+ return process_log_stream (f);
+}
+
+static void
+generate_report (void)
+{
+ GList *l;
+
+ events = g_list_reverse (events);
+
+ for (l = events; l != NULL; l = l->next) {
+ CkLogEvent *event;
+ GString *str;
+
+ event = l->data;
+ str = g_string_new (NULL);
+ ck_log_event_to_string (event, str);
+ g_print ("%s\n", str->str);
+ g_string_free (str, TRUE);
+ }
+}
+
+static void
+free_events (void)
+{
+ /* FIXME: */
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GOptionContext *context;
+ gboolean retval;
+ GError *error = NULL;
+ static gboolean do_version = FALSE;
+ static GOptionEntry entries [] = {
+ { "version", 'V', 0, G_OPTION_ARG_NONE, &do_version, N_("Version of this application"), NULL },
+ { NULL }
+ };
+
+ context = g_option_context_new (NULL);
+ g_option_context_add_main_entries (context, entries, NULL);
+ retval = g_option_context_parse (context, &argc, &argv, &error);
+
+ g_option_context_free (context);
+
+ if (! retval) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ exit (1);
+ }
+
+ if (do_version) {
+ g_print ("%s %s\n", argv [0], VERSION);
+ exit (1);
+ }
+
+ process_log_file (DEFAULT_LOG_FILENAME);
+ generate_report ();
+ free_events ();
+
+ return 0;
+}
diff --git a/tools/list-sessions.c b/tools/list-sessions.c
index 75828ed..746c2f7 100644
--- a/tools/list-sessions.c
+++ b/tools/list-sessions.c
@@ -55,10 +55,10 @@ get_int (DBusGProxy *proxy,
gboolean res;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- method,
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ method,
+ &error,
+ G_TYPE_INVALID,
G_TYPE_INT, val,
G_TYPE_INVALID);
if (! res) {
@@ -78,10 +78,10 @@ get_path (DBusGProxy *proxy,
gboolean res;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- method,
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ method,
+ &error,
+ G_TYPE_INVALID,
DBUS_TYPE_G_OBJECT_PATH, str,
G_TYPE_INVALID);
if (! res) {
@@ -101,10 +101,10 @@ get_string (DBusGProxy *proxy,
gboolean res;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- method,
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ method,
+ &error,
+ G_TYPE_INVALID,
G_TYPE_STRING, str,
G_TYPE_INVALID);
if (! res) {
@@ -124,10 +124,10 @@ get_boolean (DBusGProxy *proxy,
gboolean res;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- method,
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ method,
+ &error,
+ G_TYPE_INVALID,
G_TYPE_BOOLEAN, value,
G_TYPE_INVALID);
if (! res) {
@@ -175,7 +175,7 @@ list_session (DBusGConnection *connection,
char *short_sid;
const char *short_ssid;
- proxy = dbus_g_proxy_new_for_name (connection,
+ proxy = dbus_g_proxy_new_for_name (connection,
CK_NAME,
ssid,
CK_SESSION_INTERFACE);
@@ -256,7 +256,7 @@ list_sessions (DBusGConnection *connection,
GPtrArray *sessions;
int i;
- proxy = dbus_g_proxy_new_for_name (connection,
+ proxy = dbus_g_proxy_new_for_name (connection,
CK_NAME,
sid,
CK_SEAT_INTERFACE);
@@ -267,13 +267,13 @@ list_sessions (DBusGConnection *connection,
sessions = NULL;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- "GetSessions",
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ "GetSessions",
+ &error,
+ G_TYPE_INVALID,
dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH),
&sessions,
- G_TYPE_INVALID);
+ G_TYPE_INVALID);
if (! res) {
g_warning ("Failed to get list of sessions for %s: %s", sid, error->message);
g_error_free (error);
@@ -315,13 +315,13 @@ list_seats (DBusGConnection *connection)
seats = NULL;
error = NULL;
- res = dbus_g_proxy_call (proxy,
- "GetSeats",
- &error,
- G_TYPE_INVALID,
+ res = dbus_g_proxy_call (proxy,
+ "GetSeats",
+ &error,
+ G_TYPE_INVALID,
dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH),
&seats,
- G_TYPE_INVALID);
+ G_TYPE_INVALID);
if (! res) {
g_warning ("Failed to get list of seats: %s", error->message);
g_error_free (error);
@@ -387,5 +387,5 @@ main (int argc,
list_seats (connection);
- return 0;
+ return 0;
}