16654Snp146283 /*************************************************************************** 26654Snp146283 * 36654Snp146283 * adt_data.c : Provides Audit functionalities 46654Snp146283 * 56654Snp146283 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 66654Snp146283 * Use is subject to license terms. 76654Snp146283 * 86654Snp146283 * Licensed under the Academic Free License version 2.1 96654Snp146283 * 106654Snp146283 ***************************************************************************/ 116654Snp146283 126654Snp146283 #pragma ident "%Z%%M% %I% %E% SMI" 136654Snp146283 146654Snp146283 #include <stdio.h> 156654Snp146283 #include <errno.h> 166654Snp146283 #include <string.h> 176654Snp146283 #include <stdlib.h> 186654Snp146283 #include <glib.h> 196654Snp146283 #include <dbus/dbus-glib-lowlevel.h> 206654Snp146283 #include <dbus/dbus-glib.h> 216654Snp146283 #include "../hald/logger.h" 226654Snp146283 #include "adt_data.h" 236654Snp146283 246654Snp146283 adt_export_data_t * 256654Snp146283 get_audit_export_data(DBusConnection *bus, const char *invoked_by_syscon_name, size_t *data_size) 266654Snp146283 { 276654Snp146283 DBusMessage *message; 286654Snp146283 DBusMessage *reply; 296654Snp146283 DBusMessageIter iter, subiter; 306654Snp146283 DBusError error; 316654Snp146283 int count, bufsize; 326654Snp146283 uchar_t *buf; 336654Snp146283 uchar_t value; 346654Snp146283 356654Snp146283 message = dbus_message_new_method_call ("org.freedesktop.DBus", 366654Snp146283 "/org/freedesktop/DBus", 376654Snp146283 "org.freedesktop.DBus", 386654Snp146283 "GetAuditSessionData"); 396654Snp146283 if (message == NULL) { 40*6687Snp146283 printf ("cannot get GetAuditSessionData message\n"); 416654Snp146283 return NULL; 426654Snp146283 } 436654Snp146283 446654Snp146283 if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &invoked_by_syscon_name, 456654Snp146283 DBUS_TYPE_INVALID)) { 466654Snp146283 dbus_message_unref(message); 476654Snp146283 return NULL; 486654Snp146283 } 496654Snp146283 506654Snp146283 dbus_error_init (&error); 516654Snp146283 reply = dbus_connection_send_with_reply_and_block (bus, 526654Snp146283 message, -1, 536654Snp146283 &error); 546654Snp146283 if (dbus_error_is_set (&error)) { 55*6687Snp146283 printf ("send failed %s\n", error.message); 566654Snp146283 dbus_error_free (&error); 576654Snp146283 dbus_message_unref (message); 586654Snp146283 return NULL; 596654Snp146283 } 606654Snp146283 if (reply == NULL) { 616654Snp146283 dbus_message_unref (message); 626654Snp146283 return NULL; 636654Snp146283 } 646654Snp146283 656654Snp146283 dbus_message_iter_init (reply, &iter); 666654Snp146283 676654Snp146283 if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_ARRAY || 686654Snp146283 dbus_message_iter_get_element_type (&iter) != DBUS_TYPE_BYTE) { 69*6687Snp146283 printf ("expecting an array of byte entries\n"); 706654Snp146283 dbus_message_unref (message); 716654Snp146283 dbus_message_unref (reply); 726654Snp146283 return NULL; 736654Snp146283 } 746654Snp146283 dbus_message_iter_recurse (&iter, &subiter); 756654Snp146283 766654Snp146283 count = 0; 776654Snp146283 bufsize = 256; 786654Snp146283 buf = (uchar_t *)malloc (bufsize); 796654Snp146283 806654Snp146283 while (dbus_message_iter_get_arg_type (&subiter) == DBUS_TYPE_BYTE) { 816654Snp146283 if (count == bufsize) { 826654Snp146283 bufsize += 256; 836654Snp146283 buf = realloc (buf, bufsize); 846654Snp146283 if (buf == NULL) { 856654Snp146283 dbus_message_unref (message); 866654Snp146283 dbus_message_unref (reply); 876654Snp146283 return NULL; 886654Snp146283 } 896654Snp146283 } 906654Snp146283 916654Snp146283 dbus_message_iter_get_basic (&subiter, &value); 926654Snp146283 buf[count++] = value; 936654Snp146283 dbus_message_iter_next(&subiter); 946654Snp146283 } 956654Snp146283 966654Snp146283 dbus_message_unref (message); 976654Snp146283 dbus_message_unref (reply); 986654Snp146283 996654Snp146283 *data_size = count; 1006654Snp146283 if (count == 0) { 1016654Snp146283 free (buf); 1026654Snp146283 buf = NULL; 1036654Snp146283 } 1046654Snp146283 1056654Snp146283 return (adt_export_data_t *)buf; 1066654Snp146283 } 107