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