openvt applet by Quy Tonthat
No binary (build failed)
—
(log yok)
| @@ -30,6 +30,7 @@ CONSOLETOOLS_DIR-$(CONFIG_DUMPKMAP) += dumpkmap.o | |
| CONSOLETOOLS_DIR-$(CONFIG_LOADACM) += loadacm.o | |
| CONSOLETOOLS_DIR-$(CONFIG_LOADFONT) += loadfont.o | |
| CONSOLETOOLS_DIR-$(CONFIG_LOADKMAP) += loadkmap.o | |
| + | CONSOLETOOLS_DIR-$(CONFIG_OPENVT) += openvt.o |
| CONSOLETOOLS_DIR-$(CONFIG_RESET) += reset.o | |
| CONSOLETOOLS_DIR-$(CONFIG_SETKEYCODES) += setkeycodes.o | |
| @@ -12,6 +12,7 @@ bool 'dumpkmap' CONFIG_DUMPKMAP | |
| bool 'loadacm' CONFIG_LOADACM | |
| bool 'loadfont' CONFIG_LOADFONT | |
| bool 'loadkmap' CONFIG_LOADKMAP | |
| + | bool 'openvt' CONFIG_OPENVT |
| bool 'reset' CONFIG_RESET | |
| bool 'setkeycodes' CONFIG_SETKEYCODES | |
| @@ -0,0 +1,84 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | |
| + | /* |
| + | * openvt.c - open a vt to run a command. |
| + | * |
| + | * busyboxed by Quy Tonthat <[email protected]> |
| + | */ |
| + | |
| + | /* getopt not needed */ |
| + | |
| + | #include <stdio.h> |
| + | #include <stdlib.h> |
| + | #include <unistd.h> |
| + | #include <fcntl.h> |
| + | #include <string.h> |
| + | #include <sys/types.h> |
| + | #include "busybox.h" |
| + | |
| + | #define VTNAME "/dev/tty%d" |
| + | |
| + | int openvt_main(int argc, char **argv) |
| + | { |
| + | int pid; |
| + | int fd; |
| + | int vtno; |
| + | char vtname[sizeof VTNAME + 2]; |
| + | char * cmd = NULL; |
| + | char * cmd_args = NULL; |
| + | |
| + | if (argc < 3) |
| + | show_usage(); |
| + | |
| + | if (!isdigit(argv[1][0])) |
| + | show_usage(); |
| + | |
| + | vtno = (int) atol(argv[1]); |
| + | |
| + | /* if (vtno <= 0 || vtno > 63) */ |
| + | if (vtno <= 0 || vtno > 12) |
| + | error_msg_and_die("Illegal vt number (%d)", vtno); |
| + | |
| + | sprintf(vtname, VTNAME, vtno); |
| + | |
| + | cmd = argv[2]; |
| + | cmd_args = xmalloc(80); |
| + | cmd_args[0] = '\0'; |
| + | |
| + | if((pid = fork()) == 0) { |
| + | /* leave current vt */ |
| + | |
| + | #ifdef ESIX_5_3_2_D |
| + | if (setpgrp() < 0) { |
| + | #else |
| + | if (setsid() < 0) { |
| + | #endif |
| + | |
| + | perror_msg_and_die("Unable to set new session"); |
| + | } |
| + | close(0); /* so that new vt becomes stdin */ |
| + | |
| + | /* and grab new one */ |
| + | if ((fd = open(vtname, O_RDWR)) == -1) |
| + | perror_msg_and_die("could not open %s", vtname); |
| + | |
| + | /* Reassign stdout and sterr */ |
| + | close(1); |
| + | close(2); |
| + | dup(fd); |
| + | dup(fd); |
| + | |
| + | execvp(cmd, &argv[2]); |
| + | /*execlp(cmd, cmd_args);*/ |
| + | _exit(1); |
| + | } |
| + | return EXIT_SUCCESS; |
| + | } |
| + | |
| + | /* |
| + | Local Variables: |
| + | c-file-style: "linux" |
| + | c-basic-offset: 4 |
| + | tab-width: 4 |
| + | End: |
| + | */ |
| @@ -341,6 +341,9 @@ | |
| #ifdef CONFIG_OD | |
| APPLET(od, od_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) | |
| #endif | |
| + | #ifdef CONFIG_OPENVT |
| + | APPLET(openvt, openvt_main, _BB_DIR_USR_BIN, _BB_SUID_NEVER) |
| + | #endif |
| #ifdef CONFIG_PASSWD | |
| APPLET(passwd, passwd_main, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS) | |
| #endif | |
| @@ -1347,6 +1347,13 @@ | |
| "Write an unambiguous representation, octal bytes by default, of FILE\n"\ | |
| "to standard output. With no FILE, or when FILE is -, read standard input." | |
| + | #define openvt_trivial_usage \ |
| + | "<vtnum> <COMMAND> [ARGS...]" |
| + | #define openvt_full_usage \ |
| + | "Start a command on a new virtual terminal" |
| + | #define openvt_example_usage \ |
| + | "openvt 2 /bin/ash\n" |
| + | |
| #ifdef CONFIG_FEATURE_SHA1_PASSWORDS | |
| #define PASSWORD_ALG_TYPES(a) a | |
| #else | |