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