[PATCH] cttyhack: print detected ctty name when called without parameters
Alexander Shishkin
virtuoso at slind.org
Mon Oct 31 00:15:42 UTC 2011
Sometimes there's a need to figure out the controlling tty from a shell
script, for example, to obtain a line for getty. In this case it's easier
to call cttyhack than trying to repeat some of the cttyhack's logic.
function old new delta
cttyhack_main 324 320 -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-4) Total: -4 bytes
Signed-off-by: Alexander Shishkin <virtuoso at slind.org>
---
shell/cttyhack.c | 40 +++++++++++++++++++++-------------------
1 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/shell/cttyhack.c b/shell/cttyhack.c
index 6241c76..772f8b8 100644
--- a/shell/cttyhack.c
+++ b/shell/cttyhack.c
@@ -50,6 +50,9 @@
//config:
//config: # exec setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
//config:
+//config: Starting getty on a controlling tty from a shell script:
+//config:
+//config: # getty $(cttyhack) 115200
//usage:#define cttyhack_trivial_usage
//usage: "PROG ARGS"
@@ -108,14 +111,10 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
char paranoia[sizeof(struct serial_struct) * 3];
} u;
- if (!*++argv) {
- bb_show_usage();
- }
-
strcpy(console, "/dev/tty");
fd = open(console, O_RDWR);
if (fd >= 0) {
- /* We already have ctty, nothing to do */
+ /* We already have ctty, don't try to detect it. */
close(fd);
} else {
/* We don't have ctty (or don't have "/dev/tty" node...) */
@@ -145,24 +144,27 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
}
#endif
/* nope, could not find it */
- goto ret;
+ console[0] = '\0';
} while (0);
+ }
- fd = open_or_warn(console, O_RDWR);
- if (fd < 0)
- goto ret;
- //bb_error_msg("switching to '%s'", console);
- dup2(fd, 0);
- dup2(fd, 1);
- dup2(fd, 2);
- while (fd > 2)
- close(fd--);
- /* Some other session may have it as ctty,
- * steal it from them:
- */
- ioctl(0, TIOCSCTTY, 1);
+ if (!*++argv) {
+ puts(console);
+ return EXIT_SUCCESS;
}
+ /* If it's a /dev/tty, still make sure it's wired to std{in,out,err} */
+ fd = open_or_warn(console, O_RDWR);
+ if (fd < 0)
+ goto ret;
+ //bb_error_msg("switching to '%s'", console);
+ dup2(fd, STDIN_FILENO);
+ dup2(fd, STDOUT_FILENO);
+ xmove_fd(fd, STDERR_FILENO);
+ /* Some other session may have it as ctty,
+ * steal it from them:
+ */
+ ioctl(0, TIOCSCTTY, 1);
ret:
BB_EXECVP_or_die(argv);
}
--
1.7.2.1.45.gb66c2
More information about the busybox
mailing list