4 * Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
21 #include <sys/select.h>
25 static void log_fn(struct udev *udev,
26 int priority, const char *file, int line, const char *fn,
27 const char *format, va_list args)
29 printf("test-libudev: %s %s:%d ", fn, file, line);
30 vprintf(format, args);
33 static void print_device(struct udev_device *device)
38 struct udev_list_entry *list_entry;
40 printf("*** device: %p ***\n", device);
41 str = udev_device_get_action(device);
43 printf("action: '%s'\n", str);
45 str = udev_device_get_syspath(device);
46 printf("syspath: '%s'\n", str);
48 str = udev_device_get_sysname(device);
49 printf("sysname: '%s'\n", str);
51 str = udev_device_get_sysnum(device);
53 printf("sysnum: '%s'\n", str);
55 str = udev_device_get_devpath(device);
56 printf("devpath: '%s'\n", str);
58 str = udev_device_get_subsystem(device);
60 printf("subsystem: '%s'\n", str);
62 str = udev_device_get_devtype(device);
64 printf("devtype: '%s'\n", str);
66 str = udev_device_get_driver(device);
68 printf("driver: '%s'\n", str);
70 str = udev_device_get_devnode(device);
72 printf("devname: '%s'\n", str);
74 devnum = udev_device_get_devnum(device);
75 if (major(devnum) > 0)
76 printf("devnum: %u:%u\n", major(devnum), minor(devnum));
79 udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(device)) {
80 printf("link: '%s'\n", udev_list_entry_get_name(list_entry));
84 printf("found %i links\n", count);
87 udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(device)) {
88 printf("property: '%s=%s'\n",
89 udev_list_entry_get_name(list_entry),
90 udev_list_entry_get_value(list_entry));
94 printf("found %i properties\n", count);
96 str = udev_device_get_property_value(device, "MAJOR");
98 printf("MAJOR: '%s'\n", str);
100 str = udev_device_get_sysattr_value(device, "dev");
102 printf("attr{dev}: '%s'\n", str);
107 static int test_device(struct udev *udev, const char *syspath)
109 struct udev_device *device;
111 printf("looking at device: %s\n", syspath);
112 device = udev_device_new_from_syspath(udev, syspath);
113 if (device == NULL) {
114 printf("no device found\n");
117 print_device(device);
118 udev_device_unref(device);
122 static int test_device_parents(struct udev *udev, const char *syspath)
124 struct udev_device *device;
125 struct udev_device *device_parent;
127 printf("looking at device: %s\n", syspath);
128 device = udev_device_new_from_syspath(udev, syspath);
132 printf("looking at parents\n");
133 device_parent = device;
135 print_device(device_parent);
136 device_parent = udev_device_get_parent(device_parent);
137 } while (device_parent != NULL);
139 printf("looking at parents again\n");
140 device_parent = device;
142 print_device(device_parent);
143 device_parent = udev_device_get_parent(device_parent);
144 } while (device_parent != NULL);
145 udev_device_unref(device);
150 static int test_device_devnum(struct udev *udev)
152 dev_t devnum = makedev(1, 3);
153 struct udev_device *device;
155 printf("looking up device: %u:%u\n", major(devnum), minor(devnum));
156 device = udev_device_new_from_devnum(udev, 'c', devnum);
159 print_device(device);
160 udev_device_unref(device);
164 static int test_device_subsys_name(struct udev *udev)
166 struct udev_device *device;
168 printf("looking up device: 'block':'sda'\n");
169 device = udev_device_new_from_subsystem_sysname(udev, "block", "sda");
172 print_device(device);
173 udev_device_unref(device);
175 printf("looking up device: 'subsystem':'pci'\n");
176 device = udev_device_new_from_subsystem_sysname(udev, "subsystem", "pci");
179 print_device(device);
180 udev_device_unref(device);
182 printf("looking up device: 'drivers':'scsi:sd'\n");
183 device = udev_device_new_from_subsystem_sysname(udev, "drivers", "scsi:sd");
186 print_device(device);
187 udev_device_unref(device);
189 printf("looking up device: 'module':'printk'\n");
190 device = udev_device_new_from_subsystem_sysname(udev, "module", "printk");
193 print_device(device);
194 udev_device_unref(device);
198 static int test_enumerate_print_list(struct udev_enumerate *enumerate)
200 struct udev_list_entry *list_entry;
203 udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) {
204 struct udev_device *device;
206 device = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate),
207 udev_list_entry_get_name(list_entry));
208 if (device != NULL) {
209 printf("device: '%s' (%s)\n",
210 udev_device_get_syspath(device),
211 udev_device_get_subsystem(device));
212 udev_device_unref(device);
216 printf("found %i devices\n\n", count);
220 static int test_monitor(struct udev *udev)
222 struct udev_monitor *udev_monitor;
226 udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
227 if (udev_monitor == NULL) {
228 printf("no socket\n");
231 if (udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "block", NULL) < 0 ||
232 udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL) < 0 ||
233 udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device") < 0) {
234 printf("filter failed\n");
237 if (udev_monitor_enable_receiving(udev_monitor) < 0) {
238 printf("bind failed\n");
242 fd = udev_monitor_get_fd(udev_monitor);
246 struct udev_device *device;
249 FD_SET(STDIN_FILENO, &readfds);
250 FD_SET(fd, &readfds);
252 printf("waiting for events from udev, press ENTER to exit\n");
253 fdcount = select(fd+1, &readfds, NULL, NULL, NULL);
254 printf("select fd count: %i\n", fdcount);
256 if (FD_ISSET(fd, &readfds)) {
257 device = udev_monitor_receive_device(udev_monitor);
258 if (device == NULL) {
259 printf("no device from socket\n");
262 print_device(device);
263 udev_device_unref(device);
266 if (FD_ISSET(STDIN_FILENO, &readfds)) {
267 printf("exiting loop\n");
272 udev_monitor_unref(udev_monitor);
276 static int test_queue(struct udev *udev)
278 struct udev_queue *udev_queue;
279 unsigned long long int seqnum;
280 struct udev_list_entry *list_entry;
282 udev_queue = udev_queue_new(udev);
283 if (udev_queue == NULL)
285 seqnum = udev_queue_get_kernel_seqnum(udev_queue);
286 printf("seqnum kernel: %llu\n", seqnum);
287 seqnum = udev_queue_get_udev_seqnum(udev_queue);
288 printf("seqnum udev : %llu\n", seqnum);
290 if (udev_queue_get_queue_is_empty(udev_queue))
291 printf("queue is empty\n");
292 printf("get queue list\n");
293 udev_list_entry_foreach(list_entry, udev_queue_get_queued_list_entry(udev_queue))
294 printf("queued: '%s' [%s]\n", udev_list_entry_get_name(list_entry), udev_list_entry_get_value(list_entry));
296 printf("get queue list again\n");
297 udev_list_entry_foreach(list_entry, udev_queue_get_queued_list_entry(udev_queue))
298 printf("queued: '%s' [%s]\n", udev_list_entry_get_name(list_entry), udev_list_entry_get_value(list_entry));
300 printf("get failed list\n");
301 udev_list_entry_foreach(list_entry, udev_queue_get_failed_list_entry(udev_queue))
302 printf("failed: '%s'\n", udev_list_entry_get_name(list_entry));
305 list_entry = udev_queue_get_queued_list_entry(udev_queue);
306 if (list_entry != NULL) {
307 printf("event [%llu] is queued\n", seqnum);
308 seqnum = strtoull(udev_list_entry_get_value(list_entry), NULL, 10);
309 if (udev_queue_get_seqnum_is_finished(udev_queue, seqnum))
310 printf("event [%llu] is not finished\n", seqnum);
312 printf("event [%llu] is finished\n", seqnum);
315 udev_queue_unref(udev_queue);
319 static int test_enumerate(struct udev *udev, const char *subsystem)
321 struct udev_enumerate *udev_enumerate;
323 printf("enumerate '%s'\n", subsystem == NULL ? "<all>" : subsystem);
324 udev_enumerate = udev_enumerate_new(udev);
325 if (udev_enumerate == NULL)
327 udev_enumerate_add_match_subsystem(udev_enumerate, subsystem);
328 udev_enumerate_scan_devices(udev_enumerate);
329 test_enumerate_print_list(udev_enumerate);
330 udev_enumerate_unref(udev_enumerate);
332 printf("enumerate 'net' + duplicated scan + null + zero\n");
333 udev_enumerate = udev_enumerate_new(udev);
334 if (udev_enumerate == NULL)
336 udev_enumerate_add_match_subsystem(udev_enumerate, "net");
337 udev_enumerate_scan_devices(udev_enumerate);
338 udev_enumerate_scan_devices(udev_enumerate);
339 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
340 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
341 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
342 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
343 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
344 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
345 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null");
346 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
347 udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero");
348 udev_enumerate_scan_devices(udev_enumerate);
349 test_enumerate_print_list(udev_enumerate);
350 udev_enumerate_unref(udev_enumerate);
352 printf("enumerate 'block'\n");
353 udev_enumerate = udev_enumerate_new(udev);
354 if (udev_enumerate == NULL)
356 udev_enumerate_add_match_subsystem(udev_enumerate,"block");
357 udev_enumerate_scan_devices(udev_enumerate);
358 test_enumerate_print_list(udev_enumerate);
359 udev_enumerate_unref(udev_enumerate);
361 printf("enumerate 'not block'\n");
362 udev_enumerate = udev_enumerate_new(udev);
363 if (udev_enumerate == NULL)
365 udev_enumerate_add_nomatch_subsystem(udev_enumerate, "block");
366 udev_enumerate_scan_devices(udev_enumerate);
367 test_enumerate_print_list(udev_enumerate);
368 udev_enumerate_unref(udev_enumerate);
370 printf("enumerate 'pci, mem, vc'\n");
371 udev_enumerate = udev_enumerate_new(udev);
372 if (udev_enumerate == NULL)
374 udev_enumerate_add_match_subsystem(udev_enumerate, "pci");
375 udev_enumerate_add_match_subsystem(udev_enumerate, "mem");
376 udev_enumerate_add_match_subsystem(udev_enumerate, "vc");
377 udev_enumerate_scan_devices(udev_enumerate);
378 test_enumerate_print_list(udev_enumerate);
379 udev_enumerate_unref(udev_enumerate);
381 printf("enumerate 'subsystem'\n");
382 udev_enumerate = udev_enumerate_new(udev);
383 if (udev_enumerate == NULL)
385 udev_enumerate_scan_subsystems(udev_enumerate);
386 test_enumerate_print_list(udev_enumerate);
387 udev_enumerate_unref(udev_enumerate);
389 printf("enumerate 'property IF_FS_*=filesystem'\n");
390 udev_enumerate = udev_enumerate_new(udev);
391 if (udev_enumerate == NULL)
393 udev_enumerate_add_match_property(udev_enumerate, "ID_FS*", "filesystem");
394 udev_enumerate_scan_devices(udev_enumerate);
395 test_enumerate_print_list(udev_enumerate);
396 udev_enumerate_unref(udev_enumerate);
400 int main(int argc, char *argv[])
402 struct udev *udev = NULL;
403 static const struct option options[] = {
404 { "syspath", required_argument, NULL, 'p' },
405 { "subsystem", required_argument, NULL, 's' },
406 { "debug", no_argument, NULL, 'd' },
407 { "help", no_argument, NULL, 'h' },
408 { "version", no_argument, NULL, 'V' },
411 const char *syspath = "/devices/virtual/mem/null";
412 const char *subsystem = NULL;
417 printf("context: %p\n", udev);
419 printf("no context\n");
422 udev_set_log_fn(udev, log_fn);
423 printf("set log: %p\n", log_fn);
428 option = getopt_long(argc, argv, "+dhV", options, NULL);
440 if (udev_get_log_priority(udev) < LOG_INFO)
441 udev_set_log_priority(udev, LOG_INFO);
444 printf("--debug --syspath= --subsystem= --help\n");
447 printf("%s\n", VERSION);
454 str = udev_get_sys_path(udev);
455 printf("sys_path: '%s'\n", str);
456 str = udev_get_dev_path(udev);
457 printf("dev_path: '%s'\n", str);
459 /* add sys path if needed */
460 if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
461 snprintf(path, sizeof(path), "%s%s", udev_get_sys_path(udev), syspath);
465 test_device(udev, syspath);
466 test_device_devnum(udev);
467 test_device_subsys_name(udev);
468 test_device_parents(udev, syspath);
470 test_enumerate(udev, subsystem);