199ca880aSopenharmony_ci/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ 299ca880aSopenharmony_ci/*** 399ca880aSopenharmony_ci This file is part of systemd. 499ca880aSopenharmony_ci 599ca880aSopenharmony_ci Copyright 2008-2012 Kay Sievers <kay@vrfy.org> 699ca880aSopenharmony_ci 799ca880aSopenharmony_ci systemd is free software; you can redistribute it and/or modify it 899ca880aSopenharmony_ci under the terms of the GNU Lesser General Public License as published by 999ca880aSopenharmony_ci the Free Software Foundation; either version 2.1 of the License, or 1099ca880aSopenharmony_ci (at your option) any later version. 1199ca880aSopenharmony_ci 1299ca880aSopenharmony_ci systemd is distributed in the hope that it will be useful, but 1399ca880aSopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1499ca880aSopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1599ca880aSopenharmony_ci Lesser General Public License for more details. 1699ca880aSopenharmony_ci 1799ca880aSopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1899ca880aSopenharmony_ci along with systemd; If not, see <http://www.gnu.org/licenses/>. 1999ca880aSopenharmony_ci***/ 2099ca880aSopenharmony_ci 2199ca880aSopenharmony_ci#include <stdio.h> 2299ca880aSopenharmony_ci#include <stdarg.h> 2399ca880aSopenharmony_ci#include <stdlib.h> 2499ca880aSopenharmony_ci#include <unistd.h> 2599ca880aSopenharmony_ci#include <errno.h> 2699ca880aSopenharmony_ci#include <string.h> 2799ca880aSopenharmony_ci#include <getopt.h> 2899ca880aSopenharmony_ci#include <fcntl.h> 2999ca880aSopenharmony_ci#include <sys/epoll.h> 3099ca880aSopenharmony_ci#include <sys/sysmacros.h> 3199ca880aSopenharmony_ci 3299ca880aSopenharmony_ci#include "libudev.h" 3399ca880aSopenharmony_ci#include "udev-util.h" 3499ca880aSopenharmony_ci#include "util.h" 3599ca880aSopenharmony_ci 3699ca880aSopenharmony_ci#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 3799ca880aSopenharmony_ci 3899ca880aSopenharmony_cistatic void print_device(struct udev_device *device) { 3999ca880aSopenharmony_ci const char *str; 4099ca880aSopenharmony_ci dev_t devnum; 4199ca880aSopenharmony_ci int count; 4299ca880aSopenharmony_ci struct udev_list_entry *list_entry; 4399ca880aSopenharmony_ci 4499ca880aSopenharmony_ci printf("*** device: %p ***\n", device); 4599ca880aSopenharmony_ci str = udev_device_get_action(device); 4699ca880aSopenharmony_ci if (str != NULL) 4799ca880aSopenharmony_ci printf("action: '%s'\n", str); 4899ca880aSopenharmony_ci 4999ca880aSopenharmony_ci str = udev_device_get_syspath(device); 5099ca880aSopenharmony_ci printf("syspath: '%s'\n", str); 5199ca880aSopenharmony_ci 5299ca880aSopenharmony_ci str = udev_device_get_sysname(device); 5399ca880aSopenharmony_ci printf("sysname: '%s'\n", str); 5499ca880aSopenharmony_ci 5599ca880aSopenharmony_ci str = udev_device_get_sysnum(device); 5699ca880aSopenharmony_ci if (str != NULL) 5799ca880aSopenharmony_ci printf("sysnum: '%s'\n", str); 5899ca880aSopenharmony_ci 5999ca880aSopenharmony_ci str = udev_device_get_devpath(device); 6099ca880aSopenharmony_ci printf("devpath: '%s'\n", str); 6199ca880aSopenharmony_ci 6299ca880aSopenharmony_ci str = udev_device_get_subsystem(device); 6399ca880aSopenharmony_ci if (str != NULL) 6499ca880aSopenharmony_ci printf("subsystem: '%s'\n", str); 6599ca880aSopenharmony_ci 6699ca880aSopenharmony_ci str = udev_device_get_devtype(device); 6799ca880aSopenharmony_ci if (str != NULL) 6899ca880aSopenharmony_ci printf("devtype: '%s'\n", str); 6999ca880aSopenharmony_ci 7099ca880aSopenharmony_ci str = udev_device_get_driver(device); 7199ca880aSopenharmony_ci if (str != NULL) 7299ca880aSopenharmony_ci printf("driver: '%s'\n", str); 7399ca880aSopenharmony_ci 7499ca880aSopenharmony_ci str = udev_device_get_devnode(device); 7599ca880aSopenharmony_ci if (str != NULL) 7699ca880aSopenharmony_ci printf("devname: '%s'\n", str); 7799ca880aSopenharmony_ci 7899ca880aSopenharmony_ci devnum = udev_device_get_devnum(device); 7999ca880aSopenharmony_ci if (major(devnum) > 0) 8099ca880aSopenharmony_ci printf("devnum: %u:%u\n", major(devnum), minor(devnum)); 8199ca880aSopenharmony_ci 8299ca880aSopenharmony_ci count = 0; 8399ca880aSopenharmony_ci udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(device)) { 8499ca880aSopenharmony_ci printf("link: '%s'\n", udev_list_entry_get_name(list_entry)); 8599ca880aSopenharmony_ci count++; 8699ca880aSopenharmony_ci } 8799ca880aSopenharmony_ci if (count > 0) 8899ca880aSopenharmony_ci printf("found %i links\n", count); 8999ca880aSopenharmony_ci 9099ca880aSopenharmony_ci count = 0; 9199ca880aSopenharmony_ci udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(device)) { 9299ca880aSopenharmony_ci printf("property: '%s=%s'\n", 9399ca880aSopenharmony_ci udev_list_entry_get_name(list_entry), 9499ca880aSopenharmony_ci udev_list_entry_get_value(list_entry)); 9599ca880aSopenharmony_ci count++; 9699ca880aSopenharmony_ci } 9799ca880aSopenharmony_ci if (count > 0) 9899ca880aSopenharmony_ci printf("found %i properties\n", count); 9999ca880aSopenharmony_ci 10099ca880aSopenharmony_ci str = udev_device_get_property_value(device, "MAJOR"); 10199ca880aSopenharmony_ci if (str != NULL) 10299ca880aSopenharmony_ci printf("MAJOR: '%s'\n", str); 10399ca880aSopenharmony_ci 10499ca880aSopenharmony_ci str = udev_device_get_sysattr_value(device, "dev"); 10599ca880aSopenharmony_ci if (str != NULL) 10699ca880aSopenharmony_ci printf("attr{dev}: '%s'\n", str); 10799ca880aSopenharmony_ci 10899ca880aSopenharmony_ci printf("\n"); 10999ca880aSopenharmony_ci} 11099ca880aSopenharmony_ci 11199ca880aSopenharmony_cistatic int test_device(struct udev *udev, const char *syspath) { 11299ca880aSopenharmony_ci _cleanup_udev_device_unref_ struct udev_device *device; 11399ca880aSopenharmony_ci 11499ca880aSopenharmony_ci printf("looking at device: %s\n", syspath); 11599ca880aSopenharmony_ci device = udev_device_new_from_syspath(udev, syspath); 11699ca880aSopenharmony_ci if (device == NULL) { 11799ca880aSopenharmony_ci printf("no device found\n"); 11899ca880aSopenharmony_ci return -1; 11999ca880aSopenharmony_ci } 12099ca880aSopenharmony_ci print_device(device); 12199ca880aSopenharmony_ci 12299ca880aSopenharmony_ci return 0; 12399ca880aSopenharmony_ci} 12499ca880aSopenharmony_ci 12599ca880aSopenharmony_cistatic int test_device_parents(struct udev *udev, const char *syspath) { 12699ca880aSopenharmony_ci _cleanup_udev_device_unref_ struct udev_device *device; 12799ca880aSopenharmony_ci struct udev_device *device_parent; 12899ca880aSopenharmony_ci 12999ca880aSopenharmony_ci printf("looking at device: %s\n", syspath); 13099ca880aSopenharmony_ci device = udev_device_new_from_syspath(udev, syspath); 13199ca880aSopenharmony_ci if (device == NULL) 13299ca880aSopenharmony_ci return -1; 13399ca880aSopenharmony_ci 13499ca880aSopenharmony_ci printf("looking at parents\n"); 13599ca880aSopenharmony_ci device_parent = device; 13699ca880aSopenharmony_ci do { 13799ca880aSopenharmony_ci print_device(device_parent); 13899ca880aSopenharmony_ci device_parent = udev_device_get_parent(device_parent); 13999ca880aSopenharmony_ci } while (device_parent != NULL); 14099ca880aSopenharmony_ci 14199ca880aSopenharmony_ci printf("looking at parents again\n"); 14299ca880aSopenharmony_ci device_parent = device; 14399ca880aSopenharmony_ci do { 14499ca880aSopenharmony_ci print_device(device_parent); 14599ca880aSopenharmony_ci device_parent = udev_device_get_parent(device_parent); 14699ca880aSopenharmony_ci } while (device_parent != NULL); 14799ca880aSopenharmony_ci 14899ca880aSopenharmony_ci return 0; 14999ca880aSopenharmony_ci} 15099ca880aSopenharmony_ci 15199ca880aSopenharmony_cistatic int test_device_devnum(struct udev *udev) { 15299ca880aSopenharmony_ci dev_t devnum = makedev(1, 3); 15399ca880aSopenharmony_ci struct udev_device *device; 15499ca880aSopenharmony_ci 15599ca880aSopenharmony_ci printf("looking up device: %u:%u\n", major(devnum), minor(devnum)); 15699ca880aSopenharmony_ci device = udev_device_new_from_devnum(udev, 'c', devnum); 15799ca880aSopenharmony_ci if (device == NULL) 15899ca880aSopenharmony_ci return -1; 15999ca880aSopenharmony_ci print_device(device); 16099ca880aSopenharmony_ci udev_device_unref(device); 16199ca880aSopenharmony_ci return 0; 16299ca880aSopenharmony_ci} 16399ca880aSopenharmony_ci 16499ca880aSopenharmony_cistatic int test_device_subsys_name(struct udev *udev) { 16599ca880aSopenharmony_ci struct udev_device *device; 16699ca880aSopenharmony_ci 16799ca880aSopenharmony_ci printf("looking up device: 'block':'sda'\n"); 16899ca880aSopenharmony_ci device = udev_device_new_from_subsystem_sysname(udev, "block", "sda"); 16999ca880aSopenharmony_ci if (device == NULL) 17099ca880aSopenharmony_ci return -1; 17199ca880aSopenharmony_ci print_device(device); 17299ca880aSopenharmony_ci udev_device_unref(device); 17399ca880aSopenharmony_ci 17499ca880aSopenharmony_ci printf("looking up device: 'subsystem':'pci'\n"); 17599ca880aSopenharmony_ci device = udev_device_new_from_subsystem_sysname(udev, "subsystem", "pci"); 17699ca880aSopenharmony_ci if (device == NULL) 17799ca880aSopenharmony_ci return -1; 17899ca880aSopenharmony_ci print_device(device); 17999ca880aSopenharmony_ci udev_device_unref(device); 18099ca880aSopenharmony_ci 18199ca880aSopenharmony_ci printf("looking up device: 'drivers':'scsi:sd'\n"); 18299ca880aSopenharmony_ci device = udev_device_new_from_subsystem_sysname(udev, "drivers", "scsi:sd"); 18399ca880aSopenharmony_ci if (device == NULL) 18499ca880aSopenharmony_ci return -1; 18599ca880aSopenharmony_ci print_device(device); 18699ca880aSopenharmony_ci udev_device_unref(device); 18799ca880aSopenharmony_ci 18899ca880aSopenharmony_ci printf("looking up device: 'module':'printk'\n"); 18999ca880aSopenharmony_ci device = udev_device_new_from_subsystem_sysname(udev, "module", "printk"); 19099ca880aSopenharmony_ci if (device == NULL) 19199ca880aSopenharmony_ci return -1; 19299ca880aSopenharmony_ci print_device(device); 19399ca880aSopenharmony_ci udev_device_unref(device); 19499ca880aSopenharmony_ci return 0; 19599ca880aSopenharmony_ci} 19699ca880aSopenharmony_ci 19799ca880aSopenharmony_cistatic int test_enumerate_print_list(struct udev_enumerate *enumerate) { 19899ca880aSopenharmony_ci struct udev_list_entry *list_entry; 19999ca880aSopenharmony_ci int count = 0; 20099ca880aSopenharmony_ci 20199ca880aSopenharmony_ci udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(enumerate)) { 20299ca880aSopenharmony_ci struct udev_device *device; 20399ca880aSopenharmony_ci 20499ca880aSopenharmony_ci device = udev_device_new_from_syspath(udev_enumerate_get_udev(enumerate), 20599ca880aSopenharmony_ci udev_list_entry_get_name(list_entry)); 20699ca880aSopenharmony_ci if (device != NULL) { 20799ca880aSopenharmony_ci printf("device: '%s' (%s)\n", 20899ca880aSopenharmony_ci udev_device_get_syspath(device), 20999ca880aSopenharmony_ci udev_device_get_subsystem(device)); 21099ca880aSopenharmony_ci udev_device_unref(device); 21199ca880aSopenharmony_ci count++; 21299ca880aSopenharmony_ci } 21399ca880aSopenharmony_ci } 21499ca880aSopenharmony_ci printf("found %i devices\n\n", count); 21599ca880aSopenharmony_ci return count; 21699ca880aSopenharmony_ci} 21799ca880aSopenharmony_ci 21899ca880aSopenharmony_cistatic int test_monitor(struct udev *udev) { 21999ca880aSopenharmony_ci struct udev_monitor *udev_monitor = NULL; 22099ca880aSopenharmony_ci int fd_ep; 22199ca880aSopenharmony_ci int fd_udev = -1; 22299ca880aSopenharmony_ci struct epoll_event ep_udev, ep_stdin; 22399ca880aSopenharmony_ci 22499ca880aSopenharmony_ci fd_ep = epoll_create1(EPOLL_CLOEXEC); 22599ca880aSopenharmony_ci if (fd_ep < 0) { 22699ca880aSopenharmony_ci printf("error creating epoll fd: %m\n"); 22799ca880aSopenharmony_ci goto out; 22899ca880aSopenharmony_ci } 22999ca880aSopenharmony_ci 23099ca880aSopenharmony_ci udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); 23199ca880aSopenharmony_ci if (udev_monitor == NULL) { 23299ca880aSopenharmony_ci printf("no socket\n"); 23399ca880aSopenharmony_ci goto out; 23499ca880aSopenharmony_ci } 23599ca880aSopenharmony_ci fd_udev = udev_monitor_get_fd(udev_monitor); 23699ca880aSopenharmony_ci 23799ca880aSopenharmony_ci if (udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "block", NULL) < 0 || 23899ca880aSopenharmony_ci udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL) < 0 || 23999ca880aSopenharmony_ci udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device") < 0) { 24099ca880aSopenharmony_ci printf("filter failed\n"); 24199ca880aSopenharmony_ci goto out; 24299ca880aSopenharmony_ci } 24399ca880aSopenharmony_ci 24499ca880aSopenharmony_ci if (udev_monitor_enable_receiving(udev_monitor) < 0) { 24599ca880aSopenharmony_ci printf("bind failed\n"); 24699ca880aSopenharmony_ci goto out; 24799ca880aSopenharmony_ci } 24899ca880aSopenharmony_ci 24999ca880aSopenharmony_ci memzero(&ep_udev, sizeof(struct epoll_event)); 25099ca880aSopenharmony_ci ep_udev.events = EPOLLIN; 25199ca880aSopenharmony_ci ep_udev.data.fd = fd_udev; 25299ca880aSopenharmony_ci if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_udev, &ep_udev) < 0) { 25399ca880aSopenharmony_ci printf("fail to add fd to epoll: %m\n"); 25499ca880aSopenharmony_ci goto out; 25599ca880aSopenharmony_ci } 25699ca880aSopenharmony_ci 25799ca880aSopenharmony_ci memzero(&ep_stdin, sizeof(struct epoll_event)); 25899ca880aSopenharmony_ci ep_stdin.events = EPOLLIN; 25999ca880aSopenharmony_ci ep_stdin.data.fd = STDIN_FILENO; 26099ca880aSopenharmony_ci if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, STDIN_FILENO, &ep_stdin) < 0) { 26199ca880aSopenharmony_ci printf("fail to add fd to epoll: %m\n"); 26299ca880aSopenharmony_ci goto out; 26399ca880aSopenharmony_ci } 26499ca880aSopenharmony_ci 26599ca880aSopenharmony_ci for (;;) { 26699ca880aSopenharmony_ci int fdcount; 26799ca880aSopenharmony_ci struct epoll_event ev[4]; 26899ca880aSopenharmony_ci struct udev_device *device; 26999ca880aSopenharmony_ci int i; 27099ca880aSopenharmony_ci 27199ca880aSopenharmony_ci printf("waiting for events from udev, press ENTER to exit\n"); 27299ca880aSopenharmony_ci fdcount = epoll_wait(fd_ep, ev, ARRAY_SIZE(ev), -1); 27399ca880aSopenharmony_ci printf("epoll fd count: %i\n", fdcount); 27499ca880aSopenharmony_ci 27599ca880aSopenharmony_ci for (i = 0; i < fdcount; i++) { 27699ca880aSopenharmony_ci if (ev[i].data.fd == fd_udev && ev[i].events & EPOLLIN) { 27799ca880aSopenharmony_ci device = udev_monitor_receive_device(udev_monitor); 27899ca880aSopenharmony_ci if (device == NULL) { 27999ca880aSopenharmony_ci printf("no device from socket\n"); 28099ca880aSopenharmony_ci continue; 28199ca880aSopenharmony_ci } 28299ca880aSopenharmony_ci print_device(device); 28399ca880aSopenharmony_ci udev_device_unref(device); 28499ca880aSopenharmony_ci } else if (ev[i].data.fd == STDIN_FILENO && ev[i].events & EPOLLIN) { 28599ca880aSopenharmony_ci printf("exiting loop\n"); 28699ca880aSopenharmony_ci goto out; 28799ca880aSopenharmony_ci } 28899ca880aSopenharmony_ci } 28999ca880aSopenharmony_ci } 29099ca880aSopenharmony_ciout: 29199ca880aSopenharmony_ci if (fd_ep >= 0) 29299ca880aSopenharmony_ci close(fd_ep); 29399ca880aSopenharmony_ci udev_monitor_unref(udev_monitor); 29499ca880aSopenharmony_ci return 0; 29599ca880aSopenharmony_ci} 29699ca880aSopenharmony_ci 29799ca880aSopenharmony_cistatic int test_queue(struct udev *udev) { 29899ca880aSopenharmony_ci struct udev_queue *udev_queue; 29999ca880aSopenharmony_ci 30099ca880aSopenharmony_ci udev_queue = udev_queue_new(udev); 30199ca880aSopenharmony_ci if (udev_queue == NULL) 30299ca880aSopenharmony_ci return -1; 30399ca880aSopenharmony_ci 30499ca880aSopenharmony_ci if (udev_queue_get_queue_is_empty(udev_queue)) 30599ca880aSopenharmony_ci printf("queue is empty\n"); 30699ca880aSopenharmony_ci 30799ca880aSopenharmony_ci udev_queue_unref(udev_queue); 30899ca880aSopenharmony_ci return 0; 30999ca880aSopenharmony_ci} 31099ca880aSopenharmony_ci 31199ca880aSopenharmony_cistatic int test_enumerate(struct udev *udev, const char *subsystem) { 31299ca880aSopenharmony_ci struct udev_enumerate *udev_enumerate; 31399ca880aSopenharmony_ci 31499ca880aSopenharmony_ci printf("enumerate '%s'\n", subsystem == NULL ? "<all>" : subsystem); 31599ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 31699ca880aSopenharmony_ci if (udev_enumerate == NULL) 31799ca880aSopenharmony_ci return -1; 31899ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate, subsystem); 31999ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 32099ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 32199ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 32299ca880aSopenharmony_ci 32399ca880aSopenharmony_ci printf("enumerate 'net' + duplicated scan + null + zero\n"); 32499ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 32599ca880aSopenharmony_ci if (udev_enumerate == NULL) 32699ca880aSopenharmony_ci return -1; 32799ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate, "net"); 32899ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 32999ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 33099ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero"); 33199ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null"); 33299ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero"); 33399ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null"); 33499ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero"); 33599ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null"); 33699ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/null"); 33799ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero"); 33899ca880aSopenharmony_ci udev_enumerate_add_syspath(udev_enumerate, "/sys/class/mem/zero"); 33999ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 34099ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 34199ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 34299ca880aSopenharmony_ci 34399ca880aSopenharmony_ci printf("enumerate 'block'\n"); 34499ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 34599ca880aSopenharmony_ci if (udev_enumerate == NULL) 34699ca880aSopenharmony_ci return -1; 34799ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate,"block"); 34899ca880aSopenharmony_ci udev_enumerate_add_match_is_initialized(udev_enumerate); 34999ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 35099ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 35199ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 35299ca880aSopenharmony_ci 35399ca880aSopenharmony_ci printf("enumerate 'not block'\n"); 35499ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 35599ca880aSopenharmony_ci if (udev_enumerate == NULL) 35699ca880aSopenharmony_ci return -1; 35799ca880aSopenharmony_ci udev_enumerate_add_nomatch_subsystem(udev_enumerate, "block"); 35899ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 35999ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 36099ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 36199ca880aSopenharmony_ci 36299ca880aSopenharmony_ci printf("enumerate 'pci, mem, vc'\n"); 36399ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 36499ca880aSopenharmony_ci if (udev_enumerate == NULL) 36599ca880aSopenharmony_ci return -1; 36699ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate, "pci"); 36799ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate, "mem"); 36899ca880aSopenharmony_ci udev_enumerate_add_match_subsystem(udev_enumerate, "vc"); 36999ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 37099ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 37199ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 37299ca880aSopenharmony_ci 37399ca880aSopenharmony_ci printf("enumerate 'subsystem'\n"); 37499ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 37599ca880aSopenharmony_ci if (udev_enumerate == NULL) 37699ca880aSopenharmony_ci return -1; 37799ca880aSopenharmony_ci udev_enumerate_scan_subsystems(udev_enumerate); 37899ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 37999ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 38099ca880aSopenharmony_ci 38199ca880aSopenharmony_ci printf("enumerate 'property IF_FS_*=filesystem'\n"); 38299ca880aSopenharmony_ci udev_enumerate = udev_enumerate_new(udev); 38399ca880aSopenharmony_ci if (udev_enumerate == NULL) 38499ca880aSopenharmony_ci return -1; 38599ca880aSopenharmony_ci udev_enumerate_add_match_property(udev_enumerate, "ID_FS*", "filesystem"); 38699ca880aSopenharmony_ci udev_enumerate_scan_devices(udev_enumerate); 38799ca880aSopenharmony_ci test_enumerate_print_list(udev_enumerate); 38899ca880aSopenharmony_ci udev_enumerate_unref(udev_enumerate); 38999ca880aSopenharmony_ci return 0; 39099ca880aSopenharmony_ci} 39199ca880aSopenharmony_ci 39299ca880aSopenharmony_cistatic void test_hwdb(struct udev *udev, const char *modalias) { 39399ca880aSopenharmony_ci struct udev_hwdb *hwdb; 39499ca880aSopenharmony_ci struct udev_list_entry *entry; 39599ca880aSopenharmony_ci 39699ca880aSopenharmony_ci hwdb = udev_hwdb_new(udev); 39799ca880aSopenharmony_ci 39899ca880aSopenharmony_ci udev_list_entry_foreach(entry, udev_hwdb_get_properties_list_entry(hwdb, modalias, 0)) 39999ca880aSopenharmony_ci printf("'%s'='%s'\n", udev_list_entry_get_name(entry), udev_list_entry_get_value(entry)); 40099ca880aSopenharmony_ci printf("\n"); 40199ca880aSopenharmony_ci 40299ca880aSopenharmony_ci hwdb = udev_hwdb_unref(hwdb); 40399ca880aSopenharmony_ci assert(hwdb == NULL); 40499ca880aSopenharmony_ci} 40599ca880aSopenharmony_ci 40699ca880aSopenharmony_ciint main(int argc, char *argv[]) { 40799ca880aSopenharmony_ci struct udev *udev = NULL; 40899ca880aSopenharmony_ci static const struct option options[] = { 40999ca880aSopenharmony_ci { "syspath", required_argument, NULL, 'p' }, 41099ca880aSopenharmony_ci { "subsystem", required_argument, NULL, 's' }, 41199ca880aSopenharmony_ci { "debug", no_argument, NULL, 'd' }, 41299ca880aSopenharmony_ci { "help", no_argument, NULL, 'h' }, 41399ca880aSopenharmony_ci { "version", no_argument, NULL, 'V' }, 41499ca880aSopenharmony_ci {} 41599ca880aSopenharmony_ci }; 41699ca880aSopenharmony_ci const char *syspath = "/devices/virtual/mem/null"; 41799ca880aSopenharmony_ci const char *subsystem = NULL; 41899ca880aSopenharmony_ci char path[1024]; 41999ca880aSopenharmony_ci int c; 42099ca880aSopenharmony_ci 42199ca880aSopenharmony_ci udev = udev_new(); 42299ca880aSopenharmony_ci printf("context: %p\n", udev); 42399ca880aSopenharmony_ci if (udev == NULL) { 42499ca880aSopenharmony_ci printf("no context\n"); 42599ca880aSopenharmony_ci return 1; 42699ca880aSopenharmony_ci } 42799ca880aSopenharmony_ci 42899ca880aSopenharmony_ci while ((c = getopt_long(argc, argv, "p:s:dhV", options, NULL)) >= 0) 42999ca880aSopenharmony_ci switch (c) { 43099ca880aSopenharmony_ci 43199ca880aSopenharmony_ci case 'p': 43299ca880aSopenharmony_ci syspath = optarg; 43399ca880aSopenharmony_ci break; 43499ca880aSopenharmony_ci 43599ca880aSopenharmony_ci case 's': 43699ca880aSopenharmony_ci subsystem = optarg; 43799ca880aSopenharmony_ci break; 43899ca880aSopenharmony_ci 43999ca880aSopenharmony_ci case 'd': 44099ca880aSopenharmony_ci if (log_get_max_level() < LOG_INFO) 44199ca880aSopenharmony_ci log_set_max_level(LOG_INFO); 44299ca880aSopenharmony_ci break; 44399ca880aSopenharmony_ci 44499ca880aSopenharmony_ci case 'h': 44599ca880aSopenharmony_ci printf("--debug --syspath= --subsystem= --help\n"); 44699ca880aSopenharmony_ci goto out; 44799ca880aSopenharmony_ci 44899ca880aSopenharmony_ci case 'V': 44999ca880aSopenharmony_ci printf("%s\n", VERSION); 45099ca880aSopenharmony_ci goto out; 45199ca880aSopenharmony_ci 45299ca880aSopenharmony_ci case '?': 45399ca880aSopenharmony_ci goto out; 45499ca880aSopenharmony_ci 45599ca880aSopenharmony_ci default: 45699ca880aSopenharmony_ci assert_not_reached("Unhandled option code."); 45799ca880aSopenharmony_ci } 45899ca880aSopenharmony_ci 45999ca880aSopenharmony_ci 46099ca880aSopenharmony_ci /* add sys path if needed */ 46199ca880aSopenharmony_ci if (!startswith(syspath, "/sys")) { 46299ca880aSopenharmony_ci snprintf(path, sizeof(path), "/sys/%s", syspath); 46399ca880aSopenharmony_ci syspath = path; 46499ca880aSopenharmony_ci } 46599ca880aSopenharmony_ci 46699ca880aSopenharmony_ci test_device(udev, syspath); 46799ca880aSopenharmony_ci test_device_devnum(udev); 46899ca880aSopenharmony_ci test_device_subsys_name(udev); 46999ca880aSopenharmony_ci test_device_parents(udev, syspath); 47099ca880aSopenharmony_ci 47199ca880aSopenharmony_ci test_enumerate(udev, subsystem); 47299ca880aSopenharmony_ci 47399ca880aSopenharmony_ci test_queue(udev); 47499ca880aSopenharmony_ci 47599ca880aSopenharmony_ci test_hwdb(udev, "usb:v0D50p0011*"); 47699ca880aSopenharmony_ci 47799ca880aSopenharmony_ci test_monitor(udev); 47899ca880aSopenharmony_ciout: 47999ca880aSopenharmony_ci udev_unref(udev); 48099ca880aSopenharmony_ci return 0; 48199ca880aSopenharmony_ci} 482