1 /* $NetBSD: wsconscfg.c,v 1.9 2001/06/25 08:47:29 ad Exp $ */ 2 3 /* 4 * Copyright (c) 1999 5 * Matthias Drochner. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the NetBSD Project 18 * by Matthias Drochner. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 */ 34 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <fcntl.h> 38 #include <unistd.h> 39 #include <sys/types.h> 40 #include <sys/ioctl.h> 41 #include <err.h> 42 #include <errno.h> 43 44 #include <dev/wscons/wsconsio.h> 45 46 #define DEFDEV "/dev/ttyEcfg" 47 48 static void usage __P((void)); 49 int main __P((int, char**)); 50 51 static void 52 usage() 53 { 54 55 (void)fprintf(stderr, 56 "Usage: %s [-f wsdev] [-d [-F]] [-k] [-m] [-t type]" 57 " [-e emul] {vt | [kbd] | [mux]}\n", getprogname()); 58 exit(1); 59 } 60 61 int 62 main(argc, argv) 63 int argc; 64 char **argv; 65 { 66 char *wsdev; 67 int c, delete, kbd, idx, wsfd, res, mux; 68 struct wsdisplay_addscreendata asd; 69 struct wsdisplay_delscreendata dsd; 70 struct wsmux_device wmd; 71 72 wsdev = DEFDEV; 73 delete = 0; 74 kbd = 0; 75 mux = 0; 76 asd.screentype = 0; 77 asd.emul = 0; 78 dsd.flags = 0; 79 80 while ((c = getopt(argc, argv, "f:dkmt:e:F")) != -1) { 81 switch (c) { 82 case 'f': 83 wsdev = optarg; 84 break; 85 case 'd': 86 delete++; 87 break; 88 case 'k': 89 kbd++; 90 break; 91 case 'm': 92 mux++; 93 kbd++; 94 break; 95 case 't': 96 asd.screentype = optarg; 97 break; 98 case 'e': 99 asd.emul = optarg; 100 break; 101 case 'F': 102 dsd.flags |= WSDISPLAY_DELSCR_FORCE; 103 break; 104 case '?': 105 default: 106 usage(); 107 break; 108 } 109 } 110 argc -= optind; 111 argv += optind; 112 113 if (kbd ? (argc > 1) : (argc != 1)) 114 usage(); 115 116 idx = -1; 117 if (argc > 0 && sscanf(argv[0], "%d", &idx) != 1) 118 errx(1, "invalid index"); 119 120 wsfd = open(wsdev, O_RDWR, 0); 121 if (wsfd < 0) 122 err(2, "%s", wsdev); 123 124 if (kbd) { 125 if (mux) 126 wmd.type = WSMUX_MUX; 127 else 128 wmd.type = WSMUX_KBD; 129 wmd.idx = idx; 130 if (delete) { 131 res = ioctl(wsfd, WSMUX_REMOVE_DEVICE, &wmd); 132 if (res < 0) 133 err(3, "WSMUX_REMOVE_DEVICE"); 134 } else { 135 res = ioctl(wsfd, WSMUX_ADD_DEVICE, &wmd); 136 if (res < 0) 137 err(3, "WSMUX_ADD_DEVICE"); 138 } 139 } else if (delete) { 140 dsd.idx = idx; 141 res = ioctl(wsfd, WSDISPLAYIO_DELSCREEN, &dsd); 142 if (res < 0) 143 err(3, "WSDISPLAYIO_DELSCREEN"); 144 } else { 145 asd.idx = idx; 146 res = ioctl(wsfd, WSDISPLAYIO_ADDSCREEN, &asd); 147 if (res < 0) { 148 if (errno == EBUSY) 149 errx(3, "screen %d is already configured", idx); 150 else 151 err(3, "WSDISPLAYIO_ADDSCREEN"); 152 } 153 } 154 155 return (0); 156 } 157