init: Use root's home directory in single-user mode

When starting single-user mode, use the home directory from user root as
current directory and for the HOME environment variable. If the
directory does not exist, set HOME=/.

Also adjust /root/.profile to stop setting HOME, since it should always
have been set now.

This is intended to keep shell startup files working in single-user mode
after /.profile has been removed.

Reviewed by:	emaste, ivy, kevans
MFC after:	1 week
Relnotes:	yes
Differential Revision:	https://reviews.freebsd.org/D52527
This commit is contained in:
Jilles Tjoelker 2025-09-14 23:53:34 +02:00
parent 36edc5014f
commit 779812d669
2 changed files with 11 additions and 5 deletions

View file

@ -1,6 +1,4 @@
#
HOME=/root
export HOME
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:~/bin
export PATH
TERM=${TERM:-xterm}

View file

@ -851,9 +851,9 @@ single_user(void)
const char *shell;
char *argv[2];
struct timeval tv, tn;
struct passwd *pp;
#ifdef SECURE
struct ttyent *typ;
struct passwd *pp;
static const char banner[] =
"Enter root password, or ^D to go multi-user\n";
char *clear, *password;
@ -885,6 +885,7 @@ single_user(void)
*/
open_console();
pp = getpwnam("root");
#ifdef SECURE
/*
* Check the root password.
@ -892,7 +893,6 @@ single_user(void)
* it's the only tty that can be 'off' and 'secure'.
*/
typ = getttynam("console");
pp = getpwnam("root");
if (typ && (typ->ty_status & TTY_SECURE) == 0 &&
pp && *pp->pw_passwd) {
write_stderr(banner);
@ -909,7 +909,6 @@ single_user(void)
}
}
endttyent();
endpwent();
#endif /* SECURE */
#ifdef DEBUGSHELL
@ -930,6 +929,15 @@ single_user(void)
}
#endif /* DEBUGSHELL */
if (pp != NULL && pp->pw_dir != NULL && *pp->pw_dir != '\0' &&
chdir(pp->pw_dir) == 0) {
setenv("HOME", pp->pw_dir, 1);
} else {
chdir("/");
setenv("HOME", "/", 1);
}
endpwent();
/*
* Unblock signals.
* We catch all the interesting ones,