Simplify the meaning of %s

The rules governing %s where just too complicated. First of
all, looking at $SHELL is dangerous. For systemd --system,
it usually wouldn't be set. But it could be set if the admin
first started a debug shell, let's say /sbin/sash, and then
launched systemd from it. This shouldn't influence how daemons
are started later on, so is better ignored. Similar reasoning
holds for session mode. Some shells set $SHELL, while other
set it only when it wasn't set previously (e.g. zsh). This
results in fragility that is better avoided by ignoring $SHELL
totally.

With $SHELL out of the way, simplify things by saying that
%s==/bin/sh for root, and the configured shell otherwise.
get_shell() is the only caller, so it can be inlined.

Fixes one issue seen with 'make check'.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2013-03-26 23:49:44 -04:00
parent a63a5c4687
commit 3baed19327
5 changed files with 32 additions and 64 deletions
+22 -13
View File
@@ -190,28 +190,37 @@ static char *specifier_user_shell(char specifier, void *data, void *userdata) {
ExecContext *c;
int r;
const char *username, *shell;
char *ret;
assert(u);
c = unit_get_exec_context(u);
/* return HOME if set, otherwise from passwd */
if (!c || !c->user) {
char *sh;
if (c && c->user)
username = c->user;
else
username = "root";
r = get_shell(&sh);
if (r < 0)
return strdup("/bin/sh");
return sh;
/* return /bin/sh for root, otherwise the value from passwd */
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
if (r < 0) {
log_warning_unit(u->id,
"Failed to determine shell: %s",
strerror(-r));
return NULL;
}
username = c->user;
r = get_user_creds(&username, NULL, NULL, NULL, &shell);
if (r < 0)
return strdup("/bin/sh");
if (!path_is_absolute(shell)) {
log_warning_unit(u->id,
"Shell %s is not absolute, ignoring.",
shell);
}
return strdup(shell);
ret = strdup(shell);
if (!ret)
log_oom();
return ret;
}
char *unit_name_printf(Unit *u, const char* format) {