Blame view
tools/iio/lsiio.c
3.71 KB
d2912cb15 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
49d916ec2 staging: iio: Add... |
2 3 4 5 |
/* * Industrial I/O utilities - lsiio.c * * Copyright (c) 2010 Manuel Stahl <manuel.stahl@iis.fraunhofer.de> |
49d916ec2 staging: iio: Add... |
6 7 8 9 10 11 12 13 14 15 16 17 18 |
*/ #include <string.h> #include <dirent.h> #include <stdio.h> #include <errno.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/dir.h> #include "iio_utils.h" |
49d916ec2 staging: iio: Add... |
19 20 21 22 23 24 25 |
static enum verbosity { VERBLEVEL_DEFAULT, /* 0 gives lspci behaviour */ VERBLEVEL_SENSORS, /* 1 lists sensors */ } verblevel = VERBLEVEL_DEFAULT; const char *type_device = "iio:device"; const char *type_trigger = "trigger"; |
49d916ec2 staging: iio: Add... |
26 27 28 |
static inline int check_prefix(const char *str, const char *prefix) { return strlen(str) > strlen(prefix) && |
7663a4aac tools:iio: adjust... |
29 |
strncmp(str, prefix, strlen(prefix)) == 0; |
49d916ec2 staging: iio: Add... |
30 31 32 33 34 |
} static inline int check_postfix(const char *str, const char *postfix) { return strlen(str) > strlen(postfix) && |
7663a4aac tools:iio: adjust... |
35 |
strcmp(str + strlen(str) - strlen(postfix), postfix) == 0; |
49d916ec2 staging: iio: Add... |
36 37 38 39 40 41 |
} static int dump_channels(const char *dev_dir_name) { DIR *dp; const struct dirent *ent; |
d1e504134 Staging: iio: Doc... |
42 |
|
49d916ec2 staging: iio: Add... |
43 |
dp = opendir(dev_dir_name); |
ff1ac639b tools: iio: Remov... |
44 |
if (!dp) |
49d916ec2 staging: iio: Add... |
45 |
return -errno; |
7663a4aac tools:iio: adjust... |
46 |
|
ff1ac639b tools: iio: Remov... |
47 |
while (ent = readdir(dp), ent) |
49d916ec2 staging: iio: Add... |
48 |
if (check_prefix(ent->d_name, "in_") && |
6df1dc05e tools: iio: lsiio... |
49 50 |
(check_postfix(ent->d_name, "_raw") || check_postfix(ent->d_name, "_input"))) |
49d916ec2 staging: iio: Add... |
51 52 |
printf(" %-10s ", ent->d_name); |
49d916ec2 staging: iio: Add... |
53 |
|
f96d055e4 tools:iio:lsiio: ... |
54 |
return (closedir(dp) == -1) ? -errno : 0; |
49d916ec2 staging: iio: Add... |
55 56 57 58 59 60 |
} static int dump_one_device(const char *dev_dir_name) { char name[IIO_MAX_NAME_LENGTH]; int dev_idx; |
a9d7acc8b tools:iio: rename... |
61 |
int ret; |
49d916ec2 staging: iio: Add... |
62 |
|
a9d7acc8b tools:iio: rename... |
63 64 65 |
ret = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_device), "%i", &dev_idx); if (ret != 1) |
d0e68ce19 Staging: iio: Doc... |
66 |
return -EINVAL; |
7663a4aac tools:iio: adjust... |
67 |
|
a9d7acc8b tools:iio: rename... |
68 |
ret = read_sysfs_string("name", dev_dir_name, name); |
af255cd56 iio: lsiio: fix e... |
69 |
if (ret < 0) |
a9d7acc8b tools:iio: rename... |
70 |
return ret; |
acf50b358 tools:iio:lsiio: ... |
71 |
|
49d916ec2 staging: iio: Add... |
72 73 |
printf("Device %03d: %s ", dev_idx, name); |
edead9b1f Staging: iio: Doc... |
74 75 |
if (verblevel >= VERBLEVEL_SENSORS) return dump_channels(dev_dir_name); |
7663a4aac tools:iio: adjust... |
76 |
|
49d916ec2 staging: iio: Add... |
77 78 79 80 81 82 83 |
return 0; } static int dump_one_trigger(const char *dev_dir_name) { char name[IIO_MAX_NAME_LENGTH]; int dev_idx; |
a9d7acc8b tools:iio: rename... |
84 |
int ret; |
49d916ec2 staging: iio: Add... |
85 |
|
a9d7acc8b tools:iio: rename... |
86 87 88 |
ret = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_trigger), "%i", &dev_idx); if (ret != 1) |
d0e68ce19 Staging: iio: Doc... |
89 |
return -EINVAL; |
7663a4aac tools:iio: adjust... |
90 |
|
a9d7acc8b tools:iio: rename... |
91 |
ret = read_sysfs_string("name", dev_dir_name, name); |
af255cd56 iio: lsiio: fix e... |
92 |
if (ret < 0) |
a9d7acc8b tools:iio: rename... |
93 |
return ret; |
acf50b358 tools:iio:lsiio: ... |
94 |
|
49d916ec2 staging: iio: Add... |
95 96 |
printf("Trigger %03d: %s ", dev_idx, name); |
7663a4aac tools:iio: adjust... |
97 |
|
49d916ec2 staging: iio: Add... |
98 99 |
return 0; } |
acf50b358 tools:iio:lsiio: ... |
100 |
static int dump_devices(void) |
49d916ec2 staging: iio: Add... |
101 102 |
{ const struct dirent *ent; |
acf50b358 tools:iio:lsiio: ... |
103 |
int ret; |
49d916ec2 staging: iio: Add... |
104 |
DIR *dp; |
49d916ec2 staging: iio: Add... |
105 106 |
dp = opendir(iio_dir); |
ff1ac639b tools: iio: Remov... |
107 |
if (!dp) { |
d9abc615e tools: iio: Send ... |
108 109 |
fprintf(stderr, "No industrial I/O devices available "); |
acf50b358 tools:iio:lsiio: ... |
110 |
return -ENODEV; |
49d916ec2 staging: iio: Add... |
111 |
} |
ff1ac639b tools: iio: Remov... |
112 |
while (ent = readdir(dp), ent) { |
49d916ec2 staging: iio: Add... |
113 114 |
if (check_prefix(ent->d_name, type_device)) { char *dev_dir_name; |
d1e504134 Staging: iio: Doc... |
115 |
|
e9e45b43b tools:iio: catch ... |
116 117 |
if (asprintf(&dev_dir_name, "%s%s", iio_dir, ent->d_name) < 0) { |
acf50b358 tools:iio:lsiio: ... |
118 119 120 121 122 123 124 |
ret = -ENOMEM; goto error_close_dir; } ret = dump_one_device(dev_dir_name); if (ret) { free(dev_dir_name); |
e9e45b43b tools:iio: catch ... |
125 126 |
goto error_close_dir; } |
49d916ec2 staging: iio: Add... |
127 128 129 130 131 132 133 |
free(dev_dir_name); if (verblevel >= VERBLEVEL_SENSORS) printf(" "); } } rewinddir(dp); |
ff1ac639b tools: iio: Remov... |
134 |
while (ent = readdir(dp), ent) { |
49d916ec2 staging: iio: Add... |
135 136 |
if (check_prefix(ent->d_name, type_trigger)) { char *dev_dir_name; |
d1e504134 Staging: iio: Doc... |
137 |
|
e9e45b43b tools:iio: catch ... |
138 139 |
if (asprintf(&dev_dir_name, "%s%s", iio_dir, ent->d_name) < 0) { |
acf50b358 tools:iio:lsiio: ... |
140 141 142 143 144 145 146 |
ret = -ENOMEM; goto error_close_dir; } ret = dump_one_trigger(dev_dir_name); if (ret) { free(dev_dir_name); |
e9e45b43b tools:iio: catch ... |
147 148 |
goto error_close_dir; } |
49d916ec2 staging: iio: Add... |
149 150 151 |
free(dev_dir_name); } } |
7663a4aac tools:iio: adjust... |
152 |
|
acf50b358 tools:iio:lsiio: ... |
153 |
return (closedir(dp) == -1) ? -errno : 0; |
e9e45b43b tools:iio: catch ... |
154 |
error_close_dir: |
acf50b358 tools:iio:lsiio: ... |
155 156 157 158 |
if (closedir(dp) == -1) perror("dump_devices(): Failed to close directory"); return ret; |
49d916ec2 staging: iio: Add... |
159 160 161 162 163 |
} int main(int argc, char **argv) { int c, err = 0; |
e06e3d711 tools:iio: rework... |
164 |
while ((c = getopt(argc, argv, "v")) != EOF) { |
49d916ec2 staging: iio: Add... |
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
switch (c) { case 'v': verblevel++; break; case '?': default: err++; break; } } if (err || argc > optind) { fprintf(stderr, "Usage: lsiio [options]... " "List industrial I/O devices " |
e06e3d711 tools:iio: rework... |
181 182 |
" -v Increase verbosity (may be given multiple times) "); |
49d916ec2 staging: iio: Add... |
183 184 |
exit(1); } |
acf50b358 tools:iio:lsiio: ... |
185 |
return dump_devices(); |
49d916ec2 staging: iio: Add... |
186 |
} |