chiark / gitweb /
libudev: switch to "udev_device_get_parent"
[elogind.git] / udev / lib / test-libudev.c
1 /*
2  * test-libudev
3  *
4  * Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "config.h"
21
22 #include <stdio.h>
23 #include <stdarg.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include <string.h>
27 #include <getopt.h>
28 #include <syslog.h>
29 #include <sys/select.h>
30
31 #include "libudev.h"
32
33 static void log_fn(struct udev *udev,
34                    int priority, const char *file, int line, const char *fn,
35                    const char *format, va_list args)
36 {
37         printf("test-libudev: %s %s:%d ", fn, file, line);
38         vprintf(format, args);
39 }
40
41 static int print_devlinks_cb(struct udev_device *udev_device, const char *value, void *data)
42 {
43         printf("link:      '%s'\n", value);
44         return 0;
45 }
46
47 static int print_properties_cb(struct udev_device *udev_device, const char *key, const char *value, void *data)
48 {
49         printf("property:  '%s=%s'\n", key, value);
50         return 0;
51 }
52
53 static void print_device(struct udev_device *device)
54 {
55         const char *str;
56         int count;
57
58         printf("*** device: %p ***\n", device);
59         str = udev_device_get_devpath(device);
60         printf("devpath:   '%s'\n", str);
61         str = udev_device_get_subsystem(device);
62         printf("subsystem: '%s'\n", str);
63         str = udev_device_get_driver(device);
64         printf("driver:    '%s'\n", str);
65         str = udev_device_get_syspath(device);
66         printf("syspath:   '%s'\n", str);
67         str = udev_device_get_devname(device);
68         printf("devname:   '%s'\n", str);
69         count = udev_device_get_devlinks(device, print_devlinks_cb, NULL);
70         printf("found %i links\n", count);
71         count = udev_device_get_properties(device, print_properties_cb, NULL);
72         printf("found %i properties\n", count);
73         printf("\n");
74 }
75
76 static int test_device(struct udev *udev, const char *devpath)
77 {
78         struct udev_device *device;
79
80         printf("looking at device: %s\n", devpath);
81         device = udev_device_new_from_devpath(udev, devpath);
82         if (device == NULL) {
83                 printf("no device\n");
84                 return -1;
85         }
86         print_device(device);
87         udev_device_unref(device);
88         return 0;
89 }
90
91 static int test_device_parents(struct udev *udev, const char *devpath)
92 {
93         struct udev_device *device;
94         struct udev_device *device_parent;
95
96         printf("looking at device: %s\n", devpath);
97         device = udev_device_new_from_devpath(udev, devpath);
98         if (device == NULL)
99                 return -1;
100
101         device_parent = device;
102         do {
103                 print_device(device_parent);
104                 device_parent = udev_device_get_parent(device_parent);
105         } while (device_parent != NULL);
106
107         device_parent = device;
108         do {
109                 print_device(device_parent);
110                 device_parent = udev_device_get_parent(device_parent);
111         } while (device_parent != NULL);
112         udev_device_unref(device);
113
114         return 0;
115 }
116
117 static int devices_enum_cb(struct udev *udev,
118                            const char *devpath, const char *subsystem, const char *name,
119                            void *data)
120 {
121         printf("device:    '%s' (%s) '%s'\n", devpath, subsystem, name);
122         return 0;
123 }
124
125 static int test_enumerate(struct udev *udev, const char *subsystem)
126 {
127         int count;
128
129         count = udev_enumerate_devices(udev, subsystem, devices_enum_cb, NULL);
130         printf("found %i devices\n\n", count);
131         return count;
132 }
133
134 static int test_monitor(struct udev *udev, const char *socket_path)
135 {
136         struct udev_monitor *udev_monitor;
137         fd_set readfds;
138         int fd;
139
140         udev_monitor = udev_monitor_new_from_socket(udev, socket_path);
141         if (udev_monitor == NULL) {
142                 printf("no socket\n");
143                 return -1;
144         }
145         if (udev_monitor_enable_receiving(udev_monitor) < 0) {
146                 printf("bind failed\n");
147                 return -1;
148         }
149
150         fd = udev_monitor_get_fd(udev_monitor);
151         FD_ZERO(&readfds);
152
153         while (1) {
154                 struct udev_device *device;
155                 int fdcount;
156
157                 FD_SET(STDIN_FILENO, &readfds);
158                 FD_SET(fd, &readfds);
159
160                 printf("waiting for events on %s, press ENTER to exit\n", socket_path);
161                 fdcount = select(fd+1, &readfds, NULL, NULL, NULL);
162                 printf("select fd count: %i\n", fdcount);
163
164                 if (FD_ISSET(fd, &readfds)) {
165                         device = udev_monitor_receive_device(udev_monitor);
166                         if (device == NULL) {
167                                 printf("no device from socket\n");
168                                 continue;
169                         }
170                         print_device(device);
171                         udev_device_unref(device);
172                 }
173
174                 if (FD_ISSET(STDIN_FILENO, &readfds)) {
175                         printf("exiting loop\n");
176                         break;
177                 }
178         }
179
180         udev_monitor_unref(udev_monitor);
181         return 0;
182 }
183
184 int main(int argc, char *argv[], char *envp[])
185 {
186         struct udev *udev = NULL;
187         static const struct option options[] = {
188                 { "devpath", 1, NULL, 'p' },
189                 { "subsystem", 1, NULL, 's' },
190                 { "socket", 1, NULL, 'S' },
191                 { "debug", 0, NULL, 'd' },
192                 { "help", 0, NULL, 'h' },
193                 { "version", 0, NULL, 'V' },
194                 {}
195         };
196         const char *devpath = "/devices/virtual/mem/null";
197         const char *subsystem = NULL;
198         const char *socket = "@/org/kernel/udev/monitor";
199         const char *str;
200
201         udev = udev_new();
202         printf("context: %p\n", udev);
203         if (udev == NULL) {
204                 printf("no context\n");
205                 return 1;
206         }
207         udev_set_log_fn(udev, log_fn);
208         printf("set log: %p\n", log_fn);
209
210         while (1) {
211                 int option;
212
213                 option = getopt_long(argc, argv, "+dhV", options, NULL);
214                 if (option == -1)
215                         break;
216
217                 switch (option) {
218                 case 'p':
219                         devpath = optarg;
220                         break;
221                 case 's':
222                         subsystem = optarg;
223                         break;
224                 case 'S':
225                         socket = optarg;
226                         break;
227                 case 'd':
228                         if (udev_get_log_priority(udev) < LOG_INFO)
229                                 udev_set_log_priority(udev, LOG_INFO);
230                         break;
231                 case 'h':
232                         printf("--debug --devpath= --subsystem= --socket= --help\n");
233                         goto out;
234                 case 'V':
235                         printf("%s\n", VERSION);
236                         goto out;
237                 default:
238                         goto out;
239                 }
240         }
241
242         str = udev_get_sys_path(udev);
243         printf("sys_path: '%s'\n", str);
244         str = udev_get_dev_path(udev);
245         printf("dev_path: '%s'\n", str);
246
247         test_device(udev, devpath);
248         test_device_parents(udev, devpath);
249         test_enumerate(udev, subsystem);
250         test_monitor(udev, socket);
251 out:
252         udev_unref(udev);
253         return 0;
254 }