~ubuntu-branches/ubuntu/maverick/hal/maverick

« back to all changes in this revision

Viewing changes to hald-runner/main.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2007-10-23 12:33:58 UTC
  • mto: (1.5.1 sid)
  • mto: This revision was merged to the branch mainline in revision 90.
  • Revision ID: james.westby@ubuntu.com-20071023123358-xaf8mjc5n84d5gtz
Tags: upstream-0.5.10
ImportĀ upstreamĀ versionĀ 0.5.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 * main.c - Main dbus interface of the hald runner
5
5
 *
6
6
 * Copyright (C) 2006 Sjoerd Simons, <sjoerd@luon.net>
 
7
 * Copyright (C) 2007 Codethink Ltd. Author Rob Taylor <rob.taylor@codethink.co.uk>
7
8
 *
8
9
 * Licensed under the Academic Free License version 2.1
9
10
 *
36
37
#endif
37
38
 
38
39
static gboolean
39
 
parse_first_part(run_request *r, DBusMessage *msg, DBusMessageIter *iter)
 
40
parse_udi (run_request *r, DBusMessage *msg, DBusMessageIter *iter)
40
41
{
41
 
        DBusMessageIter sub_iter;
42
42
        char *tmpstr;
43
43
 
44
 
        /* First should be the device UDI */
 
44
        /* Should be the device UDI */
45
45
        if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) 
46
46
                goto malformed;
47
47
        dbus_message_iter_get_basic(iter, &tmpstr);
48
48
        r->udi = g_strdup(tmpstr);
49
49
 
50
 
        /* Then the environment array */
51
 
        if (!dbus_message_iter_next(iter) || dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
 
50
        if (!dbus_message_iter_next(iter))
 
51
                goto malformed;
 
52
 
 
53
        return TRUE;
 
54
 
 
55
malformed:
 
56
        return FALSE;
 
57
}
 
58
 
 
59
static gboolean
 
60
parse_environment(run_request *r, DBusMessage *msg, DBusMessageIter *iter)
 
61
{
 
62
        DBusMessageIter sub_iter;
 
63
        char *tmpstr;
 
64
 
 
65
        /* The environment array */
 
66
        if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
52
67
                goto malformed;
53
68
        dbus_message_iter_recurse(iter, &sub_iter);
54
69
        /* Add default path for the programs we start */
82
97
        r = new_run_request();
83
98
        g_assert(dbus_message_iter_init(msg, &iter));
84
99
 
85
 
        if (!parse_first_part(r, msg, &iter)) 
 
100
        if (!parse_udi(r, msg, &iter))
 
101
                goto malformed;
 
102
 
 
103
        if (!parse_environment(r, msg, &iter))
86
104
                goto malformed;
87
105
 
88
106
        /* Next a string of what should be written to stdin */
114
132
}
115
133
 
116
134
static void
117
 
handle_start(DBusConnection *con, DBusMessage *msg)
 
135
handle_start(DBusConnection *con, DBusMessage *msg, gboolean is_singleton)
118
136
{
119
137
        DBusMessage *reply;
120
138
        DBusMessageIter iter;
122
140
        GPid pid __attribute__ ((aligned));
123
141
 
124
142
        r = new_run_request();
 
143
        r->is_singleton = is_singleton;
 
144
 
125
145
        g_assert(dbus_message_iter_init(msg, &iter));
126
146
 
127
 
        if (!dbus_message_iter_init(msg, &iter) || !parse_first_part(r, msg, &iter))
128
 
                goto malformed;
 
147
        if (!dbus_message_iter_init(msg, &iter))
 
148
                goto malformed;
 
149
 
 
150
        if (!is_singleton && !parse_udi(r, msg, &iter)) {
 
151
                fprintf(stderr, "error parsing udi");
 
152
                goto malformed;
 
153
        }
 
154
 
 
155
        if (!parse_environment(r, msg, &iter)) {
 
156
                fprintf(stderr, "error parsing environment");
 
157
                goto malformed;
 
158
        }
129
159
 
130
160
        if (run_request_run(r, con, NULL, &pid)) {
131
161
                reply = dbus_message_new_method_return(msg);
183
213
                handle_run(con, msg);
184
214
                return DBUS_HANDLER_RESULT_HANDLED;
185
215
        } else if (dbus_message_is_method_call(msg, "org.freedesktop.HalRunner", "Start")) {
186
 
                handle_start(con, msg);
 
216
                handle_start(con, msg, FALSE);
 
217
                return DBUS_HANDLER_RESULT_HANDLED;
 
218
        } else if (dbus_message_is_method_call(msg, "org.freedesktop.HalRunner", "StartSingleton")) {
 
219
                handle_start(con, msg, TRUE);
187
220
                return DBUS_HANDLER_RESULT_HANDLED;
188
221
        } else if (dbus_message_is_method_call(msg, "org.freedesktop.HalRunner", "Kill")) {
189
222
                handle_kill(con, msg);