]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: add controlling tty field to sd_creds object
authorLennart Poettering <lennart@poettering.net>
Thu, 23 Apr 2015 17:43:40 +0000 (19:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 23 Apr 2015 17:43:40 +0000 (19:43 +0200)
This is useful to print wall messages from logind with the right client
tty. (to be added in a later patch)

src/libsystemd/libsystemd.sym.m4
src/libsystemd/sd-bus/bus-creds.c
src/libsystemd/sd-bus/bus-creds.h
src/libsystemd/sd-bus/bus-dump.c
src/systemd/sd-bus.h

index f2dfec7f0841369e255251e1c69c6d969c6d344a..098b6a0c7fcb7730f5c4e4b7f090a71345de7db6 100644 (file)
@@ -345,6 +345,7 @@ global:
         sd_bus_creds_get_selinux_context;
         sd_bus_creds_get_audit_session_id;
         sd_bus_creds_get_audit_login_uid;
+        sd_bus_creds_get_tty;
         sd_bus_creds_get_unique_name;
         sd_bus_creds_get_well_known_names;
         sd_bus_creds_get_description;
index a68b0d00eddd0684448d05e03870e73d1a841c49..8d02885d3b228b6e9015eba39e7e44dd354dab36 100644 (file)
@@ -25,6 +25,7 @@
 #include "util.h"
 #include "formats-util.h"
 #include "process-util.h"
+#include "terminal-util.h"
 #include "capability.h"
 #include "cgroup-util.h"
 #include "fileio.h"
@@ -54,6 +55,7 @@ void bus_creds_done(sd_bus_creds *c) {
         free(c->slice);
         free(c->unescaped_description);
         free(c->supplementary_gids);
+        free(c->tty);
 
         free(c->well_known_names); /* note that this is an strv, but
                                     * we only free the array, not the
@@ -543,6 +545,17 @@ _public_ int sd_bus_creds_get_audit_login_uid(sd_bus_creds *c, uid_t *uid) {
         return 0;
 }
 
+_public_ int sd_bus_creds_get_tty(sd_bus_creds *c, const char **ret) {
+        assert_return(c, -EINVAL);
+        assert_return(ret, -EINVAL);
+
+        if (!(c->mask & SD_BUS_CREDS_TTY))
+                return -ENODATA;
+
+        *ret = c->tty;
+        return 0;
+}
+
 _public_ int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **unique_name) {
         assert_return(c, -EINVAL);
         assert_return(unique_name, -EINVAL);
@@ -1008,6 +1021,15 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
                         c->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;
         }
 
+        if (missing & SD_BUS_CREDS_TTY) {
+                r = get_ctty(pid, NULL, &c->tty);
+                if (r < 0) {
+                        if (r != -EPERM && r != -EACCES && r != -ENOENT)
+                                return r;
+                } else
+                        c->mask |= SD_BUS_CREDS_TTY;
+        }
+
         c->augmented = missing & c->mask;
 
         return 0;
@@ -1166,6 +1188,16 @@ int bus_creds_extend_by_pid(sd_bus_creds *c, uint64_t mask, sd_bus_creds **ret)
                 n->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;
         }
 
+        if (c->mask & mask & SD_BUS_CREDS_TTY) {
+                if (c->tty) {
+                        n->tty = strdup(c->tty);
+                        if (!n->tty)
+                                return -ENOMEM;
+                } else
+                        n->tty = NULL;
+                n->mask |= SD_BUS_CREDS_TTY;
+        }
+
         if (c->mask & mask & SD_BUS_CREDS_UNIQUE_NAME) {
                 n->unique_name = strdup(c->unique_name);
                 if (!n->unique_name)
index 720450625cce06d5472c675220125aaf6165ff85..42f76b8971f42f51f0138db77ca6b2e9b1edc024 100644 (file)
@@ -62,6 +62,8 @@ struct sd_bus_creds {
         char *user_unit;
         char *slice;
 
+        char *tty;
+
         uint32_t *capability;
 
         uint32_t audit_session_id;
index 13ff8b956a11fd5b3b20af71d244ceb67107413b..396bf36f8a6afb465406a5f541c651516ee412d5 100644 (file)
@@ -364,8 +364,10 @@ int bus_creds_dump(sd_bus_creds *c, FILE *f, bool terse) {
                 fprintf(f, "%sTID=%s"PID_FMT"%s", prefix, color, c->tid, suffix);
         if (c->mask & SD_BUS_CREDS_PPID)
                 fprintf(f, "%sPPID=%s"PID_FMT"%s", prefix, color, c->ppid, suffix);
+        if (c->mask & SD_BUS_CREDS_TTY)
+                fprintf(f, "%sTTY=%s%s%s", prefix, color, strna(c->tty), suffix);
 
-        if (terse && ((c->mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID))))
+        if (terse && ((c->mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID|SD_BUS_CREDS_TTY))))
                 fputs("\n", f);
 
         if (c->mask & SD_BUS_CREDS_UID)
index 62dc45f8dd3200ed705c86053b6d9027dd23959b..d3588d5b65889c4d7d7d9a0b89459ea5f2d846fd 100644 (file)
@@ -84,11 +84,12 @@ enum {
         SD_BUS_CREDS_SELINUX_CONTEXT    = 1ULL << 26,
         SD_BUS_CREDS_AUDIT_SESSION_ID   = 1ULL << 27,
         SD_BUS_CREDS_AUDIT_LOGIN_UID    = 1ULL << 28,
-        SD_BUS_CREDS_UNIQUE_NAME        = 1ULL << 29,
-        SD_BUS_CREDS_WELL_KNOWN_NAMES   = 1ULL << 30,
-        SD_BUS_CREDS_DESCRIPTION        = 1ULL << 31,
+        SD_BUS_CREDS_TTY                = 1ULL << 29,
+        SD_BUS_CREDS_UNIQUE_NAME        = 1ULL << 30,
+        SD_BUS_CREDS_WELL_KNOWN_NAMES   = 1ULL << 31,
+        SD_BUS_CREDS_DESCRIPTION        = 1ULL << 32,
         SD_BUS_CREDS_AUGMENT            = 1ULL << 63, /* special flag, if on sd-bus will augment creds struct, in a potentially race-full way. */
-        _SD_BUS_CREDS_ALL               = (1ULL << 32) -1,
+        _SD_BUS_CREDS_ALL               = (1ULL << 33) -1,
 };
 
 enum {
@@ -361,6 +362,7 @@ int sd_bus_creds_has_bounding_cap(sd_bus_creds *c, int capability);
 int sd_bus_creds_get_selinux_context(sd_bus_creds *c, const char **context);
 int sd_bus_creds_get_audit_session_id(sd_bus_creds *c, uint32_t *sessionid);
 int sd_bus_creds_get_audit_login_uid(sd_bus_creds *c, uid_t *loginuid);
+int sd_bus_creds_get_tty(sd_bus_creds *c, const char **tty);
 int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **name);
 int sd_bus_creds_get_well_known_names(sd_bus_creds *c, char ***names);
 int sd_bus_creds_get_description(sd_bus_creds *c, const char **name);