1/* vi: set sw=4 ts=4: */ 2/* 3 * setconsole.c - redirect system console output 4 * 5 * Copyright (C) 2004,2005 Enrik Berkhan <Enrik.Berkhan@inka.de> 6 * Copyright (C) 2008 Bernhard Reutner-Fischer 7 * 8 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 9 */ 10//config:config SETCONSOLE 11//config: bool "setconsole (3.6 kb)" 12//config: default y 13//config: select PLATFORM_LINUX 14//config: help 15//config: Redirect writes to /dev/console to another device, 16//config: like the current tty while logged in via telnet. 17//config: This does not redirect kernel log, only writes 18//config: from user space. 19//config: 20//config:config FEATURE_SETCONSOLE_LONG_OPTIONS 21//config: bool "Enable long options" 22//config: default y 23//config: depends on SETCONSOLE && LONG_OPTS 24 25//applet:IF_SETCONSOLE(APPLET_NOEXEC(setconsole, setconsole, BB_DIR_SBIN, BB_SUID_DROP, setconsole)) 26 27//kbuild:lib-$(CONFIG_SETCONSOLE) += setconsole.o 28 29//usage:#define setconsole_trivial_usage 30//usage: "[-r] [DEVICE]" 31//usage:#define setconsole_full_usage "\n\n" 32//usage: "Make writes to /dev/console appear on DEVICE (default: /dev/tty)." 33//usage: "\n""Does not redirect kernel log output or reads from /dev/console." 34//usage: "\n" 35//usage: "\n"" -r Reset: writes to /dev/console go to kernel log tty(s)" 36 37/* It was a bbox-specific invention, but SUSE does have a similar utility. 38 * SUSE has no -r option, though. 39 */ 40 41#include "libbb.h" 42 43int setconsole_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 44int setconsole_main(int argc UNUSED_PARAM, char **argv) 45{ 46 const char *device = CURRENT_TTY; 47 int reset; 48 49 /* at most one non-option argument */ 50 reset = getopt32(argv, "^" "r" "\0" "?1"); 51 52 argv += 1 + reset; 53 if (*argv) { 54 device = *argv; 55 } else { 56 if (reset) 57 device = DEV_CONSOLE; 58 } 59 60//TODO: fails if TIOCCONS redir is already active to some tty. 61//I think SUSE version first does TIOCCONS on /dev/console fd (iow: resets) 62//then TIOCCONS to new tty? 63 xioctl(xopen(device, O_WRONLY), TIOCCONS, NULL); 64 return EXIT_SUCCESS; 65} 66