cttyhack: don't do anything if ctty is already available
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 May 2010 02:08:20 +0000 (04:08 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 May 2010 02:08:20 +0000 (04:08 +0200)
function                                             old     new   delta
cttyhack_main                                        244     269     +25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/cttyhack.c

index 572a3af035cb6e18db92dbe82c3fa3e5cad6c38f..bde2acdc93db82012a7ef4c61428d2b20454e554 100644 (file)
@@ -53,23 +53,32 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
        }
 
        strcpy(console, "/dev/tty");
-       if (ioctl(0, TIOCGSERIAL, &u.sr) == 0) {
-               /* this is a serial console */
-               sprintf(console + 8, "S%d", u.sr.line);
-       } else if (ioctl(0, VT_GETSTATE, &u.vt) == 0) {
-               /* this is linux virtual tty */
-               sprintf(console + 8, "S%d" + 1, u.vt.v_active);
-       }
-
-       if (console[8]) {
-               fd = xopen(console, O_RDWR);
-               //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);
+       fd = open(console, O_RDWR);
+       if (fd >= 0) {
+               /* We already have ctty, nothing to do */
+               close(fd);
+       } else {
+               /* We don't have ctty (or don't have "/dev/tty" node...) */
+               if (ioctl(0, TIOCGSERIAL, &u.sr) == 0) {
+                       /* this is a serial console */
+                       sprintf(console + 8, "S%d", u.sr.line);
+               } else if (ioctl(0, VT_GETSTATE, &u.vt) == 0) {
+                       /* this is linux virtual tty */
+                       sprintf(console + 8, "S%d" + 1, u.vt.v_active);
+               }
+               if (console[8]) {
+                       fd = xopen(console, O_RDWR);
+                       //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);
+               }
        }
 
        BB_EXECVP(argv[0], argv);