X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-session-device.c;h=6c65607b9fd9fd0808140af50f793162446bf86f;hb=33ca31d7107330a9f5ddf26720fccbe623da5176;hp=6605935f3c768d395a5de1ccc285429abc560f52;hpb=3a83f5223acbeb1235310798c4d3660121c8880f;p=elogind.git diff --git a/src/login/logind-session-device.c b/src/login/logind-session-device.c index 6605935f3..6c65607b9 100644 --- a/src/login/logind-session-device.c +++ b/src/login/logind-session-device.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,21 +17,24 @@ along with systemd; If not, see . ***/ -#include #include -#include #include -#include #include #include -#include #include -#include -#include "dbus-common.h" +#if 0 /// elogind needs the systems udev header +#include "libudev.h" +#else +#include +#endif // 0 + +#include "alloc-util.h" +#include "bus-util.h" +#include "fd-util.h" #include "logind-session-device.h" -#include "util.h" #include "missing.h" +#include "util.h" enum SessionDeviceNotifications { SESSION_DEVICE_RESUME, @@ -42,11 +43,12 @@ enum SessionDeviceNotifications { SESSION_DEVICE_RELEASE, }; -static void session_device_notify(SessionDevice *sd, enum SessionDeviceNotifications type) { - _cleanup_dbus_message_unref_ DBusMessage *m = NULL; +static int session_device_notify(SessionDevice *sd, enum SessionDeviceNotifications type) { + _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; _cleanup_free_ char *path = NULL; const char *t = NULL; uint32_t major, minor; + int r; assert(sd); @@ -54,29 +56,29 @@ static void session_device_notify(SessionDevice *sd, enum SessionDeviceNotificat minor = minor(sd->dev); if (!sd->session->controller) - return; + return 0; path = session_bus_path(sd->session); if (!path) - return; + return -ENOMEM; - m = dbus_message_new_signal(path, - "org.freedesktop.login1.Session", - (type == SESSION_DEVICE_RESUME) ? "ResumeDevice" : "PauseDevice"); + r = sd_bus_message_new_signal( + sd->session->manager->bus, + &m, path, + "org.freedesktop.login1.Session", + (type == SESSION_DEVICE_RESUME) ? "ResumeDevice" : "PauseDevice"); if (!m) - return; + return r; - if (!dbus_message_set_destination(m, sd->session->controller)) - return; + r = sd_bus_message_set_destination(m, sd->session->controller); + if (r < 0) + return r; switch (type) { case SESSION_DEVICE_RESUME: - if (!dbus_message_append_args(m, - DBUS_TYPE_UINT32, &major, - DBUS_TYPE_UINT32, &minor, - DBUS_TYPE_UNIX_FD, &sd->fd, - DBUS_TYPE_INVALID)) - return; + r = sd_bus_message_append(m, "uuh", major, minor, sd->fd); + if (r < 0) + return r; break; case SESSION_DEVICE_TRY_PAUSE: t = "pause"; @@ -88,17 +90,16 @@ static void session_device_notify(SessionDevice *sd, enum SessionDeviceNotificat t = "gone"; break; default: - return; + return -EINVAL; } - if (t && !dbus_message_append_args(m, - DBUS_TYPE_UINT32, &major, - DBUS_TYPE_UINT32, &minor, - DBUS_TYPE_STRING, &t, - DBUS_TYPE_INVALID)) - return; + if (t) { + r = sd_bus_message_append(m, "uus", major, minor, t); + if (r < 0) + return r; + } - dbus_connection_send(sd->session->manager->bus, m, NULL); + return sd_bus_send(sd->session->manager->bus, m, NULL); } static int sd_eviocrevoke(int fd) { @@ -107,7 +108,7 @@ static int sd_eviocrevoke(int fd) { assert(fd >= 0); - r = ioctl(fd, EVIOCREVOKE, 1); + r = ioctl(fd, EVIOCREVOKE, NULL); if (r < 0) { r = -errno; if (r == -EINVAL && !warned) { @@ -162,7 +163,7 @@ static int session_device_open(SessionDevice *sd, bool active) { * state. */ r = sd_drmsetmaster(fd); if (r < 0) { - close(fd); + close_nointr(fd); return r; } } else { @@ -209,7 +210,7 @@ static int session_device_start(SessionDevice *sd) { r = session_device_open(sd, true); if (r < 0) return r; - close_nointr_nofail(sd->fd); + close_nointr(sd->fd); sd->fd = r; break; case DEVICE_TYPE_UNKNOWN: @@ -390,7 +391,7 @@ int session_device_new(Session *s, dev_t dev, SessionDevice **out) { } sd->fd = r; - LIST_PREPEND(SessionDevice, sd_by_device, sd->device->session_devices, sd); + LIST_PREPEND(sd_by_device, sd->device->session_devices, sd); *out = sd; return 0; @@ -407,9 +408,9 @@ void session_device_free(SessionDevice *sd) { session_device_stop(sd); session_device_notify(sd, SESSION_DEVICE_RELEASE); - close_nointr_nofail(sd->fd); + close_nointr(sd->fd); - LIST_REMOVE(SessionDevice, sd_by_device, sd->device->session_devices, sd); + LIST_REMOVE(sd_by_device, sd->device->session_devices, sd); hashmap_remove(sd->session->devices, &sd->dev);