mirror of
https://github.com/AuxXxilium/eudev.git
synced 2025-01-27 01:20:00 +07:00
systemctl: don't unnecessarily close stdin/stdout/stderr for tty agent so that locking by tty works
This commit is contained in:
parent
46a08e3815
commit
060ed82ec2
2
TODO
2
TODO
@ -11,8 +11,6 @@ Features:
|
||||
|
||||
* perhaps add "systemctl reenable" as combination of "systemctl disable" and "systemctl enable"
|
||||
|
||||
* tty name lock for password agent is broken, since it will always lock "/dev/tty" since we now reattach the agent process when forking it off systemctl
|
||||
|
||||
* need a way to apply mount options of api vfs from systemd unit files instead of fstab
|
||||
|
||||
* udisks should not use udisks-part-id, instead use blkid. also not probe /dev/loopxxx
|
||||
|
@ -121,7 +121,7 @@ static bool on_tty(void) {
|
||||
/* Note that this is invoked relatively early, before we start
|
||||
* the pager. That means the value we return reflects whether
|
||||
* we originally were started on a tty, not if we currently
|
||||
* are. But this is intended, since we want color, and so on
|
||||
* are. But this is intended, since we want colour and so on
|
||||
* when run in our own pager. */
|
||||
|
||||
if (_unlikely_(t < 0))
|
||||
@ -174,28 +174,33 @@ static void spawn_ask_password_agent(void) {
|
||||
/* Don't leak fds to the agent */
|
||||
close_all_fds(NULL, 0);
|
||||
|
||||
/* Detach from stdin/stdout/stderr. and reopen
|
||||
* /dev/tty for them. This is important to ensure that
|
||||
* when systemctl is started via popen() or a similar
|
||||
* call that expects to read EOF we actually do
|
||||
* generate EOF and not delay this indefinitely by
|
||||
* because we keep an unused copy of stdin around. */
|
||||
if ((fd = open("/dev/tty", O_RDWR)) < 0) {
|
||||
log_error("Failed to open /dev/tty: %m");
|
||||
_exit(EXIT_FAILURE);
|
||||
if (!isatty(STDOUT_FILENO) || !isatty(STDERR_FILENO)) {
|
||||
/* Detach from stdout/stderr. and reopen
|
||||
* /dev/tty for them. This is important to
|
||||
* ensure that when systemctl is started via
|
||||
* popen() or a similar call that expects to
|
||||
* read EOF we actually do generate EOF and
|
||||
* not delay this indefinitely by because we
|
||||
* keep an unused copy of stdin around. */
|
||||
if ((fd = open("/dev/tty", O_WRONLY)) < 0) {
|
||||
log_error("Failed to open /dev/tty: %m");
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (!isatty(STDOUT_FILENO)) {
|
||||
close(STDOUT_FILENO);
|
||||
dup2(fd, STDOUT_FILENO);
|
||||
}
|
||||
|
||||
if (!isatty(STDERR_FILENO)) {
|
||||
close(STDERR_FILENO);
|
||||
dup2(fd, STDERR_FILENO);
|
||||
}
|
||||
|
||||
if (fd > 2)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
close(STDIN_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
dup2(fd, STDIN_FILENO);
|
||||
dup2(fd, STDOUT_FILENO);
|
||||
dup2(fd, STDERR_FILENO);
|
||||
|
||||
if (fd > 2)
|
||||
close(fd);
|
||||
|
||||
execv(args[0], (char **) args);
|
||||
_exit(EXIT_FAILURE);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user