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