]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
luo-util: use new LIVEUPDATE_SESSION_GET_NAME ioctl to get session name if available
authorLuca Boccassi <luca.boccassi@gmail.com>
Mon, 22 Jun 2026 15:33:23 +0000 (16:33 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 30 Jun 2026 08:15:58 +0000 (09:15 +0100)
Added in kernel 7.2. Fallback can be removed once baseline
moves above. Ubuntu 26.04 uses 7.0.

src/shared/luo-util.c

index 5de805e1f640e82c4c8473bf3d3cd7a5e08ef98d..c1ce23f5b9039f71819a7a3728c667dd231b54b2 100644 (file)
@@ -377,6 +377,26 @@ int luo_preserve_fd_stores(sd_json_variant *serialization, int *ret_session_fd)
         return 1;
 }
 
+static int luo_session_get_name(int session_fd, char **ret) {
+        struct liveupdate_session_get_name args = {
+                .size = sizeof(args),
+        };
+
+        assert(session_fd >= 0);
+
+        if (ioctl(session_fd, LIVEUPDATE_SESSION_GET_NAME, &args) < 0)
+                return -errno;
+
+        /* Paranonia check */
+        if (!memchr(args.name, 0, sizeof(args.name)))
+                return -EBADMSG;
+
+        if (ret)
+                return strdup_to(ret, (const char*) args.name);
+
+        return 0;
+}
+
 int fd_get_luo_session_name(int fd, char **ret) {
         _cleanup_free_ char *path = NULL;
         int r;
@@ -390,6 +410,14 @@ int fd_get_luo_session_name(int fd, char **ret) {
         if (r == 0)
                 return -EMEDIUMTYPE;
 
+        /* IOCTL is new in 7.2, fallback to parsing procfs */
+        // FIXME: drop fallback once baseline moves to 7.2+
+        r = luo_session_get_name(fd, ret);
+        if (r >= 0)
+                return 0;
+        if (!ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED(r))
+                return r;
+
         r = fd_get_path(fd, &path);
         if (r < 0)
                 return r;