changeset 229:87390c3700c1

Add chvt from David Anders.
author Rob Landley <rob@landley.net>
date Sun, 06 Jan 2008 16:01:11 -0600
parents 90f763207f56
children 5c03ba9e3924
files toys/Config.in toys/chvt.c toys/toylist.h
diffstat 3 files changed, 67 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/toys/Config.in	Sat Jan 05 18:23:30 2008 -0600
+++ b/toys/Config.in	Sun Jan 06 16:01:11 2008 -0600
@@ -48,6 +48,18 @@
 
 	  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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/chvt.c	Sun Jan 06 16:01:11 2008 -0600
@@ -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;
+
+}
--- a/toys/toylist.h	Sat Jan 05 18:23:30 2008 -0600
+++ b/toys/toylist.h	Sun Jan 06 16:01:11 2008 -0600
@@ -136,6 +136,7 @@
 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))