예제 #1
0
static void pr_fieldList(FILE *out, A_fieldList v, int d) {
 indent(out, d);
 if (v) {
   fprintf(out, "fieldList(\n");
   pr_field(out, v->head, d+1); fprintf(out, ",\n");
   pr_fieldList(out, v->tail, d+1); fprintf(out, ")");
 }
 else fprintf(out, "fieldList()");
}
예제 #2
0
void
keyboard_put_values(int fd)
{

	bell.which = 0;
	if (field_by_value(&bell.pitch)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOPITCH;
	if (field_by_value(&bell.period)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOPERIOD;
	if (field_by_value(&bell.volume)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOVOLUME;
	if (bell.which != 0 && ioctl(fd, WSKBDIO_SETBELL, &bell) < 0)
		err(EXIT_FAILURE, "WSKBDIO_SETBELL");
	if (bell.which & WSKBD_BELL_DOPITCH)
		pr_field(field_by_value(&bell.pitch), " -> ");
	if (bell.which & WSKBD_BELL_DOPERIOD)
		pr_field(field_by_value(&bell.period), " -> ");
	if (bell.which & WSKBD_BELL_DOVOLUME)
		pr_field(field_by_value(&bell.volume), " -> ");

	dfbell.which = 0;
	if (field_by_value(&dfbell.pitch)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOPITCH;
	if (field_by_value(&dfbell.period)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOPERIOD;
	if (field_by_value(&dfbell.volume)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOVOLUME;
	if (dfbell.which != 0 &&
	    ioctl(fd, WSKBDIO_SETDEFAULTBELL, &dfbell) < 0)
		err(EXIT_FAILURE, "WSKBDIO_SETDEFAULTBELL");
	if (dfbell.which & WSKBD_BELL_DOPITCH)
		pr_field(field_by_value(&dfbell.pitch), " -> ");
	if (dfbell.which & WSKBD_BELL_DOPERIOD)
		pr_field(field_by_value(&dfbell.period), " -> ");
	if (dfbell.which & WSKBD_BELL_DOVOLUME)
		pr_field(field_by_value(&dfbell.volume), " -> ");

	if (field_by_value(&kbmap)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETMAP, &kbmap) < 0)
			err(EXIT_FAILURE, "WSKBDIO_SETMAP");
		pr_field(field_by_value(&kbmap), " -> ");
	}

	repeat.which = 0;
	if (field_by_value(&repeat.del1)->flags & FLG_SET)
		repeat.which |= WSKBD_KEYREPEAT_DODEL1;
	if (field_by_value(&repeat.delN)->flags & FLG_SET)
		repeat.which |= WSKBD_KEYREPEAT_DODELN;
	if (repeat.which != 0 &&
	    ioctl(fd, WSKBDIO_SETKEYREPEAT, &repeat) < 0)
		err(EXIT_FAILURE, "WSKBDIO_SETKEYREPEAT");
	if (repeat.which & WSKBD_KEYREPEAT_DODEL1)
		pr_field(field_by_value(&repeat.del1), " -> ");
	if (repeat.which & WSKBD_KEYREPEAT_DODELN)
		pr_field(field_by_value(&repeat.delN), " -> ");

	dfrepeat.which = 0;
	if (field_by_value(&dfrepeat.del1)->flags & FLG_SET)
		dfrepeat.which |= WSKBD_KEYREPEAT_DODEL1;
	if (field_by_value(&dfrepeat.delN)->flags & FLG_SET)
		dfrepeat.which |= WSKBD_KEYREPEAT_DODELN;
	if (dfrepeat.which != 0 &&
	    ioctl(fd, WSKBDIO_SETDEFAULTKEYREPEAT, &dfrepeat) < 0)
		err(EXIT_FAILURE, "WSKBDIO_SETDEFAULTKEYREPEAT");
	if (dfrepeat.which &WSKBD_KEYREPEAT_DODEL1)
		pr_field(field_by_value(&dfrepeat.del1), " -> ");
	if (dfrepeat.which & WSKBD_KEYREPEAT_DODELN)
		pr_field(field_by_value(&dfrepeat.delN), " -> ");

	if (field_by_value(&ledstate)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETLEDS, &ledstate) < 0)
			err(EXIT_FAILURE, "WSKBDIO_SETLEDS");
		pr_field(field_by_value(&ledstate), " -> ");
	}

	if (field_by_value(&kbdencoding)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETENCODING, &kbdencoding) < 0)
			err(EXIT_FAILURE, "WSKBDIO_SETENCODING");
		pr_field(field_by_value(&kbdencoding), " -> ");
	}

	if (field_by_value(&keyclick)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETKEYCLICK, &keyclick) < 0)
			err(EXIT_FAILURE, "WSKBDIO_SETKEYCLICK");
		pr_field(field_by_value(&keyclick), " -> ");
	}


	if (havescroll == 0)
		return;

	scroll.which = 0;
	if (field_by_value(&scroll.mode)->flags & FLG_SET)
		scroll.which |= WSKBD_SCROLL_DOMODE;
	if (field_by_value(&scroll.modifier)->flags & FLG_SET)
		scroll.which |= WSKBD_SCROLL_DOMODIFIER;

	if (scroll.which & WSKBD_SCROLL_DOMODE)
		pr_field(field_by_value(&scroll.mode), " -> ");
	if (scroll.which & WSKBD_SCROLL_DOMODIFIER)
		pr_field(field_by_value(&scroll.modifier), " -> ");
	if (scroll.which != 0) {
		if (ioctl(fd, WSKBDIO_SETSCROLL, &scroll) == -1) {
			if (errno != ENODEV)
				err(EXIT_FAILURE, "WSKBDIO_SETSCROLL");
			else {
				warnx("scrolling is not supported by this "
				    "kernel");
				havescroll = 0;
			}
		}
	}
}
예제 #3
0
void
keyboard_put_values(const char *pre, int fd)
{
	bell.which = 0;
	if (field_by_value(keyboard_field_tab, &bell.pitch)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOPITCH;
	if (field_by_value(keyboard_field_tab, &bell.period)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOPERIOD;
	if (field_by_value(keyboard_field_tab, &bell.volume)->flags & FLG_SET)
		bell.which |= WSKBD_BELL_DOVOLUME;
	if (bell.which != 0 && ioctl(fd, WSKBDIO_SETBELL, &bell) < 0)
		warn("WSKBDIO_SETBELL");
	else {
		if (bell.which & WSKBD_BELL_DOPITCH)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &bell.pitch), " -> ");
		if (bell.which & WSKBD_BELL_DOPERIOD)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &bell.period), " -> ");
		if (bell.which & WSKBD_BELL_DOVOLUME)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &bell.volume), " -> ");
	}

	dfbell.which = 0;
	if (field_by_value(keyboard_field_tab, &dfbell.pitch)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOPITCH;
	if (field_by_value(keyboard_field_tab, &dfbell.period)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOPERIOD;
	if (field_by_value(keyboard_field_tab, &dfbell.volume)->flags & FLG_SET)
		dfbell.which |= WSKBD_BELL_DOVOLUME;
	if (dfbell.which != 0 &&
	    ioctl(fd, WSKBDIO_SETDEFAULTBELL, &dfbell) < 0)
		warn("WSKBDIO_SETDEFAULTBELL");
	else {
		if (dfbell.which & WSKBD_BELL_DOPITCH)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &dfbell.pitch), " -> ");
		if (dfbell.which & WSKBD_BELL_DOPERIOD)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &dfbell.period), " -> ");
		if (dfbell.which & WSKBD_BELL_DOVOLUME)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &dfbell.volume), " -> ");
	}

	if (field_by_value(keyboard_field_tab, &kbmap)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETMAP, &kbmap) < 0)
			warn("WSKBDIO_SETMAP");
	}

	repeat.which = 0;
	if (field_by_value(keyboard_field_tab, &repeat.del1)->flags & FLG_SET)
		repeat.which |= WSKBD_KEYREPEAT_DODEL1;
	if (field_by_value(keyboard_field_tab, &repeat.delN)->flags & FLG_SET)
		repeat.which |= WSKBD_KEYREPEAT_DODELN;
	if (repeat.which != 0 &&
	    ioctl(fd, WSKBDIO_SETKEYREPEAT, &repeat) < 0)
		warn("WSKBDIO_SETKEYREPEAT");
	else {
		if (repeat.which & WSKBD_KEYREPEAT_DODEL1)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &repeat.del1), " -> ");
		if (repeat.which & WSKBD_KEYREPEAT_DODELN)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &repeat.delN), " -> ");
	}

	dfrepeat.which = 0;
	if (field_by_value(keyboard_field_tab, &dfrepeat.del1)->flags & FLG_SET)
		dfrepeat.which |= WSKBD_KEYREPEAT_DODEL1;
	if (field_by_value(keyboard_field_tab, &dfrepeat.delN)->flags & FLG_SET)
		dfrepeat.which |= WSKBD_KEYREPEAT_DODELN;
	if (dfrepeat.which != 0 &&
	    ioctl(fd, WSKBDIO_SETDEFAULTKEYREPEAT, &dfrepeat) < 0)
		warn("WSKBDIO_SETDEFAULTKEYREPEAT");
	else {
		if (dfrepeat.which &WSKBD_KEYREPEAT_DODEL1)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &dfrepeat.del1), " -> ");
		if (dfrepeat.which & WSKBD_KEYREPEAT_DODELN)
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &dfrepeat.delN), " -> ");
	}

	if (field_by_value(keyboard_field_tab, &ledstate)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETLEDS, &ledstate) < 0)
			warn("WSKBDIO_SETLEDS");
		else {
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &ledstate), " -> ");
		}
	}

	if (field_by_value(keyboard_field_tab, &kbdencoding)->flags & FLG_SET) {
		if (ioctl(fd, WSKBDIO_SETENCODING, &kbdencoding) < 0)
			warn("WSKBDIO_SETENCODING");
		else {
			pr_field(pre, field_by_value(keyboard_field_tab,
			    &kbdencoding), " -> ");
		}
	}
}
예제 #4
0
파일: wsconsctl.c 프로젝트: sofuture/bitrig
int
main(int argc, char *argv[])
{
	int i, ch, error = 0, aflag = 0, do_merge, putval, devidx, devfd;
	struct vartypesw *sw = NULL;
	char *getsep = "=", *setsep = " -> ", *p;
	char *wdev = NULL;
	char *device;
	struct field *f;
	char devname[20];

	while ((ch = getopt(argc, argv, "af:nw")) != -1) {
		switch(ch) {
		case 'a':
			aflag = 1;
			break;
		case 'f':
			wdev = optarg;
			break;
		case 'n':
			getsep = setsep = NULL;
			break;
		case 'w':
			/* compat */
			break;
		default:
			usage();
		}
	}

	argc -= optind;
	argv += optind;

	if (argc > 0 && aflag != 0)
		errx(1, "excess arguments after -a");
	if (argc == 0)
		aflag = 1;

	if (aflag != 0) {
		for (sw = typesw; sw->name; sw++) {
			for (devidx = 0;; devidx++) {
				device = (*sw->nextdev)(devidx);
				if (!device ||
				    ((devfd = open(device, O_WRONLY)) < 0 &&
				     (devfd = open(device, O_RDONLY)) < 0)) {
					if (!device || errno != ENXIO) {
						if (device && errno != ENOENT) {
							warn("%s", device);
							error = 1;	
						}
						break;
					} else
						continue;
				}

				if (devidx == 0)
					snprintf(devname, sizeof(devname),
					    "%s", sw->name);
				else
					snprintf(devname, sizeof(devname),
					    "%s%d", sw->name, devidx);

				for (f = sw->field_tab; f->name; f++)
					if (!(f->flags &
					    (FLG_NOAUTO|FLG_WRONLY)))
						f->flags |= FLG_GET;
				(*sw->getval)(devfd);
				for (f = sw->field_tab; f->name; f++)
					if (f->flags & FLG_DEAD)
						continue;
					else if (f->flags & FLG_NOAUTO)
						warnx("Use explicit arg to "
						    "view %s.%s.",
						    devname, f->name);
					else if (f->flags & FLG_GET)
						pr_field(devname, f, getsep);
			}
		}
	} else if (argc > 0) {
		for (i = 0; i < argc; i++) {
			sw = tab_by_name(argv[i], &devidx);
			if (!sw)
				continue;

			if (!wdev)
				device = (*sw->nextdev)(devidx);
			else
				device = wdev;

			if (!device ||
			    ((devfd = open(device, O_WRONLY)) < 0 &&
			     (devfd = open(device, O_RDONLY)) < 0)) {
				if (!device) {
					const char *c = strchr(argv[i], '.');
					int k;
					if (!c)
						c = strchr(argv[i], '\0');
					k = c - argv[i];
					warnx("%*.*s: no such variable",
					    k, k, argv[i]);
				} else
					warn("%s", device);
				error = 1;
				continue;
			}

			if (devidx == 0)
				snprintf(devname, sizeof(devname),
				    "%s", sw->name);
			else
				snprintf(devname, sizeof(devname),
				    "%s%d", sw->name, devidx);

			p = strchr(argv[i], '=');
			if (p == NULL) {
				if (!strchr(argv[i], '.')) {
					for (f = sw->field_tab; f->name; f++)
						if (!(f->flags &
						    (FLG_NOAUTO|FLG_WRONLY)))
							f->flags |= FLG_GET;
					(*sw->getval)(devfd);
					for (f = sw->field_tab; f->name; f++)
						if (f->flags & FLG_DEAD)
							continue;
						else if (f->flags & FLG_NOAUTO)
							warnx("Use explicit "
							    "arg to view "
							    "%s.%s.",
							    devname, f->name);
						else if (f->flags & FLG_GET)
							pr_field(devname, f,
							    getsep);
					continue;
				}

				f = field_by_name(sw->field_tab, argv[i]);
				if (f->flags & FLG_DEAD)
					continue;
				if ((f->flags & FLG_WRONLY)) {
					warnx("%s: write only", argv[i]);
					continue;
				}
				f->flags |= FLG_GET;
				(*sw->getval)(devfd);
				if (f->flags & FLG_DEAD)
					continue;
				pr_field(devname, f, getsep);
			} else {
				if (!strchr(argv[i], '.') ||
				    (strchr(argv[i], '.') > p)) {
					warnx("%s: illegal variable name",
					    argv[i]);
					continue;
				}
				if (p > argv[i] &&
				    (*(p - 1) == '+' || *(p - 1) == '-')) {
					do_merge = *(p - 1);
					*(p - 1) = '\0';
				} else
					do_merge = 0;
				*p++ = '\0';

				f = field_by_name(sw->field_tab, argv[i]);
				if (f->flags & FLG_DEAD)
					continue;
				if (f->flags & FLG_RDONLY) {
					warnx("%s: read only", argv[i]);
					continue;
				}
				if (do_merge || f->flags & FLG_INIT) {
					if (!(f->flags & FLG_MODIFY))
						errx(1, "%s: can only be set",
						    argv[i]);
					f->flags |= FLG_GET;
					(*sw->getval)(devfd);
					f->flags &= ~FLG_GET;
				}
				rd_field(f, p, do_merge);
				f->flags |= FLG_SET;
				putval = (*sw->putval)(devfd);
				f->flags &= ~FLG_SET;
				if (putval != 0 ||
				    f->flags & (FLG_DEAD|FLG_NOAUTO))
					continue;
				if (f->flags & FLG_WRONLY) {
					pr_field(devname, f, setsep);
				} else {
					f->flags |= FLG_GET;
					(*sw->getval)(devfd);
					if (f->flags & FLG_DEAD)
						continue;
					pr_field(devname, f, setsep);
				}
			}

			close(devfd);
		}
	} else
		usage();

	exit(error);
}