diff --git a/commands/service/parse.c b/commands/service/parse.c index 1c5a1ba07..82488e723 100644 --- a/commands/service/parse.c +++ b/commands/service/parse.c @@ -138,11 +138,17 @@ PRIVATE void do_uid(config_t *cpe, struct rs_start *rs_start) uid= pw->pw_uid; else { - uid= strtol(cpe->word, &check, 0); - if (check[0] != '\0') + if (!strncmp(cpe->word, KW_SELF, strlen(KW_SELF)+1)) { - fatal("do_uid: bad uid/login '%s' at %s:%d", - cpe->word, cpe->file, cpe->line); + uid= getuid(); /* Real uid */ + } + else { + uid= strtol(cpe->word, &check, 0); + if (check[0] != '\0') + { + fatal("do_uid: bad uid/login '%s' at %s:%d", + cpe->word, cpe->file, cpe->line); + } } } diff --git a/commands/service/parse.h b/commands/service/parse.h index 08487b628..02fc0350f 100644 --- a/commands/service/parse.h +++ b/commands/service/parse.h @@ -1,5 +1,6 @@ #define KW_SERVICE "service" #define KW_UID "uid" +#define KW_SELF "SELF" #define KW_SIGMGR "sigmgr" #define KW_SCHEDULER "scheduler" #define KW_PRIORITY "priority" diff --git a/man/man5/system.conf.5 b/man/man5/system.conf.5 index ddf6aeeae..111b21ea8 100644 --- a/man/man5/system.conf.5 +++ b/man/man5/system.conf.5 @@ -42,10 +42,12 @@ where \fI\fR is the name of the program used to start the given system service. In each service entry, the following options can be used: .PP -\fBuid\fR \fI\fR\fB;\fR +\fBuid\fR \fI\fR\fB;\fR .PP .RS specifies the user id or the user name to use to run the system service. +\fISELF\fR can be used when the service has to start with the realuid of +the user who's executing the \fBservice\fR utility. Many system services run with root privileges (uid \fB0\fR). The default user is service (uid \fB12\fR). .RE