]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/digictl/digictl.c
Merge branch 'releng/11.3' into releng-CDN/11.3
[FreeBSD/FreeBSD.git] / usr.sbin / digictl / digictl.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2001 Brian Somers <brian@Awfulhak.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30
31 #include <errno.h>
32 #include <fcntl.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <sysexits.h>
37 #include <sys/digiio.h>
38 #include <sys/ioctl.h>
39 #include <unistd.h>
40
41 enum aflag { NO_AFLAG, ALTPIN_DISABLE, ALTPIN_ENABLE, ALTPIN_QUERY };
42
43 static int
44 usage(const char *prog)
45 {
46         fprintf(stderr, "usage: %s -a disable|enable|query device\n", prog);
47         fprintf(stderr, "       %s [-d debug] [-ir] ctrl-device...\n", prog);
48         return (EX_USAGE);
49 }
50
51 int
52 main(int argc, char **argv)
53 {
54         char namedata[256], *name = namedata;
55         const char *prog;
56         enum digi_model model;
57         int altpin, ch, debug, fd, i, res;
58         int dflag, iflag, rflag;
59         enum aflag aflag;
60
61         if ((prog = strrchr(argv[0], '/')) == NULL)
62                 prog = argv[0];
63         else
64                 prog++;
65
66         aflag = NO_AFLAG;
67         dflag = iflag = rflag = 0;
68         while ((ch = getopt(argc, argv, "a:d:ir")) != -1)
69                 switch (ch) {
70                 case 'a':
71                         if (strcasecmp(optarg, "disable") == 0)
72                                 aflag = ALTPIN_DISABLE;
73                         else if (strcasecmp(optarg, "enable") == 0)
74                                 aflag = ALTPIN_ENABLE;
75                         else if (strcasecmp(optarg, "query") == 0)
76                                 aflag = ALTPIN_QUERY;
77                         else
78                                 return (usage(prog));
79                         break;
80
81                 case 'd':
82                         dflag = 1;
83                         debug = atoi(optarg);
84                         break;
85
86                 case 'i':
87                         iflag = 1;
88                         break;
89
90                 case 'r':
91                         rflag = 1;
92                         break;
93
94                 default:
95                         return (usage(prog));
96                 }
97
98         if ((dflag || iflag || rflag) && aflag != NO_AFLAG)
99                 return (usage(prog));
100
101         if (argc <= optind)
102                 return (usage(prog));
103
104         altpin = (aflag == ALTPIN_ENABLE);
105         res = 0;
106
107         for (i = optind; i < argc; i++) {
108                 if ((fd = open(argv[i], O_RDONLY)) == -1) {
109                         fprintf(stderr, "%s: %s: open: %s\n", prog, argv[i],
110                             strerror(errno));
111                         res++;
112                         continue;
113                 }
114
115                 switch (aflag) {
116                 case NO_AFLAG:
117                         break;
118
119                 case ALTPIN_ENABLE:
120                 case ALTPIN_DISABLE:
121                         if (ioctl(fd, DIGIIO_SETALTPIN, &altpin) != 0) {
122                                 fprintf(stderr, "%s: %s: set altpin: %s\n",
123                                     prog, argv[i], strerror(errno));
124                                 res++;
125                         }
126                         break;
127
128                 case ALTPIN_QUERY:
129                         if (ioctl(fd, DIGIIO_GETALTPIN, &altpin) != 0) {
130                                 fprintf(stderr, "%s: %s: get altpin: %s\n",
131                                     prog, argv[i], strerror(errno));
132                                 res++;
133                         } else {
134                                 if (argc > optind + 1)
135                                         printf("%s: ", argv[i]);
136                                 puts(altpin ? "enabled" : "disabled");
137                         }
138                         break;
139                 }
140
141                 if (dflag && ioctl(fd, DIGIIO_DEBUG, &debug) != 0) {
142                         fprintf(stderr, "%s: %s: debug: %s\n",
143                             prog, argv[i], strerror(errno));
144                         res++;
145                 }
146
147                 if (iflag) {
148                         if (ioctl(fd, DIGIIO_MODEL, &model) != 0) {
149                                 fprintf(stderr, "%s: %s: model: %s\n",
150                                     prog, argv[i], strerror(errno));
151                                 res++;
152                         } else if (ioctl(fd, DIGIIO_IDENT, &name) != 0) {
153                                 fprintf(stderr, "%s: %s: ident: %s\n",
154                                     prog, argv[i], strerror(errno));
155                                 res++;
156                         } else {
157                                 if (argc > optind + 1)
158                                         printf("%s: ", argv[i]);
159                                 printf("%s (type %d)\n", name, (int)model);
160                         }
161                 }
162
163                 if (rflag && ioctl(fd, DIGIIO_REINIT) != 0) {
164                         fprintf(stderr, "%s: %s: reinit: %s\n",
165                             prog, argv[i], strerror(errno));
166                         res++;
167                 }
168
169                 close(fd);
170         }
171
172         return (res);
173 }