chiark / gitweb /
unit-printf: before resolving exec context specifiers check whether the object actual...
authorLennart Poettering <lennart@poettering.net>
Tue, 18 Sep 2012 09:40:01 +0000 (11:40 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 18 Sep 2012 09:40:01 +0000 (11:40 +0200)
src/core/mount.c
src/core/service.c
src/core/socket.c
src/core/swap.c
src/core/unit-printf.c
src/core/unit.c
src/core/unit.h

index fc981c74f430dc957ef8ef14578a2f0e3f5ee9b5..92e2f734ae696b398aab1e3f4a9eb39993ce2205 100644 (file)
@@ -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"
index 1e3e875c3fd36dde473baeef694733184537cb33..39e1ab51676ad46831818ee4a334b30615b44fc7 100644 (file)
@@ -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"
index 63e6ed29fe540aff1707434d4d6c0d8ecfa09a1b..361404512c71701cafdc30f29d8d39c4cd642a13 100644 (file)
@@ -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"
index 8ba60559c698455fb48e5ce510c24549c4849b6b..d5bf153f29bb91ce8e129600c59b9fc993c2883c 100644 (file)
@@ -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"
index cd492061bb8a837ebb10144c1aa231e3fc984755..35da29abdf1779776bfff0c477c5adfb02915909 100644 (file)
@@ -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");
index 4eea5b57ae49107dcba461397460e38582d96677..1e33936346573bcb866513cd54dc8cdc471ded4f 100644 (file)
@@ -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",
index da715dc78e13198f28f8e3bac677e6a53d1eb74c..bf961c2aacf2c8e6c503971cc0cb2041fa4cece3 100644 (file)
@@ -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);