lineedit: do not hardcode ctrl-C and ctrl-D, use termios fields.
[oweals/busybox.git] / libbb / get_console.c
index 42ee137b945f4ddfe4f4faf65474d609e9bcff4e..74022b5437e35a174c1b885fa7f339193a3d2b4b 100644 (file)
@@ -8,14 +8,11 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <sys/ioctl.h>
 #include "libbb.h"
 
-
 /* From <linux/kd.h> */
 enum { KDGKBTYPE = 0x4B33 };  /* get keyboard type */
 
-
 static int open_a_console(const char *fnam)
 {
        int fd;
@@ -39,8 +36,7 @@ static int open_a_console(const char *fnam)
  * We try several things because opening /dev/console will fail
  * if someone else used X (which does a chown on /dev/console).
  */
-
-int get_console_fd(void)
+int FAST_FUNC get_console_fd_or_die(void)
 {
        static const char *const console_names[] = {
                DEV_CONSOLE, CURRENT_VC, CURRENT_TTY
@@ -50,23 +46,35 @@ int get_console_fd(void)
 
        for (fd = 2; fd >= 0; fd--) {
                int fd4name;
-               int choise_fd;
+               int choice_fd;
                char arg;
 
                fd4name = open_a_console(console_names[fd]);
  chk_std:
-               choise_fd = (fd4name >= 0 ? fd4name : fd);
+               choice_fd = (fd4name >= 0 ? fd4name : fd);
 
                arg = 0;
-               if (ioctl(choise_fd, KDGKBTYPE, &arg) == 0)
-                       return choise_fd;
-               if(fd4name >= 0) {
+               if (ioctl(choice_fd, KDGKBTYPE, &arg) == 0)
+                       return choice_fd;
+               if (fd4name >= 0) {
                        close(fd4name);
                        fd4name = -1;
                        goto chk_std;
                }
        }
 
-       bb_error_msg("cannot get file descriptor referring to console");
-       return fd;                      /* total failure */
+       bb_error_msg_and_die("can't open console");
+       /*return fd; - total failure */
+}
+
+/* From <linux/vt.h> */
+enum {
+       VT_ACTIVATE = 0x5606,   /* make vt active */
+       VT_WAITACTIVE = 0x5607  /* wait for vt active */
+};
+
+void FAST_FUNC console_make_active(int fd, const int vt_num)
+{
+       xioctl(fd, VT_ACTIVATE, (void *)(ptrdiff_t)vt_num);
+       xioctl(fd, VT_WAITACTIVE, (void *)(ptrdiff_t)vt_num);
 }