diff options
-rw-r--r-- | src/libsystemd/libsystemd.sym.m4 | 1 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-creds.c | 32 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-creds.h | 2 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-dump.c | 4 | ||||
-rw-r--r-- | src/systemd/sd-bus.h | 10 |
5 files changed, 44 insertions, 5 deletions
diff --git a/src/libsystemd/libsystemd.sym.m4 b/src/libsystemd/libsystemd.sym.m4 index f2dfec7f08..098b6a0c7f 100644 --- a/src/libsystemd/libsystemd.sym.m4 +++ b/src/libsystemd/libsystemd.sym.m4 @@ -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; diff --git a/src/libsystemd/sd-bus/bus-creds.c b/src/libsystemd/sd-bus/bus-creds.c index a68b0d00ed..8d02885d3b 100644 --- a/src/libsystemd/sd-bus/bus-creds.c +++ b/src/libsystemd/sd-bus/bus-creds.c @@ -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) diff --git a/src/libsystemd/sd-bus/bus-creds.h b/src/libsystemd/sd-bus/bus-creds.h index 720450625c..42f76b8971 100644 --- a/src/libsystemd/sd-bus/bus-creds.h +++ b/src/libsystemd/sd-bus/bus-creds.h @@ -62,6 +62,8 @@ struct sd_bus_creds { char *user_unit; char *slice; + char *tty; + uint32_t *capability; uint32_t audit_session_id; diff --git a/src/libsystemd/sd-bus/bus-dump.c b/src/libsystemd/sd-bus/bus-dump.c index 13ff8b956a..396bf36f8a 100644 --- a/src/libsystemd/sd-bus/bus-dump.c +++ b/src/libsystemd/sd-bus/bus-dump.c @@ -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) diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 62dc45f8dd..d3588d5b65 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -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); |