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()"); }
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; } } } }
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), " -> "); } } }
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); }