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