diff options
Diffstat (limited to 'shell/cttyhack.c')
-rw-r--r-- | shell/cttyhack.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/shell/cttyhack.c b/shell/cttyhack.c index 6241c76..640f5b1 100644 --- a/shell/cttyhack.c +++ b/shell/cttyhack.c @@ -50,9 +50,12 @@ //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 115200 $(cttyhack) //usage:#define cttyhack_trivial_usage -//usage: "PROG ARGS" +//usage: "[PROG ARGS]" //usage:#define cttyhack_full_usage "\n\n" //usage: "Give PROG a controlling tty if possible." //usage: "\nExample for /etc/inittab (for busybox init):" @@ -108,61 +111,66 @@ 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 */ - close(fd); - } else { + if (fd < 0) { /* We don't have ctty (or don't have "/dev/tty" node...) */ do { #ifdef __linux__ - int s = open_read_close("/sys/class/tty/console/active", - console + 5, sizeof(console) - 5); - if (s > 0) { - /* found active console via sysfs (Linux 2.6.38+) - * sysfs string looks like "ttyS0\n" so zap the newline: - */ - console[4 + s] = '\0'; - break; - } - + int s; if (ioctl(0, VT_GETSTATE, &u.vt) == 0) { /* this is linux virtual tty */ - sprintf(console + 8, "S%d" + 1, u.vt.v_active); + sprintf(console + 8, "S%u" + 1, (int)u.vt.v_active); break; } #endif #ifdef TIOCGSERIAL if (ioctl(0, TIOCGSERIAL, &u.sr) == 0) { /* this is a serial console; assuming it is named /dev/ttySn */ - sprintf(console + 8, "S%d", u.sr.line); + sprintf(console + 8, "S%u", (int)u.sr.line); + break; + } +#endif +#ifdef __linux__ + /* Note that this method is not related to _stdin_ */ + s = open_read_close("/sys/class/tty/console/active", + console + 5, sizeof(console) - 5); + if (s > 0) { + /* found active console via sysfs (Linux 2.6.38+) + * sysfs string looks like "ttyS0\n" so zap the newline: + */ + console[4 + s] = '\0'; break; } #endif /* nope, could not find it */ - goto ret; + console[0] = '\0'; } while (0); + } + argv++; + if (!argv[0]) { + if (!console[0]) + return EXIT_FAILURE; + puts(console); + return EXIT_SUCCESS; + } + + if (fd < 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); } - -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, + * try to steal it from them: + */ + ioctl(0, TIOCSCTTY, 1); + ret: BB_EXECVP_or_die(argv); } |