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