sd-bus: add controlling tty field to sd_creds object
This is useful to print wall messages from logind with the right client tty. (to be added in a later patch)
This commit is contained in:
parent
33c62dcbd7
commit
4761e880ae
|
@ -345,6 +345,7 @@ global:
|
||||||
sd_bus_creds_get_selinux_context;
|
sd_bus_creds_get_selinux_context;
|
||||||
sd_bus_creds_get_audit_session_id;
|
sd_bus_creds_get_audit_session_id;
|
||||||
sd_bus_creds_get_audit_login_uid;
|
sd_bus_creds_get_audit_login_uid;
|
||||||
|
sd_bus_creds_get_tty;
|
||||||
sd_bus_creds_get_unique_name;
|
sd_bus_creds_get_unique_name;
|
||||||
sd_bus_creds_get_well_known_names;
|
sd_bus_creds_get_well_known_names;
|
||||||
sd_bus_creds_get_description;
|
sd_bus_creds_get_description;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "formats-util.h"
|
#include "formats-util.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
|
#include "terminal-util.h"
|
||||||
#include "capability.h"
|
#include "capability.h"
|
||||||
#include "cgroup-util.h"
|
#include "cgroup-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
|
@ -54,6 +55,7 @@ void bus_creds_done(sd_bus_creds *c) {
|
||||||
free(c->slice);
|
free(c->slice);
|
||||||
free(c->unescaped_description);
|
free(c->unescaped_description);
|
||||||
free(c->supplementary_gids);
|
free(c->supplementary_gids);
|
||||||
|
free(c->tty);
|
||||||
|
|
||||||
free(c->well_known_names); /* note that this is an strv, but
|
free(c->well_known_names); /* note that this is an strv, but
|
||||||
* we only free the array, not the
|
* 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;
|
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) {
|
_public_ int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **unique_name) {
|
||||||
assert_return(c, -EINVAL);
|
assert_return(c, -EINVAL);
|
||||||
assert_return(unique_name, -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;
|
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;
|
c->augmented = missing & c->mask;
|
||||||
|
|
||||||
return 0;
|
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;
|
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) {
|
if (c->mask & mask & SD_BUS_CREDS_UNIQUE_NAME) {
|
||||||
n->unique_name = strdup(c->unique_name);
|
n->unique_name = strdup(c->unique_name);
|
||||||
if (!n->unique_name)
|
if (!n->unique_name)
|
||||||
|
|
|
@ -62,6 +62,8 @@ struct sd_bus_creds {
|
||||||
char *user_unit;
|
char *user_unit;
|
||||||
char *slice;
|
char *slice;
|
||||||
|
|
||||||
|
char *tty;
|
||||||
|
|
||||||
uint32_t *capability;
|
uint32_t *capability;
|
||||||
|
|
||||||
uint32_t audit_session_id;
|
uint32_t audit_session_id;
|
||||||
|
|
|
@ -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);
|
fprintf(f, "%sTID=%s"PID_FMT"%s", prefix, color, c->tid, suffix);
|
||||||
if (c->mask & SD_BUS_CREDS_PPID)
|
if (c->mask & SD_BUS_CREDS_PPID)
|
||||||
fprintf(f, "%sPPID=%s"PID_FMT"%s", prefix, color, c->ppid, suffix);
|
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);
|
fputs("\n", f);
|
||||||
|
|
||||||
if (c->mask & SD_BUS_CREDS_UID)
|
if (c->mask & SD_BUS_CREDS_UID)
|
||||||
|
|
|
@ -84,11 +84,12 @@ enum {
|
||||||
SD_BUS_CREDS_SELINUX_CONTEXT = 1ULL << 26,
|
SD_BUS_CREDS_SELINUX_CONTEXT = 1ULL << 26,
|
||||||
SD_BUS_CREDS_AUDIT_SESSION_ID = 1ULL << 27,
|
SD_BUS_CREDS_AUDIT_SESSION_ID = 1ULL << 27,
|
||||||
SD_BUS_CREDS_AUDIT_LOGIN_UID = 1ULL << 28,
|
SD_BUS_CREDS_AUDIT_LOGIN_UID = 1ULL << 28,
|
||||||
SD_BUS_CREDS_UNIQUE_NAME = 1ULL << 29,
|
SD_BUS_CREDS_TTY = 1ULL << 29,
|
||||||
SD_BUS_CREDS_WELL_KNOWN_NAMES = 1ULL << 30,
|
SD_BUS_CREDS_UNIQUE_NAME = 1ULL << 30,
|
||||||
SD_BUS_CREDS_DESCRIPTION = 1ULL << 31,
|
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_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 {
|
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_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_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_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_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_well_known_names(sd_bus_creds *c, char ***names);
|
||||||
int sd_bus_creds_get_description(sd_bus_creds *c, const char **name);
|
int sd_bus_creds_get_description(sd_bus_creds *c, const char **name);
|
||||||
|
|
Loading…
Reference in a new issue