199ca880aSopenharmony_ci# eudev
299ca880aSopenharmony_ciudev is a generic device manager running as a daemon on a Linux system and listening (through a netlink socket) for uevents the kernel sends out if a new device is initialized or a device is removed from the system. udev comes with a set of rules that match against exported values of the event and properties of the discovered device. A matching rule will name and create a device node and run configured programs to set up and configure the device.
399ca880aSopenharmony_ci
499ca880aSopenharmony_ciEach time a change happens within the device structure, the kernel emits a uevent, which is obtained by the device manager. The device manager then follows the declared rules. Based on the information contained in the uevent, it finds the rule or rules it needs to trigger and performs the required actions. These actions may involve the creation or deletion of device files, and may also trigger the loading of particular firmware files into kernel memory.
599ca880aSopenharmony_ci
699ca880aSopenharmony_ci## Directory Structure
799ca880aSopenharmony_ci
899ca880aSopenharmony_ci```
999ca880aSopenharmony_ciREADME.md               Introduction in English
1099ca880aSopenharmony_ciREADME_zh.md            Introduction in Chinese
1199ca880aSopenharmony_ciCOPYING                 Copyright file
1299ca880aSopenharmony_cihwdb/                   Hardware database file
1399ca880aSopenharmony_cirules.d/                Rule file
1499ca880aSopenharmony_ciexport_include/         Exported header file
1599ca880aSopenharmony_cisrc/                    C++ source code
1699ca880aSopenharmony_citest/                   Test file
1799ca880aSopenharmony_ciman/                    Help file
1899ca880aSopenharmony_ci```
1999ca880aSopenharmony_ci
2099ca880aSopenharmony_ci## How OpenHarmony Integrates libudev
2199ca880aSopenharmony_ci### 1. Importing Header File
2299ca880aSopenharmony_ci```cpp
2399ca880aSopenharmony_ci#include "libudev.h"
2499ca880aSopenharmony_ci```
2599ca880aSopenharmony_ci### 2. Adding Reference to BUILD.gn
2699ca880aSopenharmony_ci```cpp
2799ca880aSopenharmony_cideps += [ "//third_party/eudev:libudev" ]
2899ca880aSopenharmony_ci```
2999ca880aSopenharmony_ci### 3. Example of Invoking the udev Function
3099ca880aSopenharmony_ci```cpp
3199ca880aSopenharmony_ci#include <stdio.h>
3299ca880aSopenharmony_ci#include "libudev.h"
3399ca880aSopenharmony_ci
3499ca880aSopenharmony_civoid test_device(struct udev *udev, const char *syspath)
3599ca880aSopenharmony_ci{
3699ca880aSopenharmony_ci    struct udev_device *device;
3799ca880aSopenharmony_ci    printf("looking at device: %s\n", syspath);
3899ca880aSopenharmony_ci    device = udev_device_new_from_syspath(udev, syspath);
3999ca880aSopenharmony_ci    if (device == NULL) {
4099ca880aSopenharmony_ci        printf("no device found\n");
4199ca880aSopenharmony_ci        return;
4299ca880aSopenharmony_ci    }
4399ca880aSopenharmony_ci    printf("*** device: %p ***\n", device);
4499ca880aSopenharmony_ci    const char *str = udev_device_get_devnode(device);
4599ca880aSopenharmony_ci    if (str != NULL) {
4699ca880aSopenharmony_ci        printf("devname:   '%s'\n", str);
4799ca880aSopenharmony_ci    }
4899ca880aSopenharmony_ci    dev_t devnum = udev_device_get_devnum(device);
4999ca880aSopenharmony_ci    if (major(devnum) > 0) {
5099ca880aSopenharmony_ci        printf("devnum:    %u:%u\n", major(devnum), minor(devnum));
5199ca880aSopenharmony_ci    }
5299ca880aSopenharmony_ci    udev_device_unref(device);
5399ca880aSopenharmony_ci}
5499ca880aSopenharmony_ci
5599ca880aSopenharmony_ciint main(int argc, char *argv[])
5699ca880aSopenharmony_ci{
5799ca880aSopenharmony_ci    struct udev *udev = udev_new();
5899ca880aSopenharmony_ci    printf("udev context: %p\n", udev);
5999ca880aSopenharmony_ci    if (udev == NULL) {
6099ca880aSopenharmony_ci        printf("no context\n");
6199ca880aSopenharmony_ci        return 1;
6299ca880aSopenharmony_ci    }
6399ca880aSopenharmony_ci    const char *path = "/sys/devices/virtual/mem/null";
6499ca880aSopenharmony_ci    test_device(udev, path);
6599ca880aSopenharmony_ci    udev_unref(udev);
6699ca880aSopenharmony_ci    return 0;
6799ca880aSopenharmony_ci}
6899ca880aSopenharmony_ci```
6999ca880aSopenharmony_ci
7099ca880aSopenharmony_ci## udev Document
7199ca880aSopenharmony_ci
7299ca880aSopenharmony_ciOfficial document: https://github.com/eudev-project/eudev
7399ca880aSopenharmony_ci
7499ca880aSopenharmony_ci## Copyright
7599ca880aSopenharmony_ci
7699ca880aSopenharmony_ciSee [COPYING](COPYING).
77