cttyhack: move /sys/class/tty/console/active check to the front
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 31 Oct 2011 15:57:04 +0000 (16:57 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 31 Oct 2011 15:57:04 +0000 (16:57 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/cttyhack.c

index 640f5b1fb53ec61a0bd030e68f8ec29698a24e3f..6ff867413f431c408cfb5525822a1dec342a7c1f 100644 (file)
@@ -117,7 +117,24 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
                /* We don't have ctty (or don't have "/dev/tty" node...) */
                do {
 #ifdef __linux__
-                       int s;
+                       /* Note that this method does not use _stdin_.
+                        * Thus, "cttyhack </dev/something" can't be used.
+                        * However, this method is more reliable than
+                        * TIOCGSERIAL check, which assumes that all
+                        * serial lines follow /dev/ttySn convention -
+                        * which is not always the case.
+                        * Therefore, we use this methos first:
+                        */
+                       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;
+                       }
+
                        if (ioctl(0, VT_GETSTATE, &u.vt) == 0) {
                                /* this is linux virtual tty */
                                sprintf(console + 8, "S%u" + 1, (int)u.vt.v_active);
@@ -130,18 +147,6 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv)
                                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 */
                        console[0] = '\0';