1*a9da3307Snp /*************************************************************************** 2*a9da3307Snp * 3*a9da3307Snp * adt_data.c : Provides Audit functionalities 4*a9da3307Snp * 5*a9da3307Snp * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 6*a9da3307Snp * Use is subject to license terms. 7*a9da3307Snp * 8*a9da3307Snp * Licensed under the Academic Free License version 2.1 9*a9da3307Snp * 10*a9da3307Snp ***************************************************************************/ 11*a9da3307Snp 12*a9da3307Snp #pragma ident "%Z%%M% %I% %E% SMI" 13*a9da3307Snp 14*a9da3307Snp #include <stdio.h> 15*a9da3307Snp #include <errno.h> 16*a9da3307Snp #include <string.h> 17*a9da3307Snp #include <stdlib.h> 18*a9da3307Snp #include <glib.h> 19*a9da3307Snp #include <dbus/dbus-glib-lowlevel.h> 20*a9da3307Snp #include <dbus/dbus-glib.h> 21*a9da3307Snp #include "../hald/logger.h" 22*a9da3307Snp #include "adt_data.h" 23*a9da3307Snp 24*a9da3307Snp adt_export_data_t * 25*a9da3307Snp get_audit_export_data(DBusConnection *bus, const char *invoked_by_syscon_name, size_t *data_size) 26*a9da3307Snp { 27*a9da3307Snp DBusMessage *message; 28*a9da3307Snp DBusMessage *reply; 29*a9da3307Snp DBusMessageIter iter, subiter; 30*a9da3307Snp DBusError error; 31*a9da3307Snp int count, bufsize; 32*a9da3307Snp uchar_t *buf; 33*a9da3307Snp uchar_t value; 34*a9da3307Snp 35*a9da3307Snp message = dbus_message_new_method_call ("org.freedesktop.DBus", 36*a9da3307Snp "/org/freedesktop/DBus", 37*a9da3307Snp "org.freedesktop.DBus", 38*a9da3307Snp "GetAuditSessionData"); 39*a9da3307Snp if (message == NULL) { 40*a9da3307Snp HAL_INFO (("cannot get GetAuditSessionData message\n")); 41*a9da3307Snp return NULL; 42*a9da3307Snp } 43*a9da3307Snp 44*a9da3307Snp if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &invoked_by_syscon_name, 45*a9da3307Snp DBUS_TYPE_INVALID)) { 46*a9da3307Snp dbus_message_unref(message); 47*a9da3307Snp return NULL; 48*a9da3307Snp } 49*a9da3307Snp 50*a9da3307Snp dbus_error_init (&error); 51*a9da3307Snp reply = dbus_connection_send_with_reply_and_block (bus, 52*a9da3307Snp message, -1, 53*a9da3307Snp &error); 54*a9da3307Snp if (dbus_error_is_set (&error)) { 55*a9da3307Snp HAL_INFO (("send failed %s\n", error.message)); 56*a9da3307Snp dbus_error_free (&error); 57*a9da3307Snp dbus_message_unref (message); 58*a9da3307Snp return NULL; 59*a9da3307Snp } 60*a9da3307Snp if (reply == NULL) { 61*a9da3307Snp dbus_message_unref (message); 62*a9da3307Snp return NULL; 63*a9da3307Snp } 64*a9da3307Snp 65*a9da3307Snp dbus_message_iter_init (reply, &iter); 66*a9da3307Snp 67*a9da3307Snp if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY || 68*a9da3307Snp dbus_message_iter_get_element_type (&iter) != DBUS_TYPE_BYTE) { 69*a9da3307Snp HAL_INFO (("expecting an array of byte entries\n")); 70*a9da3307Snp dbus_message_unref (message); 71*a9da3307Snp dbus_message_unref (reply); 72*a9da3307Snp return NULL; 73*a9da3307Snp } 74*a9da3307Snp dbus_message_iter_recurse (&iter, &subiter); 75*a9da3307Snp 76*a9da3307Snp count = 0; 77*a9da3307Snp bufsize = 256; 78*a9da3307Snp buf = (uchar_t *)malloc (bufsize); 79*a9da3307Snp 80*a9da3307Snp while (dbus_message_iter_get_arg_type (&subiter) == DBUS_TYPE_BYTE) { 81*a9da3307Snp if (count == bufsize) { 82*a9da3307Snp bufsize += 256; 83*a9da3307Snp buf = realloc (buf, bufsize); 84*a9da3307Snp if (buf == NULL) { 85*a9da3307Snp dbus_message_unref (message); 86*a9da3307Snp dbus_message_unref (reply); 87*a9da3307Snp return NULL; 88*a9da3307Snp } 89*a9da3307Snp } 90*a9da3307Snp 91*a9da3307Snp dbus_message_iter_get_basic (&subiter, &value); 92*a9da3307Snp buf[count++] = value; 93*a9da3307Snp dbus_message_iter_next(&subiter); 94*a9da3307Snp } 95*a9da3307Snp 96*a9da3307Snp dbus_message_unref (message); 97*a9da3307Snp dbus_message_unref (reply); 98*a9da3307Snp 99*a9da3307Snp *data_size = count; 100*a9da3307Snp if (count == 0) { 101*a9da3307Snp free (buf); 102*a9da3307Snp buf = NULL; 103*a9da3307Snp } 104*a9da3307Snp 105*a9da3307Snp return (adt_export_data_t *)buf; 106*a9da3307Snp } 107