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