xref: /onnv-gate/usr/src/cmd/hal/utils/adt_data.c (revision 6654)
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