terminal-util: when resetting terminals, don't wait for carrier
In case of non-CLOCAL lines (i.e. those with carrier detect configured) we shouldnt wait for a carrier if all we try to do is reset the TTY. Hence, whenever we open such a TTY pass O_NONBLOCK. Note that we continue to open ttys we intend to write to without O_ONBLOCK, we only add it in cases we invoke ioctl()s or other terminal operations without reading or writing to the device. Fixes #835.
This commit is contained in:
@@ -44,7 +44,7 @@ static volatile unsigned cached_lines = 0;
|
||||
int chvt(int vt) {
|
||||
_cleanup_close_ int fd;
|
||||
|
||||
fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
@@ -284,7 +284,11 @@ finish:
|
||||
int reset_terminal(const char *name) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
|
||||
fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
/* We open the terminal with O_NONBLOCK here, to ensure we
|
||||
* don't block on carrier if this is a terminal with carrier
|
||||
* configured. */
|
||||
|
||||
fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
@@ -499,7 +503,7 @@ int release_terminal(void) {
|
||||
struct sigaction sa_old;
|
||||
int r = 0;
|
||||
|
||||
fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC);
|
||||
fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
@@ -527,7 +531,7 @@ int terminal_vhangup_fd(int fd) {
|
||||
int terminal_vhangup(const char *name) {
|
||||
_cleanup_close_ int fd;
|
||||
|
||||
fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
fd = open_terminal(name, O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
@@ -574,7 +578,7 @@ int vt_disallocate(const char *name) {
|
||||
return -EINVAL;
|
||||
|
||||
/* Try to deallocate */
|
||||
fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC);
|
||||
fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC|O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user