xref: /onnv-gate/usr/src/cmd/hal/utils/adt_data.c (revision 8098:e84186474398)
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 *
get_audit_export_data(DBusConnection * bus,const char * invoked_by_syscon_name,size_t * data_size)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",
38*8098SVipul.Jain@Sun.COM 						"GetAdtAuditSessionData");
396654Snp146283 	if (message == NULL) {
40*8098SVipul.Jain@Sun.COM 		printf ("cannot get GetAdtAuditSessionData 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)) {
556687Snp146283 		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) {
696687Snp146283 		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