1 1.19 mlelstv /* $NetBSD: wsconsctl.c,v 1.19 2018/11/23 06:31:57 mlelstv Exp $ */ 2 1.1 hannken 3 1.1 hannken /*- 4 1.9 jmmv * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc. 5 1.1 hannken * All rights reserved. 6 1.1 hannken * 7 1.1 hannken * This code is derived from software contributed to The NetBSD Foundation 8 1.1 hannken * by Juergen Hannken-Illjes. 9 1.1 hannken * 10 1.1 hannken * Redistribution and use in source and binary forms, with or without 11 1.1 hannken * modification, are permitted provided that the following conditions 12 1.1 hannken * are met: 13 1.1 hannken * 1. Redistributions of source code must retain the above copyright 14 1.1 hannken * notice, this list of conditions and the following disclaimer. 15 1.1 hannken * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 hannken * notice, this list of conditions and the following disclaimer in the 17 1.1 hannken * documentation and/or other materials provided with the distribution. 18 1.1 hannken * 19 1.1 hannken * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 hannken * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 hannken * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 hannken * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 hannken * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 hannken * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 hannken * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 hannken * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 hannken * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 hannken * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 hannken * POSSIBILITY OF SUCH DAMAGE. 30 1.1 hannken */ 31 1.1 hannken 32 1.15 perry #include <sys/cdefs.h> 33 1.14 jmmv #include <err.h> 34 1.1 hannken #include <fcntl.h> 35 1.1 hannken #include <string.h> 36 1.1 hannken #include <stdio.h> 37 1.3 matt #include <stdlib.h> 38 1.1 hannken #include <unistd.h> 39 1.14 jmmv 40 1.1 hannken #include "wsconsctl.h" 41 1.1 hannken 42 1.11 augustss #define PATH_KEYBOARD "/dev/wskbd" 43 1.11 augustss #define PATH_MOUSE "/dev/wsmouse" 44 1.1 hannken #define PATH_DISPLAY "/dev/ttyE0" 45 1.1 hannken 46 1.1 hannken extern struct field keyboard_field_tab[]; 47 1.1 hannken extern struct field mouse_field_tab[]; 48 1.1 hannken extern struct field display_field_tab[]; 49 1.1 hannken extern int keyboard_field_tab_len; 50 1.1 hannken extern int mouse_field_tab_len; 51 1.1 hannken extern int display_field_tab_len; 52 1.1 hannken 53 1.16 perry static void usage(const char *) __dead; 54 1.1 hannken 55 1.1 hannken static void 56 1.13 christos usage(const char *msg) 57 1.1 hannken { 58 1.4 cgd const char *progname = getprogname(); 59 1.4 cgd 60 1.1 hannken if (msg != NULL) 61 1.14 jmmv (void)fprintf(stderr, "%s: %s\n\n", progname, msg); 62 1.1 hannken 63 1.14 jmmv (void)fprintf(stderr, 64 1.14 jmmv "Usage: %s [-kmd] [-f file] [-n] name ...\n" 65 1.14 jmmv " -or- %s [-kmd] [-f file] [-n] -w name=value ...\n" 66 1.14 jmmv " -or- %s [-kmd] [-f file] [-n] -w name+=value ...\n" 67 1.14 jmmv " -or- %s [-kmd] [-f file] [-n] -a\n", 68 1.14 jmmv progname, progname, progname, progname); 69 1.1 hannken 70 1.14 jmmv exit(EXIT_FAILURE); 71 1.1 hannken } 72 1.1 hannken 73 1.1 hannken int 74 1.10 xtraeme main(int argc, char **argv) 75 1.1 hannken { 76 1.1 hannken int i, ch, fd; 77 1.1 hannken int aflag, dflag, kflag, mflag, wflag; 78 1.13 christos char *p; 79 1.13 christos const char *sep, *file; 80 1.1 hannken struct field *f, *field_tab; 81 1.1 hannken int do_merge, field_tab_len; 82 1.10 xtraeme void (*getval)(int); 83 1.10 xtraeme void (*putval)(int); 84 1.1 hannken 85 1.1 hannken aflag = 0; 86 1.1 hannken dflag = 0; 87 1.1 hannken kflag = 0; 88 1.1 hannken mflag = 0; 89 1.1 hannken wflag = 0; 90 1.1 hannken file = NULL; 91 1.1 hannken sep = "="; 92 1.12 lukem field_tab = NULL; 93 1.12 lukem field_tab_len = 0; 94 1.12 lukem getval = NULL; 95 1.12 lukem putval = NULL; 96 1.1 hannken 97 1.1 hannken while ((ch = getopt(argc, argv, "adf:kmnw")) != -1) { 98 1.1 hannken switch(ch) { 99 1.1 hannken case 'a': 100 1.1 hannken aflag = 1; 101 1.1 hannken break; 102 1.1 hannken case 'd': 103 1.1 hannken dflag = 1; 104 1.1 hannken break; 105 1.1 hannken case 'f': 106 1.1 hannken file = optarg; 107 1.1 hannken break; 108 1.1 hannken case 'k': 109 1.1 hannken kflag = 1; 110 1.1 hannken break; 111 1.1 hannken case 'm': 112 1.1 hannken mflag = 1; 113 1.1 hannken break; 114 1.1 hannken case 'n': 115 1.1 hannken sep = NULL; 116 1.1 hannken break; 117 1.1 hannken case 'w': 118 1.1 hannken wflag = 1; 119 1.1 hannken break; 120 1.1 hannken case '?': 121 1.1 hannken default: 122 1.1 hannken usage(NULL); 123 1.1 hannken } 124 1.1 hannken } 125 1.1 hannken 126 1.1 hannken argc -= optind; 127 1.1 hannken argv += optind; 128 1.1 hannken 129 1.1 hannken if (dflag + kflag + mflag == 0) 130 1.1 hannken kflag = 1; 131 1.1 hannken if (dflag + kflag + mflag > 1) 132 1.1 hannken usage("only one of -k, -d or -m may be given"); 133 1.1 hannken if (argc > 0 && aflag != 0) 134 1.1 hannken usage("excess arguments after -a"); 135 1.1 hannken if (aflag != 0 && wflag != 0) 136 1.1 hannken usage("only one of -a or -w may be given"); 137 1.1 hannken 138 1.1 hannken if (kflag) { 139 1.1 hannken if (file == NULL) 140 1.1 hannken file = PATH_KEYBOARD; 141 1.1 hannken field_tab = keyboard_field_tab; 142 1.1 hannken field_tab_len = keyboard_field_tab_len; 143 1.1 hannken getval = keyboard_get_values; 144 1.1 hannken putval = keyboard_put_values; 145 1.1 hannken } else if (mflag) { 146 1.1 hannken if (file == NULL) 147 1.1 hannken file = PATH_MOUSE; 148 1.1 hannken field_tab = mouse_field_tab; 149 1.1 hannken field_tab_len = mouse_field_tab_len; 150 1.1 hannken getval = mouse_get_values; 151 1.1 hannken putval = mouse_put_values; 152 1.1 hannken } else if (dflag) { 153 1.1 hannken if (file == NULL) 154 1.1 hannken file = PATH_DISPLAY; 155 1.1 hannken field_tab = display_field_tab; 156 1.1 hannken field_tab_len = display_field_tab_len; 157 1.1 hannken getval = display_get_values; 158 1.1 hannken putval = display_put_values; 159 1.1 hannken } 160 1.1 hannken 161 1.1 hannken field_setup(field_tab, field_tab_len); 162 1.1 hannken 163 1.1 hannken fd = open(file, O_WRONLY); 164 1.1 hannken if (fd < 0) 165 1.1 hannken fd = open(file, O_RDONLY); 166 1.1 hannken if (fd < 0) 167 1.14 jmmv err(EXIT_FAILURE, "%s", file); 168 1.1 hannken 169 1.1 hannken if (aflag != 0) { 170 1.1 hannken for (i = 0; i < field_tab_len; i++) 171 1.1 hannken if ((field_tab[i].flags & (FLG_NOAUTO|FLG_WRONLY)) == 0) 172 1.1 hannken field_tab[i].flags |= FLG_GET; 173 1.1 hannken (*getval)(fd); 174 1.1 hannken for (i = 0; i < field_tab_len; i++) 175 1.1 hannken if (field_tab[i].flags & FLG_NOAUTO) 176 1.18 dholland warnx("\"%s\" not shown with -a; use \"%s %s\"" 177 1.18 dholland " to view.", 178 1.18 dholland field_tab[i].name, 179 1.18 dholland getprogname(), field_tab[i].name); 180 1.8 jmmv else if (field_tab[i].flags & FLG_GET && 181 1.8 jmmv !(field_tab[i].flags & FLG_DISABLED)) 182 1.1 hannken pr_field(field_tab + i, sep); 183 1.2 hannken } else if (argc > 0) { 184 1.1 hannken if (wflag != 0) { 185 1.1 hannken for (i = 0; i < argc; i++) { 186 1.1 hannken p = strchr(argv[i], '='); 187 1.1 hannken if (p == NULL) 188 1.14 jmmv errx(EXIT_FAILURE, "'=' not found"); 189 1.1 hannken if (p > argv[i] && *(p - 1) == '+') { 190 1.1 hannken *(p - 1) = '\0'; 191 1.1 hannken do_merge = 1; 192 1.1 hannken } else 193 1.1 hannken do_merge = 0; 194 1.1 hannken *p++ = '\0'; 195 1.1 hannken f = field_by_name(argv[i]); 196 1.1 hannken if ((f->flags & FLG_RDONLY) != 0) 197 1.14 jmmv errx(EXIT_FAILURE, "%s: read only", 198 1.14 jmmv argv[i]); 199 1.1 hannken if (do_merge) { 200 1.1 hannken if ((f->flags & FLG_MODIFY) == 0) 201 1.14 jmmv errx(EXIT_FAILURE, 202 1.14 jmmv "%s: can only be set", 203 1.14 jmmv argv[i]); 204 1.1 hannken f->flags |= FLG_GET; 205 1.1 hannken (*getval)(fd); 206 1.1 hannken f->flags &= ~FLG_GET; 207 1.1 hannken } 208 1.1 hannken rd_field(f, p, do_merge); 209 1.1 hannken f->flags |= FLG_SET; 210 1.19 mlelstv if (do_merge) 211 1.19 mlelstv f->flags |= FLG_MODIFIED; 212 1.1 hannken (*putval)(fd); 213 1.19 mlelstv f->flags &= ~(FLG_SET | FLG_MODIFIED); 214 1.1 hannken } 215 1.1 hannken } else { 216 1.1 hannken for (i = 0; i < argc; i++) { 217 1.1 hannken f = field_by_name(argv[i]); 218 1.1 hannken if ((f->flags & FLG_WRONLY) != 0) 219 1.14 jmmv errx(EXIT_FAILURE, "%s: write only", 220 1.14 jmmv argv[i]); 221 1.1 hannken f->flags |= FLG_GET; 222 1.1 hannken } 223 1.1 hannken (*getval)(fd); 224 1.8 jmmv for (i = 0; i < field_tab_len; i++) { 225 1.8 jmmv if (field_tab[i].flags & FLG_DISABLED) 226 1.14 jmmv errx(EXIT_FAILURE, 227 1.14 jmmv "%s: no kernel support", 228 1.14 jmmv field_tab[i].name); 229 1.1 hannken if (field_tab[i].flags & FLG_GET) 230 1.1 hannken pr_field(field_tab + i, sep); 231 1.8 jmmv } 232 1.1 hannken } 233 1.6 jmmv } else { 234 1.6 jmmv close(fd); 235 1.2 hannken usage(NULL); 236 1.6 jmmv } 237 1.1 hannken 238 1.6 jmmv close(fd); 239 1.14 jmmv 240 1.14 jmmv return EXIT_SUCCESS; 241 1.1 hannken } 242