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