1 /* $FreeBSD: src/usr.sbin/apmd/contrib/pccardq.c,v 1.2 1999/08/28 05:11:25 peter Exp $ */
2 /* $DragonFly: src/usr.sbin/apmd/contrib/pccardq.c,v 1.4 2008/07/10 18:29:52 swildner Exp $ */
14 #include <sys/types.h>
15 #include <sys/socket.h>
18 const char *const pccardd_file
= "/var/tmp/.pccardd";
19 const char *prog
= "pccardq";
20 const char *tmp_dir
= "/tmp";
21 unsigned slot_map
= ~0;
26 fprintf(stderr
, "usage: %s [-a] [-n] [-s slot]\n", prog
);
30 proc_arg(int ac
, char **av
)
35 char *p
= strrchr(av
[0], '/');
36 prog
= p
? p
+ 1 : av
[0];
38 tmp_dir
= getenv("TMPDIR") ? getenv("TMPDIR") : tmp_dir
;
40 while ((ch
= getopt(ac
, av
, "ans:")) != -1) {
51 if (n
< 0 || n
>= CHAR_BIT
* sizeof slot_map
) {
52 warnc(0, "Invalid slot number.");
73 connect_to_pccardd(char **path
)
77 struct sockaddr_un pccardq
;
78 struct sockaddr_un pccardd
;
80 if ((so
= socket(PF_UNIX
, SOCK_DGRAM
, 0)) < 0) {
85 snprintf(pccardq
.sun_path
, sizeof pccardq
.sun_path
,
86 "%s/%s%ld%ld", tmp_dir
, prog
, (long) getpid(), (long) time(0));
87 pccardq
.sun_family
= AF_UNIX
;
88 pccardq
.sun_len
= offsetof(struct sockaddr_un
, sun_path
) + strlen(pccardq
.sun_path
);
89 if (bind(so
, (struct sockaddr
*) &pccardq
, pccardq
.sun_len
) < 0) {
90 warn("bind: %s", pccardq
.sun_path
);
93 if ((*path
= strdup(pccardq
.sun_path
)) == NULL
) {
98 pccardd_len
= strlen(pccardd_file
) + 1;
99 if (pccardd_len
> sizeof pccardd
.sun_path
) {
100 warnc(0, "%s: too long", pccardd_file
);
103 pccardd
.sun_len
= offsetof(struct sockaddr_un
, sun_path
) + pccardd_len
;
104 pccardd
.sun_family
= AF_UNIX
;
105 strcpy(pccardd
.sun_path
, pccardd_file
);
106 if (connect(so
, (struct sockaddr
*) &pccardd
, pccardd
.sun_len
) < 0) {
107 warn("connect: %s", pccardd_file
);
118 get_slot_number(int so
)
124 if ((rv
= write(so
, "S", 1)) < 1) {
127 } else if (rv
!= 1) {
128 warnc(0, "write: fail.");
132 if ((rv
= read(so
, buf
, sizeof buf
)) < 0) {
136 buf
[sizeof buf
- 1] = 0;
137 if (sscanf(buf
, "%d", &nslot
) != 1) {
138 warnc(0, "Invalid response.");
154 get_slot_info(int so
, int slot
, char **manuf
, char **version
, char
155 **device
, int *state
)
159 static char buf
[1024];
168 slen
= snprintf(buf
, sizeof buf
, "N%d", slot
);
169 if ((rv
= write(so
, buf
, slen
)) < 0) {
172 } else if (rv
!= slen
) {
177 if ((rv
= read(so
, buf
, sizeof buf
)) < 0) {
183 if ((sl
= strsep(&s
, "~")) == NULL
)
185 if (atoi(sl
) != slot
)
187 if ((_manuf
= strsep(&s
, "~")) == NULL
)
189 if ((_version
= strsep(&s
, "~")) == NULL
)
191 if ((_device
= strsep(&s
, "~")) == NULL
)
193 if (sscanf(s
, "%1d", state
) != 1)
195 if (s
!= NULL
&& strchr(s
, '~') != NULL
)
198 *manuf
= strdup(_manuf
);
199 *version
= strdup(_version
);
200 *device
= strdup(_device
);
201 if (*manuf
== NULL
|| *version
== NULL
|| *device
== NULL
) {
210 warnc(0, "Invalid response: %*s", rv
, buf
);
230 main(int ac
, char **av
)
237 if (proc_arg(ac
, av
) < 0)
239 if ((so
= connect_to_pccardd(&path
)) < 0)
241 if ((nslot
= get_slot_number(so
)) < 0)
244 printf("%d\n", nslot
);
246 for (i
= 0; i
< nslot
; i
++) {
247 if ((slot_map
& (1 << i
))) {
253 if (get_slot_info(so
, i
, &manuf
, &version
, &device
,
256 if (manuf
== NULL
|| version
== NULL
|| device
== NULL
)
258 printf("%d~%s~%s~%s~%s\n",
259 i
, manuf
, version
, device
, strstate(state
));