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
24 adt_export_data_t *
get_audit_export_data(DBusConnection * bus,const char * invoked_by_syscon_name,size_t * data_size)25 get_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