chiark / gitweb /
logind: move default reset controller/kill exclude list into logind
[elogind.git] / src / logind-dbus.c
index 1ed99c0aa7e44c543d516b1df9bd9b6be3933c77..93525980b79dc3167efb76bf9660dd2a6adf23ca 100644 (file)
@@ -191,7 +191,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
         int r;
         char *id = NULL, *p;
         uint32_t vtnr = 0;
-        int pipe_fds[2] = { -1, -1 };
+        int fifo_fd = -1;
         DBusMessage *reply = NULL;
         bool b;
 
@@ -316,7 +316,8 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
         if (r < 0)
                 return -EINVAL;
 
-        if (!dbus_message_iter_next(&iter) ||
+        if (strv_contains(controllers, "systemd") ||
+            !dbus_message_iter_next(&iter) ||
             dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
             dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_STRING) {
                 r = -EINVAL;
@@ -327,7 +328,8 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
         if (r < 0)
                 goto fail;
 
-        if (!dbus_message_iter_next(&iter) ||
+        if (strv_contains(reset_controllers, "systemd") ||
+            !dbus_message_iter_next(&iter) ||
             dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BOOLEAN) {
                 r = -EINVAL;
                 goto fail;
@@ -353,6 +355,12 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
 
                 if (session) {
 
+                        fifo_fd = session_create_fifo(session);
+                        if (fifo_fd < 0) {
+                                r = fifo_fd;
+                                goto fail;
+                        }
+
                         /* Session already exists, client is probably
                          * something like "su" which changes uid but
                          * is still the same audit session */
@@ -363,15 +371,6 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                                 goto fail;
                         }
 
-                        /* Create a throw-away fd */
-                        if (pipe(pipe_fds) < 0) {
-                                r = -errno;
-                                goto fail;
-                        }
-
-                        close_nointr_nofail(pipe_fds[0]);
-                        pipe_fds[0] = -1;
-
                         p = session_bus_path(session);
                         if (!p) {
                                 r = -ENOMEM;
@@ -383,7 +382,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                                         DBUS_TYPE_STRING, &session->id,
                                         DBUS_TYPE_OBJECT_PATH, &p,
                                         DBUS_TYPE_STRING, &session->user->runtime_path,
-                                        DBUS_TYPE_UNIX_FD, &pipe_fds[1],
+                                        DBUS_TYPE_UNIX_FD, &fifo_fd,
                                         DBUS_TYPE_INVALID);
                         free(p);
 
@@ -392,7 +391,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                                 goto fail;
                         }
 
-                        close_nointr_nofail(pipe_fds[1]);
+                        close_nointr_nofail(fifo_fd);
                         *_reply = reply;
 
                         return 0;
@@ -467,16 +466,12 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                 }
         }
 
-        if (pipe(pipe_fds) < 0) {
-                r = -errno;
+        fifo_fd = session_create_fifo(session);
+        if (fifo_fd < 0) {
+                r = fifo_fd;
                 goto fail;
         }
 
-        r = session_set_pipe_fd(session, pipe_fds[0]);
-        if (r < 0)
-                goto fail;
-        pipe_fds[0] = -1;
-
         if (s) {
                 r = seat_attach_session(s, session);
                 if (r < 0)
@@ -504,7 +499,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                         DBUS_TYPE_STRING, &session->id,
                         DBUS_TYPE_OBJECT_PATH, &p,
                         DBUS_TYPE_STRING, &session->user->runtime_path,
-                        DBUS_TYPE_UNIX_FD, &pipe_fds[1],
+                        DBUS_TYPE_UNIX_FD, &fifo_fd,
                         DBUS_TYPE_INVALID);
         free(p);
 
@@ -513,7 +508,7 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
                 goto fail;
         }
 
-        close_nointr_nofail(pipe_fds[1]);
+        close_nointr_nofail(fifo_fd);
         *_reply = reply;
 
         return 0;
@@ -528,7 +523,8 @@ fail:
         if (user)
                 user_add_to_gc_queue(user);
 
-        close_pipe(pipe_fds);
+        if (fifo_fd >= 0)
+                close_nointr_nofail(fifo_fd);
 
         if (reply)
                 dbus_message_unref(reply);
@@ -542,6 +538,8 @@ static bool device_has_tag(struct udev_device *d, const char *tag) {
         assert(d);
         assert(tag);
 
+        udev_device_get_is_initialized(d);
+
         first = udev_device_get_tags_list_entry(d);
         udev_list_entry_foreach(item, first)
                 if (streq(udev_list_entry_get_name(item), tag))
@@ -553,8 +551,10 @@ static bool device_has_tag(struct udev_device *d, const char *tag) {
 static int attach_device(Manager *m, const char *seat, const char *sysfs) {
         struct udev_device *d;
         char *rule = NULL, *file = NULL;
-        const char *path;
+        const char *id_for_seat;
         int r;
+        struct udev_enumerate *e;
+        struct udev_list_entry *first, *item;
 
         assert(m);
         assert(seat);
@@ -569,23 +569,56 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) {
                 goto finish;
         }
 
-        path = udev_device_get_property_value(d, "ID_PATH");
-        if (!path) {
+        id_for_seat = udev_device_get_property_value(d, "ID_FOR_SEAT");
+        if (!id_for_seat) {
                 r = -ENODEV;
                 goto finish;
         }
 
-        if (asprintf(&file, "/etc/udev/rules.d/72-seat-%s.rules", path) < 0) {
+        if (asprintf(&file, "/etc/udev/rules.d/72-seat-%s.rules", id_for_seat) < 0) {
                 r = -ENOMEM;
                 goto finish;
         }
 
-        if (asprintf(&rule, "TAG==\"seat\", ID_PATH==\"%s\", ID_SEAT=\"%s\"", path, seat) < 0) {
+        if (asprintf(&rule, "TAG==\"seat\", ENV{ID_FOR_SEAT}==\"%s\", ENV{ID_SEAT}=\"%s\"", id_for_seat, seat) < 0) {
                 r = -ENOMEM;
                 goto finish;
         }
 
+        mkdir_p("/etc/udev/rules.d", 0755);
         r = write_one_line_file(file, rule);
+        if (r < 0)
+                goto finish;
+
+        e = udev_enumerate_new(m->udev);
+        if (!e) {
+                r = -ENOMEM;
+                goto finish;
+        }
+
+        if (udev_enumerate_scan_devices(e) < 0) {
+                r = -EIO;
+                goto finish;
+        }
+
+        first = udev_enumerate_get_list_entry(e);
+        udev_list_entry_foreach(item, first) {
+                char *t;
+                const char *p;
+
+                p = udev_list_entry_get_name(item);
+                if (!path_startswith(p, sysfs))
+                        continue;
+
+                t = strappend(p, "/uevent");
+                if (!t) {
+                        r = -ENOMEM;
+                        goto finish;
+                }
+
+                write_one_line_file(t, "change");
+                free(t);
+        }
 
 finish:
         free(rule);
@@ -594,6 +627,9 @@ finish:
         if (d)
                 udev_device_unref(d);
 
+        if (e)
+                udev_enumerate_unref(e);
+
         return r;
 }
 
@@ -607,6 +643,7 @@ static DBusHandlerResult manager_message_handler(
         const BusProperty properties[] = {
                 { "org.freedesktop.login1.Manager", "ControlGroupHierarchy",  bus_property_append_string,   "s",  m->cgroup_path          },
                 { "org.freedesktop.login1.Manager", "Controllers",            bus_property_append_strv,     "as", m->controllers          },
+                { "org.freedesktop.login1.Manager", "ResetControllers",       bus_property_append_strv,     "as", m->reset_controllers    },
                 { "org.freedesktop.login1.Manager", "NAutoVTs",               bus_property_append_unsigned, "u",  &m->n_autovts           },
                 { "org.freedesktop.login1.Manager", "KillOnlyUsers",          bus_property_append_strv,     "as", m->kill_only_users      },
                 { "org.freedesktop.login1.Manager", "KillExcludeUsers",       bus_property_append_strv,     "as", m->kill_exclude_users   },