diff options
Diffstat (limited to 'usr.sbin/digictl/digictl.c')
-rw-r--r-- | usr.sbin/digictl/digictl.c | 70 |
1 files changed, 61 insertions, 9 deletions
diff --git a/usr.sbin/digictl/digictl.c b/usr.sbin/digictl/digictl.c index 49d48df..dbcdb93 100644 --- a/usr.sbin/digictl/digictl.c +++ b/usr.sbin/digictl/digictl.c @@ -36,10 +36,13 @@ #include <sys/ioctl.h> #include <unistd.h> +enum aflag { NO_AFLAG, ALTPIN_DISABLE, ALTPIN_ENABLE, ALTPIN_QUERY }; + static int usage(const char *prog) { - fprintf(stderr, "Usage: %s [-d debug] [-ir] device...\n", prog); + fprintf(stderr, "Usage: %s -a disable|enable|query device\n", prog); + fprintf(stderr, " %s [-d debug] [-ir] ctrl-device...\n", prog); return (EX_USAGE); } @@ -49,35 +52,56 @@ main(int argc, char **argv) char namedata[256], *name = namedata; const char *prog; enum digi_model model; - int ch, debug, fd, i, res; + int altpin, ch, debug, fd, i, res; int dflag, iflag, rflag; + enum aflag aflag; if ((prog = strrchr(argv[0], '/')) == NULL) prog = argv[0]; else prog++; + aflag = NO_AFLAG; dflag = iflag = rflag = 0; - while ((ch = getopt(argc, argv, "d:ir")) != -1) + while ((ch = getopt(argc, argv, "a:d:ir")) != -1) switch (ch) { + case 'a': + if (strcasecmp(optarg, "disable") == 0) + aflag = ALTPIN_DISABLE; + else if (strcasecmp(optarg, "enable") == 0) + aflag = ALTPIN_ENABLE; + else if (strcasecmp(optarg, "query") == 0) + aflag = ALTPIN_QUERY; + else + return (usage(prog)); + break; + case 'd': dflag = 1; debug = atoi(optarg); break; + case 'i': iflag = 1; break; + case 'r': rflag = 1; break; + default: - return usage(prog); + return (usage(prog)); } - if (argc < optind) - return usage(prog); + if ((dflag || iflag || rflag) && aflag != NO_AFLAG) + return (usage(prog)); + + if (argc <= optind) + return (usage(prog)); + altpin = (aflag == ALTPIN_ENABLE); res = 0; + for (i = optind; i < argc; i++) { if ((fd = open(argv[i], O_RDONLY)) == -1) { fprintf(stderr, "%s: %s: open: %s\n", prog, argv[i], @@ -86,6 +110,32 @@ main(int argc, char **argv) continue; } + switch (aflag) { + case NO_AFLAG: + break; + + case ALTPIN_ENABLE: + case ALTPIN_DISABLE: + if (ioctl(fd, DIGIIO_SETALTPIN, &altpin) != 0) { + fprintf(stderr, "%s: %s: set altpin: %s\n", + prog, argv[i], strerror(errno)); + res++; + } + break; + + case ALTPIN_QUERY: + if (ioctl(fd, DIGIIO_GETALTPIN, &altpin) != 0) { + fprintf(stderr, "%s: %s: get altpin: %s\n", + prog, argv[i], strerror(errno)); + res++; + } else { + if (argc > optind + 1) + printf("%s: ", argv[i]); + puts(altpin ? "enabled" : "disabled"); + } + break; + } + if (dflag && ioctl(fd, DIGIIO_DEBUG, &debug) != 0) { fprintf(stderr, "%s: %s: debug: %s\n", prog, argv[i], strerror(errno)); @@ -101,9 +151,11 @@ main(int argc, char **argv) fprintf(stderr, "%s: %s: ident: %s\n", prog, argv[i], strerror(errno)); res++; - } else - printf("%s: %s (type %d)\n", - argv[i], name, (int)model); + } else { + if (argc > optind + 1) + printf("%s: ", argv[i]); + printf("%s (type %d)\n", name, (int)model); + } } if (rflag && ioctl(fd, DIGIIO_REINIT) != 0) { |