summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-09-18 11:40:01 +0200
committerLennart Poettering <lennart@poettering.net>2012-09-18 11:40:01 +0200
commit3ef63c317481c2b3f1fe39e1b0f130aac3544522 (patch)
tree0a6bb8b1566591bb7cf6d51fcb085493688efa4a
parent41f9172f427bdbb8221c64029f78364b8dd4e527 (diff)
unit-printf: before resolving exec context specifiers check whether the object actually has an exec context
-rw-r--r--src/core/mount.c2
-rw-r--r--src/core/service.c2
-rw-r--r--src/core/socket.c2
-rw-r--r--src/core/swap.c2
-rw-r--r--src/core/unit-printf.c33
-rw-r--r--src/core/unit.c11
-rw-r--r--src/core/unit.h6
7 files changed, 49 insertions, 9 deletions
diff --git a/src/core/mount.c b/src/core/mount.c
index fc981c74f4..92e2f734ae 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1797,6 +1797,8 @@ DEFINE_STRING_TABLE_LOOKUP(mount_result, MountResult);
const UnitVTable mount_vtable = {
.object_size = sizeof(Mount),
+ .exec_context_offset = offsetof(Mount, exec_context),
+
.sections =
"Unit\0"
"Mount\0"
diff --git a/src/core/service.c b/src/core/service.c
index 1e3e875c3f..39e1ab5167 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -3837,6 +3837,8 @@ DEFINE_STRING_TABLE_LOOKUP(start_limit_action, StartLimitAction);
const UnitVTable service_vtable = {
.object_size = sizeof(Service),
+ .exec_context_offset = offsetof(Service, exec_context),
+
.sections =
"Unit\0"
"Service\0"
diff --git a/src/core/socket.c b/src/core/socket.c
index 63e6ed29fe..361404512c 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -2196,6 +2196,8 @@ DEFINE_STRING_TABLE_LOOKUP(socket_result, SocketResult);
const UnitVTable socket_vtable = {
.object_size = sizeof(Socket),
+ .exec_context_offset = offsetof(Socket, exec_context),
+
.sections =
"Unit\0"
"Socket\0"
diff --git a/src/core/swap.c b/src/core/swap.c
index 8ba60559c6..d5bf153f29 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -1355,6 +1355,8 @@ DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
const UnitVTable swap_vtable = {
.object_size = sizeof(Swap),
+ .exec_context_offset = offsetof(Swap, exec_context),
+
.sections =
"Unit\0"
"Swap\0"
diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
index cd492061bb..35da29abdf 100644
--- a/src/core/unit-printf.c
+++ b/src/core/unit-printf.c
@@ -119,16 +119,21 @@ static char *specifier_runtime(char specifier, void *data, void *userdata) {
}
static char *specifier_user_name(char specifier, void *data, void *userdata) {
- Service *s = userdata;
+ Unit *u = userdata;
+ ExecContext *c;
int r;
const char *username;
+ c = unit_get_exec_context(u);
+ if (!c)
+ return NULL;
+
/* get USER env from our own env if set */
- if (!s->exec_context.user)
+ if (!c->user)
return getusername_malloc();
/* fish username from passwd */
- username = s->exec_context.user;
+ username = c->user;
r = get_user_creds(&username, NULL, NULL, NULL, NULL);
if (r < 0)
return NULL;
@@ -137,12 +142,17 @@ static char *specifier_user_name(char specifier, void *data, void *userdata) {
}
static char *specifier_user_home(char specifier, void *data, void *userdata) {
- Service *s = userdata;
+ Unit *u = userdata;
+ ExecContext *c;
int r;
const char *username, *home;
+ c = unit_get_exec_context(u);
+ if (!c)
+ return NULL;
+
/* return HOME if set, otherwise from passwd */
- if (!s->exec_context.user) {
+ if (!c->user) {
char *h;
r = get_home_dir(&h);
@@ -152,7 +162,7 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) {
return h;
}
- username = s->exec_context.user;
+ username = c->user;
r = get_user_creds(&username, NULL, NULL, &home, NULL);
if (r < 0)
return NULL;
@@ -161,12 +171,17 @@ static char *specifier_user_home(char specifier, void *data, void *userdata) {
}
static char *specifier_user_shell(char specifier, void *data, void *userdata) {
- Service *s = userdata;
+ Unit *u = userdata;
+ ExecContext *c;
int r;
const char *username, *shell;
+ c = unit_get_exec_context(u);
+ if (!c)
+ return NULL;
+
/* return HOME if set, otherwise from passwd */
- if (!s->exec_context.user) {
+ if (!c->user) {
char *sh;
r = get_shell(&sh);
@@ -176,7 +191,7 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
return sh;
}
- username = s->exec_context.user;
+ username = c->user;
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
if (r < 0)
return strdup("/bin/sh");
diff --git a/src/core/unit.c b/src/core/unit.c
index 4eea5b57ae..1e33936346 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2684,6 +2684,17 @@ int unit_exec_context_defaults(Unit *u, ExecContext *c) {
return 0;
}
+ExecContext *unit_get_exec_context(Unit *u) {
+ size_t offset;
+ assert(u);
+
+ offset = UNIT_VTABLE(u)->exec_context_offset;
+ if (offset <= 0)
+ return NULL;
+
+ return (ExecContext*) ((uint8_t*) u + offset);
+}
+
static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
[UNIT_ACTIVE] = "active",
[UNIT_RELOADING] = "reloading",
diff --git a/src/core/unit.h b/src/core/unit.h
index da715dc78e..bf961c2aac 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -266,6 +266,10 @@ struct UnitVTable {
/* How much memory does an object of this unit type need */
size_t object_size;
+ /* If greater than 0, the offset into the object where
+ * ExecContext is found, if the unit type has that */
+ size_t exec_context_offset;
+
/* Config file sections this unit type understands, separated
* by NUL chars */
const char *sections;
@@ -538,6 +542,8 @@ int unit_add_mount_links(Unit *u);
int unit_exec_context_defaults(Unit *u, ExecContext *c);
+ExecContext *unit_get_exec_context(Unit *u);
+
const char *unit_active_state_to_string(UnitActiveState i);
UnitActiveState unit_active_state_from_string(const char *s);