177
177
assert(user || host);
179
179
if (user && host)
180
asprintf(&p, "exec:path=ssh,argv1=-xT,argv2=%s@%s,argv3=systemd-stdio-bridge", user, host);
180
asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s@%s,argv3=systemd-stdio-bridge", user, host);
182
asprintf(&p, "exec:path=ssh,argv1=-xT,argv2=%s@localhost,argv3=systemd-stdio-bridge", user);
182
asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s@localhost,argv3=systemd-stdio-bridge", user);
184
asprintf(&p, "exec:path=ssh,argv1=-xT,argv2=%s,argv3=systemd-stdio-bridge", host);
184
asprintf(&p, "unixexec:path=ssh,argv1=-xT,argv2=%s,argv3=systemd-stdio-bridge", host);
187
187
dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, NULL);
278
279
if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection, DBUS_TYPE_INVALID))
281
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "Get") && properties) {
282
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "Get") && bound_properties) {
282
283
const char *interface, *property;
284
const BusBoundProperties *bp;
283
285
const BusProperty *p;
287
DBusMessageIter iter, sub;
285
289
if (!dbus_message_get_args(
290
294
DBUS_TYPE_INVALID))
291
295
return bus_send_error_reply(c, message, &error, -EINVAL);
293
for (p = properties; p->property; p++)
294
if (streq(p->interface, interface) && streq(p->property, property))
298
DBusMessageIter iter, sub;
300
if (!(reply = dbus_message_new_method_return(message)))
303
dbus_message_iter_init_append(reply, &iter);
305
if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, p->signature, &sub))
308
if ((r = p->append(&sub, property, (void*) p->data)) < 0) {
313
dbus_message_unref(reply);
314
return bus_send_error_reply(c, message, NULL, r);
317
if (!dbus_message_iter_close_container(&iter, &sub))
320
if (!nulstr_contains(interfaces, interface))
321
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
323
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
325
return bus_send_error_reply(c, message, &error, -EINVAL);
328
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "GetAll") && properties) {
297
for (bp = bound_properties; bp->interface; bp++) {
298
if (!streq(bp->interface, interface))
301
for (p = bp->properties; p->property; p++)
302
if (streq(p->property, property))
307
if (!nulstr_contains(interfaces, interface))
308
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
310
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
312
return bus_send_error_reply(c, message, &error, -EINVAL);
315
reply = dbus_message_new_method_return(message);
319
dbus_message_iter_init_append(reply, &iter);
321
if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, p->signature, &sub))
324
data = (char*)bp->base + p->offset;
326
data = *(void**)data;
327
r = p->append(&sub, property, data);
332
dbus_message_unref(reply);
333
return bus_send_error_reply(c, message, NULL, r);
336
if (!dbus_message_iter_close_container(&iter, &sub))
339
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "GetAll") && bound_properties) {
329
340
const char *interface;
341
const BusBoundProperties *bp;
330
342
const BusProperty *p;
331
343
DBusMessageIter iter, sub, sub2, sub3;
350
362
if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub))
353
for (p = properties; p->property; p++) {
354
if (interface[0] && !streq(p->interface, interface))
365
for (bp = bound_properties; bp->interface; bp++) {
366
if (interface[0] && !streq(bp->interface, interface))
357
if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, NULL, &sub2) ||
358
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &p->property) ||
359
!dbus_message_iter_open_container(&sub2, DBUS_TYPE_VARIANT, p->signature, &sub3))
362
if ((r = p->append(&sub3, p->property, (void*) p->data)) < 0) {
367
dbus_message_unref(reply);
368
return bus_send_error_reply(c, message, NULL, r);
369
for (p = bp->properties; p->property; p++) {
372
if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, NULL, &sub2) ||
373
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &p->property) ||
374
!dbus_message_iter_open_container(&sub2, DBUS_TYPE_VARIANT, p->signature, &sub3))
377
data = (char*)bp->base + p->offset;
379
data = *(void**)data;
380
r = p->append(&sub3, p->property, data);
385
dbus_message_unref(reply);
386
return bus_send_error_reply(c, message, NULL, r);
389
if (!dbus_message_iter_close_container(&sub2, &sub3) ||
390
!dbus_message_iter_close_container(&sub, &sub2))
371
if (!dbus_message_iter_close_container(&sub2, &sub3) ||
372
!dbus_message_iter_close_container(&sub, &sub2))
376
395
if (!dbus_message_iter_close_container(&iter, &sub))
379
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "Set") && properties) {
398
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Properties", "Set") && bound_properties) {
380
399
const char *interface, *property;
381
400
DBusMessageIter iter;
401
const BusBoundProperties *bp;
382
402
const BusProperty *p;
384
406
if (!dbus_message_iter_init(message, &iter) ||
385
407
dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
398
420
dbus_message_iter_has_next(&iter))
399
421
return bus_send_error_reply(c, message, NULL, -EINVAL);
401
for (p = properties; p->property; p++)
402
if (streq(p->interface, interface) && streq(p->property, property))
409
dbus_message_iter_recurse(&iter, &sub);
411
if (!(sig = dbus_message_iter_get_signature(&sub)))
414
if (!streq(sig, p->signature)) {
416
return bus_send_error_reply(c, message, NULL, -EINVAL);
423
for (bp = bound_properties; bp->interface; bp++) {
424
if (!streq(bp->interface, interface))
427
for (p = bp->properties; p->property; p++)
428
if (streq(p->property, property))
433
if (!nulstr_contains(interfaces, interface))
434
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
436
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
438
return bus_send_error_reply(c, message, &error, -EINVAL);
442
dbus_set_error_const(&error, DBUS_ERROR_PROPERTY_READ_ONLY, "Property read-only");
443
return bus_send_error_reply(c, message, &error, -EINVAL);
446
dbus_message_iter_recurse(&iter, &sub);
448
sig = dbus_message_iter_get_signature(&sub);
452
if (!streq(sig, p->signature)) {
421
if ((r = p->set(&sub, property)) < 0) {
424
return bus_send_error_reply(c, message, NULL, r);
427
if (!(reply = dbus_message_new_method_return(message)))
454
return bus_send_error_reply(c, message, NULL, -EINVAL);
459
r = p->set(&sub, property);
431
dbus_set_error_const(&error, DBUS_ERROR_PROPERTY_READ_ONLY, "Property read-only");
432
else if (!nulstr_contains(interfaces, interface))
433
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_INTERFACE, "Unknown interface");
435
dbus_set_error_const(&error, DBUS_ERROR_UNKNOWN_PROPERTY, "Unknown property");
437
return bus_send_error_reply(c, message, &error, -EINVAL);
463
return bus_send_error_reply(c, message, NULL, r);
466
reply = dbus_message_new_method_return(message);
441
470
const char *interface = dbus_message_get_interface(message);