aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2008-01-06 16:01:11 -0600
committerRob Landley <rob@landley.net>2008-01-06 16:01:11 -0600
commitdaa7fe6c32a6d6b1b8f0c1754acb0ab6bdbe9186 (patch)
tree8e3f85050016a4f83858eed4f2ef6d5528f1612c
parent797a4c3734dab0d70ce6d485acbb4bf922e775c7 (diff)
downloadtoybox-daa7fe6c32a6d6b1b8f0c1754acb0ab6bdbe9186.tar.gz
Add chvt from David Anders.
-rw-r--r--toys/Config.in12
-rw-r--r--toys/chvt.c54
-rw-r--r--toys/toylist.h1
3 files changed, 67 insertions, 0 deletions
diff --git a/toys/Config.in b/toys/Config.in
index 0539c1c4..4fabd6ef 100644
--- a/toys/Config.in
+++ b/toys/Config.in
@@ -48,6 +48,18 @@ config CHROOT
Run command within a new root directory. If no command, run /bin/sh.
+config CHVT
+ bool "chvt"
+ default y
+ help
+ usage: chvt N
+
+ Change to virtual terminal number N. (This only works in text mode.)
+
+ Virtual terminals are the Linux VGA text mode displays, ordinarily
+ switched between via alt-F1, alt-F2, etc. Use ctrl-alt-F1 to switch
+ from X to a virtual terminal, and alt-F6 (or F7, or F8) to get back.
+
config COUNT
bool "count"
default y
diff --git a/toys/chvt.c b/toys/chvt.c
new file mode 100644
index 00000000..46040685
--- /dev/null
+++ b/toys/chvt.c
@@ -0,0 +1,54 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * chvt.c switch virtual terminals
+ *
+ * Copyright (C) 2008 David Anders <danders@amltd.com>
+ *
+ */
+
+#include "toys.h"
+
+#define VT_ACTIVATE 0x5606
+#define VT_WAITACTIVE 0x5607
+
+/* note get_console_fb() will need to be moved into a seperate lib section */
+int get_console_fd()
+{
+ int fd;
+
+ fd = open("/dev/console", O_RDWR);
+ if (fd >= 0)
+ return fd;
+
+ fd = open("/dev/vc/0", O_RDWR);
+ if (fd >= 0)
+ return fd;
+
+ fd = open("/dev/tty", O_RDWR);
+ if (fd >= 0)
+ return fd;
+
+ return -1;
+}
+
+void chvt_main(void)
+{
+ int vtnum,fd;
+
+
+ if(!*toys.optargs)
+ return;
+
+ vtnum=atoi(*toys.optargs);
+
+ fd=get_console_fd();
+ if (fd < 0)
+ return;
+
+ if (ioctl(fd,VT_ACTIVATE,vtnum))
+ return;
+
+ if (ioctl(fd,VT_WAITACTIVE,vtnum))
+ return;
+
+}
diff --git a/toys/toylist.h b/toys/toylist.h
index 05d70b16..2dd8620f 100644
--- a/toys/toylist.h
+++ b/toys/toylist.h
@@ -136,6 +136,7 @@ USE_BASENAME(NEWTOY(basename, "<1>2", TOYFLAG_BIN))
USE_BZCAT(NEWTOY(bzcat, NULL, TOYFLAG_USR|TOYFLAG_BIN))
USE_CATV(NEWTOY(catv, "vte", TOYFLAG_USR|TOYFLAG_BIN))
USE_CHROOT(NEWTOY(chroot, "<1", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_CHVT(NEWTOY(chvt, "<1", TOYFLAG_USR|TOYFLAG_SBIN))
USE_COUNT(NEWTOY(count, NULL, TOYFLAG_USR|TOYFLAG_BIN))
USE_TOYSH(NEWTOY(cd, NULL, TOYFLAG_NOFORK))
USE_DF(NEWTOY(df, "Pkt*a", TOYFLAG_USR|TOYFLAG_SBIN))