Blame view

tools/iio/lsiio.c 3.71 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
49d916ec2   Manuel Stahl   staging: iio: Add...
2
3
4
5
  /*
   * Industrial I/O utilities - lsiio.c
   *
   * Copyright (c) 2010 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
49d916ec2   Manuel Stahl   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   Manuel Stahl   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   Manuel Stahl   staging: iio: Add...
26
27
28
  static inline int check_prefix(const char *str, const char *prefix)
  {
  	return strlen(str) > strlen(prefix) &&
7663a4aac   Hartmut Knaack   tools:iio: adjust...
29
  	       strncmp(str, prefix, strlen(prefix)) == 0;
49d916ec2   Manuel Stahl   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   Hartmut Knaack   tools:iio: adjust...
35
  	       strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
49d916ec2   Manuel Stahl   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   Heena Sirwani   Staging: iio: Doc...
42

49d916ec2   Manuel Stahl   staging: iio: Add...
43
  	dp = opendir(dev_dir_name);
ff1ac639b   Cristina Opriceana   tools: iio: Remov...
44
  	if (!dp)
49d916ec2   Manuel Stahl   staging: iio: Add...
45
  		return -errno;
7663a4aac   Hartmut Knaack   tools:iio: adjust...
46

ff1ac639b   Cristina Opriceana   tools: iio: Remov...
47
  	while (ent = readdir(dp), ent)
49d916ec2   Manuel Stahl   staging: iio: Add...
48
  		if (check_prefix(ent->d_name, "in_") &&
6df1dc05e   Matt Ranostay   tools: iio: lsiio...
49
50
  		   (check_postfix(ent->d_name, "_raw") ||
  		    check_postfix(ent->d_name, "_input")))
49d916ec2   Manuel Stahl   staging: iio: Add...
51
52
  			printf("   %-10s
  ", ent->d_name);
49d916ec2   Manuel Stahl   staging: iio: Add...
53

f96d055e4   Hartmut Knaack   tools:iio:lsiio: ...
54
  	return (closedir(dp) == -1) ? -errno : 0;
49d916ec2   Manuel Stahl   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   Hartmut Knaack   tools:iio: rename...
61
  	int ret;
49d916ec2   Manuel Stahl   staging: iio: Add...
62

a9d7acc8b   Hartmut Knaack   tools:iio: rename...
63
64
65
  	ret = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_device), "%i",
  		     &dev_idx);
  	if (ret != 1)
d0e68ce19   Heena Sirwani   Staging: iio: Doc...
66
  		return -EINVAL;
7663a4aac   Hartmut Knaack   tools:iio: adjust...
67

a9d7acc8b   Hartmut Knaack   tools:iio: rename...
68
  	ret = read_sysfs_string("name", dev_dir_name, name);
af255cd56   Linus Walleij   iio: lsiio: fix e...
69
  	if (ret < 0)
a9d7acc8b   Hartmut Knaack   tools:iio: rename...
70
  		return ret;
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
71

49d916ec2   Manuel Stahl   staging: iio: Add...
72
73
  	printf("Device %03d: %s
  ", dev_idx, name);
edead9b1f   Heena Sirwani   Staging: iio: Doc...
74
75
  	if (verblevel >= VERBLEVEL_SENSORS)
  		return dump_channels(dev_dir_name);
7663a4aac   Hartmut Knaack   tools:iio: adjust...
76

49d916ec2   Manuel Stahl   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   Hartmut Knaack   tools:iio: rename...
84
  	int ret;
49d916ec2   Manuel Stahl   staging: iio: Add...
85

a9d7acc8b   Hartmut Knaack   tools:iio: rename...
86
87
88
  	ret = sscanf(dev_dir_name + strlen(iio_dir) + strlen(type_trigger),
  		     "%i", &dev_idx);
  	if (ret != 1)
d0e68ce19   Heena Sirwani   Staging: iio: Doc...
89
  		return -EINVAL;
7663a4aac   Hartmut Knaack   tools:iio: adjust...
90

a9d7acc8b   Hartmut Knaack   tools:iio: rename...
91
  	ret = read_sysfs_string("name", dev_dir_name, name);
af255cd56   Linus Walleij   iio: lsiio: fix e...
92
  	if (ret < 0)
a9d7acc8b   Hartmut Knaack   tools:iio: rename...
93
  		return ret;
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
94

49d916ec2   Manuel Stahl   staging: iio: Add...
95
96
  	printf("Trigger %03d: %s
  ", dev_idx, name);
7663a4aac   Hartmut Knaack   tools:iio: adjust...
97

49d916ec2   Manuel Stahl   staging: iio: Add...
98
99
  	return 0;
  }
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
100
  static int dump_devices(void)
49d916ec2   Manuel Stahl   staging: iio: Add...
101
102
  {
  	const struct dirent *ent;
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
103
  	int ret;
49d916ec2   Manuel Stahl   staging: iio: Add...
104
  	DIR *dp;
49d916ec2   Manuel Stahl   staging: iio: Add...
105
106
  
  	dp = opendir(iio_dir);
ff1ac639b   Cristina Opriceana   tools: iio: Remov...
107
  	if (!dp) {
d9abc615e   Cristina Opriceana   tools: iio: Send ...
108
109
  		fprintf(stderr, "No industrial I/O devices available
  ");
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
110
  		return -ENODEV;
49d916ec2   Manuel Stahl   staging: iio: Add...
111
  	}
ff1ac639b   Cristina Opriceana   tools: iio: Remov...
112
  	while (ent = readdir(dp), ent) {
49d916ec2   Manuel Stahl   staging: iio: Add...
113
114
  		if (check_prefix(ent->d_name, type_device)) {
  			char *dev_dir_name;
d1e504134   Heena Sirwani   Staging: iio: Doc...
115

e9e45b43b   Hartmut Knaack   tools:iio: catch ...
116
117
  			if (asprintf(&dev_dir_name, "%s%s", iio_dir,
  				     ent->d_name) < 0) {
acf50b358   Hartmut Knaack   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   Hartmut Knaack   tools:iio: catch ...
125
126
  				goto error_close_dir;
  			}
49d916ec2   Manuel Stahl   staging: iio: Add...
127
128
129
130
131
132
133
  			free(dev_dir_name);
  			if (verblevel >= VERBLEVEL_SENSORS)
  				printf("
  ");
  		}
  	}
  	rewinddir(dp);
ff1ac639b   Cristina Opriceana   tools: iio: Remov...
134
  	while (ent = readdir(dp), ent) {
49d916ec2   Manuel Stahl   staging: iio: Add...
135
136
  		if (check_prefix(ent->d_name, type_trigger)) {
  			char *dev_dir_name;
d1e504134   Heena Sirwani   Staging: iio: Doc...
137

e9e45b43b   Hartmut Knaack   tools:iio: catch ...
138
139
  			if (asprintf(&dev_dir_name, "%s%s", iio_dir,
  				     ent->d_name) < 0) {
acf50b358   Hartmut Knaack   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   Hartmut Knaack   tools:iio: catch ...
147
148
  				goto error_close_dir;
  			}
49d916ec2   Manuel Stahl   staging: iio: Add...
149
150
151
  			free(dev_dir_name);
  		}
  	}
7663a4aac   Hartmut Knaack   tools:iio: adjust...
152

acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
153
  	return (closedir(dp) == -1) ? -errno : 0;
e9e45b43b   Hartmut Knaack   tools:iio: catch ...
154
  error_close_dir:
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
155
156
157
158
  	if (closedir(dp) == -1)
  		perror("dump_devices(): Failed to close directory");
  
  	return ret;
49d916ec2   Manuel Stahl   staging: iio: Add...
159
160
161
162
163
  }
  
  int main(int argc, char **argv)
  {
  	int c, err = 0;
e06e3d711   Hartmut Knaack   tools:iio: rework...
164
  	while ((c = getopt(argc, argv, "v")) != EOF) {
49d916ec2   Manuel Stahl   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   Hartmut Knaack   tools:iio: rework...
181
182
  			"  -v  Increase verbosity (may be given multiple times)
  ");
49d916ec2   Manuel Stahl   staging: iio: Add...
183
184
  		exit(1);
  	}
acf50b358   Hartmut Knaack   tools:iio:lsiio: ...
185
  	return dump_devices();
49d916ec2   Manuel Stahl   staging: iio: Add...
186
  }