Index: head/sbin/conscontrol/conscontrol.8 =================================================================== --- head/sbin/conscontrol/conscontrol.8 (revision 220800) +++ head/sbin/conscontrol/conscontrol.8 (revision 220801) @@ -1,115 +1,115 @@ .\" .\" Copyright (c) 2001 Jonathan Lemon .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $FreeBSD$ .\" -.Dd October 23, 2001 +.Dd April 14, 2011 .Dt CONSCONTROL 8 .Os .Sh NAME .Nm conscontrol .Nd control physical console devices .Sh SYNOPSIS .Nm .Op Cm list .Nm .Cm mute on | off .Nm .Cm add | delete .Ar console .Nm -.Cm set Ar console | Cm unset +.Cm set | unset Ar console .Sh DESCRIPTION The .Nm utility is used to examine and modify the physical devices which back the virtual console devices. If no arguments (or only the .Cm list command) are specified, the current console settings are shown. .Pp There are two types of logical consoles; a high level console which is represented by .Pa /dev/console , and a low level console. The low level console is used for kernel .Xr printf 9 and .Xr ddb 4 debugger support, while the high level console is used by user programs like .Xr syslogd 8 . Multiple device support is implemented only for the low level console; the high level console is set to the first device in the console list. .Pp Multiple console support may be invoked by passing the kernel the .Fl D flag from the boot loader, or by using .Nm to change the list of console devices after the system has booted. .Pp The following options are available: .Bl -tag -width indent .It Cm add | delete Ar console Add or delete a physical device from the logical console. The device must support low-level console operations. Adding a device will place it at the front of the list of console devices; the first device is used for the high level console. .Pp The .Ar console argument is the name of a console device in .Pa /dev ; the name of the directory may be omitted. .It Cm mute on | off Change the state of console muting. All console output is suppressed when console muting is .Cm on . -.It Cm set Ar console | Cm unset +.It Cm set | unset Ar console Set or unset the virtual console. When unset, output from the system, such as the kernel .Xr printf 9 , always goes out to the real main console. When set, it goes to another. This is an interface to the tty ioctl .Dv TIOCCONS . .El .Sh SEE ALSO .Xr sio 4 , .Xr syscons 4 , .Xr tty 4 , .Xr boot 8 , .Xr loader 8 .Sh HISTORY The .Nm utility first appeared in .Fx 5.0 . .Sh AUTHORS .An Jonathan Lemon Index: head/sbin/conscontrol/conscontrol.c =================================================================== --- head/sbin/conscontrol/conscontrol.c (revision 220800) +++ head/sbin/conscontrol/conscontrol.c (revision 220801) @@ -1,208 +1,196 @@ /*- * Copyright (c) 2001 Jonathan Lemon * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include #include #include #include #include #define DEVDIR "/dev/" static void __dead2 usage(void) { (void)fprintf(stderr, "%s\n%s\n%s\n%s\n", "usage: conscontrol [list]", " conscontrol mute on | off", " conscontrol add | delete console", - " conscontrol set console | unset"); + " conscontrol set | unset console"); exit(1); } static void consstatus(void) { int mute; size_t len; char *buf, *p, *avail; len = sizeof(mute); if (sysctlbyname("kern.consmute", &mute, &len, NULL, 0) == -1) err(1, "kern.consmute retrieval failed"); if (sysctlbyname("kern.console", NULL, &len, NULL, 0) == -1) err(1, "kern.console estimate failed"); if ((buf = malloc(len)) == NULL) errx(1, "kern.console malloc failed"); if (sysctlbyname("kern.console", buf, &len, NULL, 0) == -1) err(1, "kern.console retrieval failed"); if ((avail = strchr(buf, '/')) == NULL) errx(1, "kern.console format not understood"); p = avail; *avail++ = '\0'; if (p != buf) *--p = '\0'; /* remove trailing ',' */ p = avail + strlen(avail); if (p != avail) *--p = '\0'; /* remove trailing ',' */ printf("Configured: %s\n", buf); printf(" Available: %s\n", avail); printf(" Muting: %s\n", mute ? "on" : "off"); free(buf); } static void consmute(const char *onoff) { int mute; size_t len; if (strcmp(onoff, "on") == 0) mute = 1; else if (strcmp(onoff, "off") == 0) mute = 0; else usage(); len = sizeof(mute); if (sysctlbyname("kern.consmute", NULL, NULL, &mute, len) == -1) err(1, "could not change console muting"); } /* * The name we supply to the sysctls should be an entry in /dev. If * the user has specified the full pathname in /dev, DTRT. If he * specifies a name in some other directory, it's an error. */ static char* stripdev(char *devnam) { if (memcmp (devnam, DEVDIR, strlen(DEVDIR)) == 0) return (&devnam[strlen(DEVDIR)]); /* remove /dev */ else if (strchr (devnam, '/')) { fprintf(stderr, "Not a device in /dev: %s\n", devnam); return (NULL); /* end of string */ } else return (devnam); /* passed */ } static void consadd(char *devnam) { size_t len; devnam = stripdev(devnam); if (devnam == NULL) return; len = strlen(devnam); if (sysctlbyname("kern.console", NULL, NULL, devnam, len) == -1) err(1, "could not add %s as a console", devnam); } static void consdel(char *devnam) { char *buf; size_t len; devnam = stripdev(devnam); if (devnam == NULL) return; len = strlen(devnam) + sizeof("-"); if ((buf = malloc(len)) == NULL) errx(1, "malloc failed"); buf[0] = '-'; strcpy(buf + 1, devnam); if (sysctlbyname("kern.console", NULL, NULL, buf, len) == -1) err(1, "could not remove %s as a console", devnam); free(buf); } static void -consset(char *devnam) +consset(char *devnam, int flag) { - int ttyfd, flag = 1; + int ttyfd; ttyfd = open(devnam, O_RDONLY); if (ttyfd == -1) err(1, "opening %s", devnam); if (ioctl(ttyfd, TIOCCONS, &flag) == -1) - err(1, "could not set %s as virtual console", devnam); + err(1, "could not %s %s as virtual console", + flag ? "set" : "unset", devnam); close(ttyfd); } -static void -consunset(void) -{ - int ttyfd, flag = 0; - - ttyfd = open(DEVDIR "console", O_RDONLY); - if (ttyfd == -1) - err(1, "opening virtual console"); - if (ioctl(ttyfd, TIOCCONS, &flag) == -1) - err(1, "could not unset virtual console"); - close(ttyfd); -} - int main(int argc, char **argv) { if (getopt(argc, argv, "") != -1) usage(); argc -= optind; argv += optind; if (argc > 0 && strcmp(argv[0], "list") != 0) { - if (argc == 1 && strcmp(argv[0], "unset") == 0) - consunset(); - else if (argc != 2) + if (argc != 2) usage(); else if (strcmp(argv[0], "mute") == 0) consmute(argv[1]); else if (strcmp(argv[0], "add") == 0) consadd(argv[1]); else if (strcmp(argv[0], "delete") == 0) consdel(argv[1]); else if (strcmp(argv[0], "set") == 0) - consset(argv[1]); + consset(argv[1], 1); + else if (strcmp(argv[0], "unset") == 0) + consset(argv[1], 0); else usage(); } consstatus(); exit(0); }