a9da3307db733eb1739ba859952610bba3d894abnp/***************************************************************************
a9da3307db733eb1739ba859952610bba3d894abnp *
a9da3307db733eb1739ba859952610bba3d894abnp * adt_data.c : Provides Audit functionalities
a9da3307db733eb1739ba859952610bba3d894abnp *
a9da3307db733eb1739ba859952610bba3d894abnp * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
a9da3307db733eb1739ba859952610bba3d894abnp * Use is subject to license terms.
a9da3307db733eb1739ba859952610bba3d894abnp *
a9da3307db733eb1739ba859952610bba3d894abnp * Licensed under the Academic Free License version 2.1
a9da3307db733eb1739ba859952610bba3d894abnp *
a9da3307db733eb1739ba859952610bba3d894abnp ***************************************************************************/
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp#pragma ident "%Z%%M% %I% %E% SMI"
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp#include <stdio.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <errno.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <string.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <stdlib.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <glib.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <dbus/dbus-glib-lowlevel.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <dbus/dbus-glib.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include "../hald/logger.h"
a9da3307db733eb1739ba859952610bba3d894abnp#include "adt_data.h"
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnpadt_export_data_t *
a9da3307db733eb1739ba859952610bba3d894abnpget_audit_export_data(DBusConnection *bus, const char *invoked_by_syscon_name, size_t *data_size)
a9da3307db733eb1739ba859952610bba3d894abnp{
a9da3307db733eb1739ba859952610bba3d894abnp DBusMessage *message;
a9da3307db733eb1739ba859952610bba3d894abnp DBusMessage *reply;
a9da3307db733eb1739ba859952610bba3d894abnp DBusMessageIter iter, subiter;
a9da3307db733eb1739ba859952610bba3d894abnp DBusError error;
a9da3307db733eb1739ba859952610bba3d894abnp int count, bufsize;
a9da3307db733eb1739ba859952610bba3d894abnp uchar_t *buf;
a9da3307db733eb1739ba859952610bba3d894abnp uchar_t value;
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp message = dbus_message_new_method_call ("org.freedesktop.DBus",
a9da3307db733eb1739ba859952610bba3d894abnp "/org/freedesktop/DBus",
a9da3307db733eb1739ba859952610bba3d894abnp "org.freedesktop.DBus",
ee00db4f77eeb78f26ad3e9eb669f295f03e1725vj "GetAdtAuditSessionData");
a9da3307db733eb1739ba859952610bba3d894abnp if (message == NULL) {
ee00db4f77eeb78f26ad3e9eb669f295f03e1725vj printf ("cannot get GetAdtAuditSessionData message\n");
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &invoked_by_syscon_name,
a9da3307db733eb1739ba859952610bba3d894abnp DBUS_TYPE_INVALID)) {
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref(message);
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dbus_error_init (&error);
a9da3307db733eb1739ba859952610bba3d894abnp reply = dbus_connection_send_with_reply_and_block (bus,
a9da3307db733eb1739ba859952610bba3d894abnp message, -1,
a9da3307db733eb1739ba859952610bba3d894abnp &error);
a9da3307db733eb1739ba859952610bba3d894abnp if (dbus_error_is_set (&error)) {
eade8b27e8185317f75d0a41e3a1b0d620d3e99cnp printf ("send failed %s\n", error.message);
a9da3307db733eb1739ba859952610bba3d894abnp dbus_error_free (&error);
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (message);
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp if (reply == NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (message);
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_iter_init (reply, &iter);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY ||
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_iter_get_element_type (&iter) != DBUS_TYPE_BYTE) {
eade8b27e8185317f75d0a41e3a1b0d620d3e99cnp printf ("expecting an array of byte entries\n");
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (message);
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (reply);
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_iter_recurse (&iter, &subiter);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp count = 0;
a9da3307db733eb1739ba859952610bba3d894abnp bufsize = 256;
a9da3307db733eb1739ba859952610bba3d894abnp buf = (uchar_t *)malloc (bufsize);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp while (dbus_message_iter_get_arg_type (&subiter) == DBUS_TYPE_BYTE) {
a9da3307db733eb1739ba859952610bba3d894abnp if (count == bufsize) {
a9da3307db733eb1739ba859952610bba3d894abnp bufsize += 256;
a9da3307db733eb1739ba859952610bba3d894abnp buf = realloc (buf, bufsize);
a9da3307db733eb1739ba859952610bba3d894abnp if (buf == NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (message);
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (reply);
a9da3307db733eb1739ba859952610bba3d894abnp return NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_iter_get_basic (&subiter, &value);
a9da3307db733eb1739ba859952610bba3d894abnp buf[count++] = value;
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_iter_next(&subiter);
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (message);
a9da3307db733eb1739ba859952610bba3d894abnp dbus_message_unref (reply);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp *data_size = count;
a9da3307db733eb1739ba859952610bba3d894abnp if (count == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp free (buf);
a9da3307db733eb1739ba859952610bba3d894abnp buf = NULL;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp return (adt_export_data_t *)buf;
a9da3307db733eb1739ba859952610bba3d894abnp}