wsconscfg.c revision 1.6
1251881Speter/* $OpenBSD: wsconscfg.c,v 1.6 2001/07/27 20:34:36 pvalchev Exp $ */ 2251881Speter/* $NetBSD: wsconscfg.c,v 1.4 1999/07/29 18:24:10 augustss Exp $ */ 3251881Speter 4251881Speter/* 5251881Speter * Copyright (c) 1999 6251881Speter * Matthias Drochner. All rights reserved. 7251881Speter * 8251881Speter * Redistribution and use in source and binary forms, with or without 9251881Speter * modification, are permitted provided that the following conditions 10251881Speter * are met: 11251881Speter * 1. Redistributions of source code must retain the above copyright 12251881Speter * notice, this list of conditions and the following disclaimer. 13251881Speter * 2. Redistributions in binary form must reproduce the above copyright 14251881Speter * notice, this list of conditions and the following disclaimer in the 15251881Speter * documentation and/or other materials provided with the distribution. 16251881Speter * 3. All advertising materials mentioning features or use of this software 17251881Speter * must display the following acknowledgement: 18251881Speter * This product includes software developed for the NetBSD Project 19251881Speter * by Matthias Drochner. 20251881Speter * 4. The name of the author may not be used to endorse or promote products 21251881Speter * derived from this software without specific prior written permission. 22251881Speter * 23251881Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24251881Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25251881Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26251881Speter * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27251881Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28251881Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29251881Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30251881Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31251881Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32251881Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33251881Speter * 34251881Speter */ 35251881Speter 36251881Speter#include <stdio.h> 37251881Speter#include <string.h> 38251881Speter#include <fcntl.h> 39251881Speter#include <unistd.h> 40251881Speter#include <sys/types.h> 41251881Speter#include <sys/ioctl.h> 42251881Speter#include <err.h> 43251881Speter#include <errno.h> 44251881Speter 45251881Speter#include <dev/wscons/wsconsio.h> 46251881Speter 47251881Speter#define DEFDEV "/dev/ttyCcfg" 48251881Speter 49251881Speterstatic void usage __P((void)); 50251881Speterint main __P((int, char**)); 51251881Speter 52251881Speterstatic void 53251881Speterusage() 54251881Speter{ 55251881Speter extern char *__progname; 56251881Speter 57251881Speter (void)fprintf(stderr, 58251881Speter "Usage: %s [-f wsdev] [-d [-F]] [-k] [-m] [-t type] " 59251881Speter "[-e emul] {vt | [kbd] | [mux]}\n", __progname); 60251881Speter exit(1); 61251881Speter} 62251881Speter 63251881Speterint 64251881Spetermain(argc, argv) 65251881Speter int argc; 66251881Speter char **argv; 67251881Speter{ 68251881Speter char *wsdev; 69251881Speter int c, delete, kbd, idx, wsfd, res, mux; 70251881Speter struct wsdisplay_addscreendata asd; 71251881Speter struct wsdisplay_delscreendata dsd; 72251881Speter struct wsmux_device wmd; 73251881Speter 74251881Speter wsdev = DEFDEV; 75251881Speter delete = 0; 76251881Speter kbd = 0; 77251881Speter mux = 0; 78251881Speter asd.screentype[0] = 0; 79251881Speter asd.emul[0] = 0; 80251881Speter dsd.flags = 0; 81251881Speter 82 while ((c = getopt(argc, argv, "f:dkmt:e:F")) != -1) { 83 switch (c) { 84 case 'f': 85 wsdev = optarg; 86 break; 87 case 'd': 88 delete++; 89 break; 90 case 'k': 91 kbd++; 92 break; 93 case 'm': 94 mux++; 95 kbd++; 96 break; 97 case 't': 98 strlcpy(asd.screentype, optarg, WSSCREEN_NAME_SIZE); 99 break; 100 case 'e': 101 strlcpy(asd.emul, optarg, WSEMUL_NAME_SIZE); 102 break; 103 case 'F': 104 dsd.flags |= WSDISPLAY_DELSCR_FORCE; 105 break; 106 case '?': 107 default: 108 usage(); 109 break; 110 } 111 } 112 argc -= optind; 113 argv += optind; 114 115 if (kbd ? (argc > 1) : (argc != 1)) 116 usage(); 117 118 idx = -1; 119 if (argc > 0 && sscanf(argv[0], "%d", &idx) != 1) 120 errx(1, "invalid index"); 121 122 wsfd = open(wsdev, O_RDWR, 0); 123 if (wsfd < 0) 124 err(2, "%s", wsdev); 125 126 if (kbd) { 127 if (mux) 128 wmd.type = WSMUX_MUX; 129 else 130 wmd.type = WSMUX_KBD; 131 wmd.idx = idx; 132 if (delete) { 133 res = ioctl(wsfd, WSMUX_REMOVE_DEVICE, &wmd); 134 if (res < 0) 135 err(3, "WSMUX_REMOVE_DEVICE"); 136 } else { 137 res = ioctl(wsfd, WSMUX_ADD_DEVICE, &wmd); 138 if (res < 0) 139 err(3, "WSMUX_ADD_DEVICE"); 140 } 141 } else if (delete) { 142 dsd.idx = idx; 143 res = ioctl(wsfd, WSDISPLAYIO_DELSCREEN, &dsd); 144 if (res < 0) 145 err(3, "WSDISPLAYIO_DELSCREEN"); 146 } else { 147 asd.idx = idx; 148 res = ioctl(wsfd, WSDISPLAYIO_ADDSCREEN, &asd); 149 if (res < 0) { 150 if (errno == EBUSY) 151 errx(3, "screen %d is already configured", idx); 152 else 153 err(3, "WSDISPLAYIO_ADDSCREEN"); 154 } 155 } 156 157 return (0); 158} 159