chiark / gitweb /
basic/mkdir: convert bool flag to enum
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 22 Mar 2018 11:38:01 +0000 (12:38 +0100)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
In preparation for subsequent changes...

src/basic/mkdir-label.c
src/basic/mkdir.c
src/basic/mkdir.h
src/login/logind-dbus.c
src/login/logind-inhibit.c
src/login/logind-seat.c
src/login/logind-session.c
src/login/logind-user.c
src/test/test-fs-util.c

index 3fa642578b994c36a455fb405189e369e6f9838f..4e5b7c96195adb522461eedbab6b06f8c6d55188 100644 (file)
@@ -47,8 +47,8 @@ int mkdir_label(const char *path, mode_t mode) {
         return mac_smack_fix(path, false, false);
 }
 
-int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink) {
-        return mkdir_safe_internal(path, mode, uid, gid, follow_symlink, mkdir_label);
+int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags) {
+        return mkdir_safe_internal(path, mode, uid, gid, flags, mkdir_label);
 }
 
 #if 0 /// UNNEEDED by elogind
index 198d815c1cc30f7ffd0b68e37a85b768554cbb90..139318523f382bd9d0e77afe6ff44fd28dc7dbcb 100644 (file)
@@ -35,6 +35,7 @@
 #include "missing.h"
 
 int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink, mkdir_func_t _mkdir) {
+int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags, mkdir_func_t _mkdir) {
         struct stat st;
         int r;
 
@@ -49,14 +50,16 @@ int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, boo
         if (lstat(path, &st) < 0)
                 return -errno;
 
-        if (follow_symlink && S_ISLNK(st.st_mode)) {
+        if ((flags & MKDIR_FOLLOW_SYMLINK) && S_ISLNK(st.st_mode)) {
                 _cleanup_free_ char *p = NULL;
 
                 r = chase_symlinks(path, NULL, CHASE_NONEXISTENT, &p);
                 if (r < 0)
                         return r;
                 if (r == 0)
-                        return mkdir_safe_internal(p, mode, uid, gid, false, _mkdir);
+                        return mkdir_safe_internal(p, mode, uid, gid,
+                                                   flags & ~MKDIR_FOLLOW_SYMLINK,
+                                                   _mkdir);
 
                 if (lstat(p, &st) < 0)
                         return -errno;
@@ -79,8 +82,8 @@ int mkdir_errno_wrapper(const char *pathname, mode_t mode) {
         return 0;
 }
 
-int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink) {
-        return mkdir_safe_internal(path, mode, uid, gid, follow_symlink, mkdir_errno_wrapper);
+int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags) {
+        return mkdir_safe_internal(path, mode, uid, gid, flags, mkdir_errno_wrapper);
 }
 
 int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir) {
index 428cfb2a905c0837318cefd396e81507b77d0266..0f089bc725819acab7c4a0971710747c05e5a70d 100644 (file)
 
 #include <sys/types.h>
 
+typedef enum MkdirFlags {
+        MKDIR_FOLLOW_SYMLINK = 1 << 0,
+} MkdirFlags;
+
 int mkdir_errno_wrapper(const char *pathname, mode_t mode);
-int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink);
+int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
 int mkdir_parents(const char *path, mode_t mode);
 int mkdir_p(const char *path, mode_t mode);
 
 /* mandatory access control(MAC) versions */
-int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink);
+int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
 #if 0 /// UNNEEDED by elogind
 int mkdir_parents_label(const char *path, mode_t mode);
 #endif // 0
@@ -37,6 +41,6 @@ int mkdir_p_label(const char *path, mode_t mode);
 
 /* internally used */
 typedef int (*mkdir_func_t)(const char *pathname, mode_t mode);
-int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink, mkdir_func_t _mkdir);
+int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags, mkdir_func_t _mkdir);
 int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir);
 int mkdir_p_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir);
index 00a6a1e7b0ebfea81c98ba85f17abdd4233564b6..3da51259eeee60a6563c6a3418c9c32ab2b58930 100644 (file)
@@ -661,9 +661,10 @@ static int method_list_inhibitors(sd_bus_message *message, void *userdata, sd_bu
 
 static int method_create_session(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         const char *service, *type, *class, *cseat, *tty, *display, *remote_user, *remote_host, *desktop;
-        _cleanup_free_ char *unit = NULL, *id = NULL;
-        Session *session = NULL;
         uint32_t audit_id = 0;
+        _cleanup_free_ char *unit = NULL;
+        _cleanup_free_ char *id = NULL;
+        Session *session = NULL;
         Manager *m = userdata;
         User *user = NULL;
         Seat *seat = NULL;
@@ -687,7 +688,7 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
 
         if (!uid_is_valid(uid))
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid UID");
-        if (leader < 0 || leader == 1 || leader == getpid_cached())
+        if (leader < 0 || leader == 1)
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid leader PID");
 
         if (isempty(type))
@@ -733,7 +734,7 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
                 if (v <= 0)
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Cannot determine VT number from virtual console TTY %s", tty);
 
-                if (vtnr == 0)
+                if (!vtnr)
                         vtnr = (uint32_t) v;
                 else if (vtnr != (uint32_t) v)
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified TTY and VT number do not match");
@@ -751,7 +752,7 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
 
         if (seat) {
                 if (seat_has_vts(seat)) {
-                        if (vtnr <= 0 || vtnr > 63)
+                        if (!vtnr || vtnr > 63)
                                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "VT number out of range");
                 } else {
                         if (vtnr != 0)
@@ -791,13 +792,16 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
                         return r;
         }
 
-        /* Check if we are already in a logind session. Or if we are in user@.service which is a special PAM session
-         * that avoids creating a logind session. */
-        r = manager_get_user_by_pid(m, leader, NULL);
+        /*
+         * Check if we are already in a logind session.  Or if we are in user@.service
+         * which is a special PAM session that avoids creating a logind session.
+         */
+        r = cg_pid_get_unit(leader, &unit);
         if (r < 0)
                 return r;
-        if (r > 0)
-                return sd_bus_error_setf(error, BUS_ERROR_SESSION_BUSY, "Already running in a session or user slice");
+        if (hashmap_get(m->session_units, unit) ||
+            hashmap_get(m->user_units, unit))
+                return sd_bus_error_setf(error, BUS_ERROR_SESSION_BUSY, "Already running in a session");
 
         /*
          * Old gdm and lightdm start the user-session on the same VT as
@@ -831,8 +835,9 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
                  * the audit data and let's better register a new
                  * ID */
                 if (hashmap_get(m->sessions, id)) {
-                        log_warning("Existing logind session ID %s used by new audit session, ignoring.", id);
+                        log_warning("Existing logind session ID %s used by new audit session, ignoring", id);
                         audit_id = AUDIT_SESSION_INVALID;
+
                         id = mfree(id);
                 }
         }
@@ -925,7 +930,8 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus
         session->create_message = sd_bus_message_ref(message);
 
 #if 0 /// UNNEEDED by elogind
-        /* Now, let's wait until the slice unit and stuff got created. We send the reply back from
+        /* Now, let's wait until the slice unit and stuff got
+         * created. We send the reply back from
          * session_send_create_reply(). */
 #else
         /* We reply directly. */
@@ -1233,7 +1239,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu
 
         mkdir_p_label("/var/lib/elogind", 0755);
 
-        r = mkdir_safe_label("/var/lib/elogind/linger", 0755, 0, 0, false);
+        r = mkdir_safe_label("/var/lib/elogind/linger", 0755, 0, 0, 0);
         if (r < 0)
                 return r;
 
@@ -2078,7 +2084,7 @@ static int update_schedule_file(Manager *m) {
 
         assert(m);
 
-        r = mkdir_safe_label("/run/systemd/shutdown", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/systemd/shutdown", 0755, 0, 0, 0);
         if (r < 0)
                 return log_error_errno(r, "Failed to create shutdown subdirectory: %m");
 
@@ -3247,8 +3253,13 @@ int manager_start_scope(
                         return r;
         }
 
-        /* Make sure that the session shells are terminated with SIGHUP since bash and friends tend to ignore
-         * SIGTERM */
+        /* cgroup empty notification is not available in containers
+         * currently. To make this less problematic, let's shorten the
+         * stop timeout for sessions, so that we don't wait
+         * forever. */
+
+        /* Make sure that the session shells are terminated with
+         * SIGHUP since bash and friends tend to ignore SIGTERM */
         r = sd_bus_message_append(m, "(sv)", "SendSIGHUP", "b", true);
         if (r < 0)
                 return r;
index e14835292e6b75e5aca82c18495749ea09dbc748..0c84e5ed9d5ddd8f52c58222d08e1ab0ba71a875 100644 (file)
@@ -87,7 +87,7 @@ int inhibitor_save(Inhibitor *i) {
 
         assert(i);
 
-        r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, 0);
         if (r < 0)
                 goto fail;
 
@@ -291,7 +291,7 @@ int inhibitor_create_fifo(Inhibitor *i) {
 
         /* Create FIFO */
         if (!i->fifo_path) {
-                r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, false);
+                r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, 0);
                 if (r < 0)
                         return r;
 
index b109148e6efc366707f9b54b350ee755d741c17b..5cd9126b961ed005fd7f540d6044a89016014e69 100644 (file)
@@ -95,7 +95,7 @@ int seat_save(Seat *s) {
         if (!s->started)
                 return 0;
 
-        r = mkdir_safe_label("/run/systemd/seats", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/systemd/seats", 0755, 0, 0, 0);
         if (r < 0)
                 goto fail;
 
@@ -566,7 +566,8 @@ void seat_complete_switch(Seat *s) {
         if (!s->pending_switch)
                 return;
 
-        session = TAKE_PTR(s->pending_switch);
+        session = s->pending_switch;
+        s->pending_switch = NULL;
 
         seat_set_active(s, session);
 }
index b03a89bbaf425f66d412e68797ee517f705d3d81..fdf22f3150cdeb2bd66826de8ad0eca4656ab2d6 100644 (file)
@@ -185,7 +185,7 @@ int session_save(Session *s) {
         if (!s->started)
                 return 0;
 
-        r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, 0);
         if (r < 0)
                 goto fail;
 
@@ -992,6 +992,7 @@ int session_create_fifo(Session *s) {
         /* Create FIFO */
         if (!s->fifo_path) {
                 r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, false);
+                r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, 0);
                 if (r < 0)
                         return r;
 
index 86bb494061d27e6f57858ed1815ee484bdd46960..daa4ab6a7c564e200d18125dfdb3b52fe84f53f8 100644 (file)
@@ -145,7 +145,7 @@ static int user_save_internal(User *u) {
         assert(u);
         assert(u->state_file);
 
-        r = mkdir_safe_label("/run/systemd/users", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/systemd/users", 0755, 0, 0, 0);
         if (r < 0)
                 goto fail;
 
@@ -343,7 +343,7 @@ static int user_mkdir_runtime_path(User *u) {
 
         assert(u);
 
-        r = mkdir_safe_label("/run/user", 0755, 0, 0, false);
+        r = mkdir_safe_label("/run/user", 0755, 0, 0, 0);
         if (r < 0)
                 return log_error_errno(r, "Failed to create /run/user: %m");
 
index 62a3f162263e11f3922f4731efdb9c2a08f964ec..6fd756752d35a5a08d0f4793bf8b76837caa9d3c 100644 (file)
@@ -317,7 +317,7 @@ static void test_readlink_and_make_absolute(void) {
         char *r = NULL;
         _cleanup_free_ char *pwd = NULL;
 
-        assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid(), false) >= 0);
+        assert_se(mkdir_safe(tempdir, 0755, getuid(), getgid(), 0) >= 0);
         assert_se(touch(name) >= 0);
 
         assert_se(symlink(name, name_alias) >= 0);