Compare commits
3 Commits
411c6c40cd
...
1035b91a3d
Author | SHA1 | Date | |
---|---|---|---|
1035b91a3d | |||
a935039e78 | |||
18130847c1 |
@ -38,7 +38,7 @@ Result<int> luna_main(int argc, char** argv)
|
||||
username = name.view();
|
||||
}
|
||||
|
||||
execl("/bin/su", "login", "-p", "--", username.chars(), nullptr);
|
||||
execl("/bin/su", "login", "-lp", "--", username.chars(), nullptr);
|
||||
|
||||
perror("su");
|
||||
return 1;
|
||||
|
@ -71,12 +71,9 @@ Result<int> luna_main(int argc, char** argv)
|
||||
|
||||
if (getuid() == 0) prompt_end = '#';
|
||||
|
||||
username = getenv("USER");
|
||||
if (!username)
|
||||
{
|
||||
struct passwd* pw = getpwuid(getuid());
|
||||
if (pw) { username = pw->pw_name; }
|
||||
}
|
||||
struct passwd* pw = getpwuid(getuid());
|
||||
if (pw) { username = pw->pw_name; }
|
||||
else { username = getenv("USER"); }
|
||||
}
|
||||
|
||||
while (1)
|
||||
|
12
apps/su.cpp
12
apps/su.cpp
@ -55,6 +55,7 @@ Result<int> luna_main(int argc, char** argv)
|
||||
{
|
||||
StringView name;
|
||||
bool prompt_password;
|
||||
bool login;
|
||||
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
@ -67,6 +68,7 @@ Result<int> luna_main(int argc, char** argv)
|
||||
parser.add_system_program_info("su"_sv);
|
||||
parser.add_positional_argument(name, "name"_sv, "root"_sv);
|
||||
parser.add_switch_argument(prompt_password, 'p', "prompt", "prompt for a password even if running as root");
|
||||
parser.add_switch_argument(login, 'l', "login"_sv, "change directory to the user's home and start a login shell");
|
||||
parser.parse(argc, argv);
|
||||
|
||||
struct passwd* entry = getpwnam(name.chars());
|
||||
@ -93,10 +95,16 @@ Result<int> luna_main(int argc, char** argv)
|
||||
setgid(entry->pw_gid);
|
||||
setuid(entry->pw_uid);
|
||||
|
||||
chdir(entry->pw_dir);
|
||||
if (login)
|
||||
{
|
||||
chdir(entry->pw_dir);
|
||||
clearenv();
|
||||
setenv("PATH", "/bin:/sbin", 1);
|
||||
}
|
||||
|
||||
if (login || entry->pw_uid != 0) setenv("USER", entry->pw_name, 1);
|
||||
|
||||
setenv("HOME", entry->pw_dir, 1);
|
||||
setenv("USER", entry->pw_name, 1);
|
||||
setenv("SHELL", entry->pw_shell, 1);
|
||||
|
||||
execl(entry->pw_shell, entry->pw_shell, NULL);
|
||||
|
@ -1,4 +1,3 @@
|
||||
Name=login
|
||||
Command=/bin/login
|
||||
Restart=true
|
||||
Environment=PATH=/bin:/sbin
|
||||
|
@ -54,10 +54,10 @@ static Result<void> _try_move_env()
|
||||
|
||||
if (!env)
|
||||
{
|
||||
TRY(g_dynamic_env.try_append(nullptr));
|
||||
guard.deactivate();
|
||||
env_is_dynamic = true;
|
||||
environ = g_dynamic_env.data();
|
||||
check(!environ);
|
||||
return {};
|
||||
}
|
||||
|
||||
@ -109,10 +109,12 @@ extern "C"
|
||||
{
|
||||
if (element) free(element);
|
||||
}
|
||||
|
||||
g_dynamic_env.clear();
|
||||
}
|
||||
|
||||
env_is_dynamic = false;
|
||||
environ = nullptr;
|
||||
env_is_dynamic = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user