199ca880aSopenharmony_ci/***
299ca880aSopenharmony_ci  This file is part of systemd.
399ca880aSopenharmony_ci
499ca880aSopenharmony_ci  Copyright 2008-2012 Kay Sievers <kay@vrfy.org>
599ca880aSopenharmony_ci
699ca880aSopenharmony_ci  systemd is free software; you can redistribute it and/or modify it
799ca880aSopenharmony_ci  under the terms of the GNU Lesser General Public License as published by
899ca880aSopenharmony_ci  the Free Software Foundation; either version 2.1 of the License, or
999ca880aSopenharmony_ci  (at your option) any later version.
1099ca880aSopenharmony_ci
1199ca880aSopenharmony_ci  systemd is distributed in the hope that it will be useful, but
1299ca880aSopenharmony_ci  WITHOUT ANY WARRANTY; without even the implied warranty of
1399ca880aSopenharmony_ci  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1499ca880aSopenharmony_ci  Lesser General Public License for more details.
1599ca880aSopenharmony_ci
1699ca880aSopenharmony_ci  You should have received a copy of the GNU Lesser General Public License
1799ca880aSopenharmony_ci  along with systemd; If not, see <http://www.gnu.org/licenses/>.
1899ca880aSopenharmony_ci***/
1999ca880aSopenharmony_ci
2099ca880aSopenharmony_ci#pragma once
2199ca880aSopenharmony_ci
2299ca880aSopenharmony_ci#include <stdarg.h>
2399ca880aSopenharmony_ci#include <sys/sysmacros.h>
2499ca880aSopenharmony_ci#include <sys/types.h>
2599ca880aSopenharmony_ci#include <sys/stat.h>
2699ca880aSopenharmony_ci
2799ca880aSopenharmony_ci#ifdef __cplusplus
2899ca880aSopenharmony_ciextern "C" {
2999ca880aSopenharmony_ci#endif
3099ca880aSopenharmony_ci
3199ca880aSopenharmony_ci/*
3299ca880aSopenharmony_ci * udev - library context
3399ca880aSopenharmony_ci *
3499ca880aSopenharmony_ci * reads the udev config and system environment
3599ca880aSopenharmony_ci * allows custom logging
3699ca880aSopenharmony_ci */
3799ca880aSopenharmony_cistruct udev;
3899ca880aSopenharmony_cistruct udev *udev_ref(struct udev *udev);
3999ca880aSopenharmony_cistruct udev *udev_unref(struct udev *udev);
4099ca880aSopenharmony_cistruct udev *udev_new(void);
4199ca880aSopenharmony_civoid udev_set_log_fn(struct udev *udev,
4299ca880aSopenharmony_ci                            void (*log_fn)(struct udev *udev,
4399ca880aSopenharmony_ci                                           int priority, const char *file, int line, const char *fn,
4499ca880aSopenharmony_ci                                           const char *format, va_list args)) __attribute__ ((deprecated));
4599ca880aSopenharmony_ciint udev_get_log_priority(struct udev *udev) __attribute__ ((deprecated));
4699ca880aSopenharmony_civoid udev_set_log_priority(struct udev *udev, int priority) __attribute__ ((deprecated));
4799ca880aSopenharmony_civoid *udev_get_userdata(struct udev *udev);
4899ca880aSopenharmony_civoid udev_set_userdata(struct udev *udev, void *userdata);
4999ca880aSopenharmony_ci
5099ca880aSopenharmony_ci/*
5199ca880aSopenharmony_ci * udev_list
5299ca880aSopenharmony_ci *
5399ca880aSopenharmony_ci * access to libudev generated lists
5499ca880aSopenharmony_ci */
5599ca880aSopenharmony_cistruct udev_list_entry;
5699ca880aSopenharmony_cistruct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry);
5799ca880aSopenharmony_cistruct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list_entry, const char *name);
5899ca880aSopenharmony_ciconst char *udev_list_entry_get_name(struct udev_list_entry *list_entry);
5999ca880aSopenharmony_ciconst char *udev_list_entry_get_value(struct udev_list_entry *list_entry);
6099ca880aSopenharmony_ci/**
6199ca880aSopenharmony_ci * udev_list_entry_foreach:
6299ca880aSopenharmony_ci * @list_entry: entry to store the current position
6399ca880aSopenharmony_ci * @first_entry: first entry to start with
6499ca880aSopenharmony_ci *
6599ca880aSopenharmony_ci * Helper to iterate over all entries of a list.
6699ca880aSopenharmony_ci */
6799ca880aSopenharmony_ci#define udev_list_entry_foreach(list_entry, first_entry) \
6899ca880aSopenharmony_ci        for (list_entry = first_entry; \
6999ca880aSopenharmony_ci             list_entry != NULL; \
7099ca880aSopenharmony_ci             list_entry = udev_list_entry_get_next(list_entry))
7199ca880aSopenharmony_ci
7299ca880aSopenharmony_ci/*
7399ca880aSopenharmony_ci * udev_device
7499ca880aSopenharmony_ci *
7599ca880aSopenharmony_ci * access to sysfs/kernel devices
7699ca880aSopenharmony_ci */
7799ca880aSopenharmony_cistruct udev_device;
7899ca880aSopenharmony_cistruct udev_device *udev_device_ref(struct udev_device *udev_device);
7999ca880aSopenharmony_cistruct udev_device *udev_device_unref(struct udev_device *udev_device);
8099ca880aSopenharmony_cistruct udev *udev_device_get_udev(struct udev_device *udev_device);
8199ca880aSopenharmony_cistruct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath);
8299ca880aSopenharmony_cistruct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum);
8399ca880aSopenharmony_cistruct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname);
8499ca880aSopenharmony_cistruct udev_device *udev_device_new_from_device_id(struct udev *udev, const char *id);
8599ca880aSopenharmony_cistruct udev_device *udev_device_new_from_environment(struct udev *udev);
8699ca880aSopenharmony_ci/* udev_device_get_parent_*() does not take a reference on the returned device, it is automatically unref'd with the parent */
8799ca880aSopenharmony_cistruct udev_device *udev_device_get_parent(struct udev_device *udev_device);
8899ca880aSopenharmony_cistruct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device,
8999ca880aSopenharmony_ci                                                                  const char *subsystem, const char *devtype);
9099ca880aSopenharmony_ci/* retrieve device properties */
9199ca880aSopenharmony_ciint udev_device_read_db(struct udev_device *udev_device);
9299ca880aSopenharmony_ciconst char *udev_device_get_devpath(struct udev_device *udev_device);
9399ca880aSopenharmony_ciconst char *udev_device_get_subsystem(struct udev_device *udev_device);
9499ca880aSopenharmony_ciconst char *udev_device_get_devtype(struct udev_device *udev_device);
9599ca880aSopenharmony_ciconst char *udev_device_get_syspath(struct udev_device *udev_device);
9699ca880aSopenharmony_ciconst char *udev_device_get_sysname(struct udev_device *udev_device);
9799ca880aSopenharmony_ciconst char *udev_device_get_sysnum(struct udev_device *udev_device);
9899ca880aSopenharmony_ciconst char *udev_device_get_devnode(struct udev_device *udev_device);
9999ca880aSopenharmony_ciint udev_device_get_is_initialized(struct udev_device *udev_device);
10099ca880aSopenharmony_cistruct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device);
10199ca880aSopenharmony_cistruct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device);
10299ca880aSopenharmony_cistruct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device);
10399ca880aSopenharmony_cistruct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device);
10499ca880aSopenharmony_ciconst char *udev_device_get_property_value(struct udev_device *udev_device, const char *key);
10599ca880aSopenharmony_ciconst char *udev_device_get_driver(struct udev_device *udev_device);
10699ca880aSopenharmony_cidev_t udev_device_get_devnum(struct udev_device *udev_device);
10799ca880aSopenharmony_ciconst char *udev_device_get_action(struct udev_device *udev_device);
10899ca880aSopenharmony_ciunsigned long long int udev_device_get_seqnum(struct udev_device *udev_device);
10999ca880aSopenharmony_ciunsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device);
11099ca880aSopenharmony_ciconst char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);
11199ca880aSopenharmony_ciint udev_device_set_sysattr_value(struct udev_device *udev_device, const char *sysattr, char *value);
11299ca880aSopenharmony_ciint udev_device_has_tag(struct udev_device *udev_device, const char *tag);
11399ca880aSopenharmony_ci
11499ca880aSopenharmony_ci/*
11599ca880aSopenharmony_ci * udev_monitor
11699ca880aSopenharmony_ci *
11799ca880aSopenharmony_ci * access to kernel uevents and udev events
11899ca880aSopenharmony_ci */
11999ca880aSopenharmony_cistruct udev_monitor;
12099ca880aSopenharmony_cistruct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor);
12199ca880aSopenharmony_cistruct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor);
12299ca880aSopenharmony_cistruct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor);
12399ca880aSopenharmony_ci/* kernel and udev generated events over netlink */
12499ca880aSopenharmony_cistruct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name);
12599ca880aSopenharmony_ci/* bind socket */
12699ca880aSopenharmony_ciint udev_monitor_enable_receiving(struct udev_monitor *udev_monitor);
12799ca880aSopenharmony_ciint udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size);
12899ca880aSopenharmony_ciint udev_monitor_get_fd(struct udev_monitor *udev_monitor);
12999ca880aSopenharmony_cistruct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor);
13099ca880aSopenharmony_ci/* in-kernel socket filters to select messages that get delivered to a listener */
13199ca880aSopenharmony_ciint udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor,
13299ca880aSopenharmony_ci                                                    const char *subsystem, const char *devtype);
13399ca880aSopenharmony_ciint udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag);
13499ca880aSopenharmony_ciint udev_monitor_filter_update(struct udev_monitor *udev_monitor);
13599ca880aSopenharmony_ciint udev_monitor_filter_remove(struct udev_monitor *udev_monitor);
13699ca880aSopenharmony_ci
13799ca880aSopenharmony_ci/*
13899ca880aSopenharmony_ci * udev_enumerate
13999ca880aSopenharmony_ci *
14099ca880aSopenharmony_ci * search sysfs for specific devices and provide a sorted list
14199ca880aSopenharmony_ci */
14299ca880aSopenharmony_cistruct udev_enumerate;
14399ca880aSopenharmony_cistruct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate);
14499ca880aSopenharmony_cistruct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate);
14599ca880aSopenharmony_cistruct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate);
14699ca880aSopenharmony_cistruct udev_enumerate *udev_enumerate_new(struct udev *udev);
14799ca880aSopenharmony_ci/* device properties filter */
14899ca880aSopenharmony_ciint udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem);
14999ca880aSopenharmony_ciint udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem);
15099ca880aSopenharmony_ciint udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
15199ca880aSopenharmony_ciint udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
15299ca880aSopenharmony_ciint udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value);
15399ca880aSopenharmony_ciint udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname);
15499ca880aSopenharmony_ciint udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag);
15599ca880aSopenharmony_ciint udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *parent);
15699ca880aSopenharmony_ciint udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate);
15799ca880aSopenharmony_ciint udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath);
15899ca880aSopenharmony_ci/* run enumeration with active filters */
15999ca880aSopenharmony_ciint udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate);
16099ca880aSopenharmony_ciint udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate);
16199ca880aSopenharmony_ci/* return device list */
16299ca880aSopenharmony_cistruct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate);
16399ca880aSopenharmony_ci
16499ca880aSopenharmony_ci/*
16599ca880aSopenharmony_ci * udev_queue
16699ca880aSopenharmony_ci *
16799ca880aSopenharmony_ci * access to the currently running udev events
16899ca880aSopenharmony_ci */
16999ca880aSopenharmony_cistruct udev_queue;
17099ca880aSopenharmony_cistruct udev_queue *udev_queue_ref(struct udev_queue *udev_queue);
17199ca880aSopenharmony_cistruct udev_queue *udev_queue_unref(struct udev_queue *udev_queue);
17299ca880aSopenharmony_cistruct udev *udev_queue_get_udev(struct udev_queue *udev_queue);
17399ca880aSopenharmony_cistruct udev_queue *udev_queue_new(struct udev *udev);
17499ca880aSopenharmony_ciunsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queue) __attribute__ ((deprecated));
17599ca880aSopenharmony_ciunsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) __attribute__ ((deprecated));
17699ca880aSopenharmony_ciint udev_queue_get_udev_is_active(struct udev_queue *udev_queue);
17799ca880aSopenharmony_ciint udev_queue_get_queue_is_empty(struct udev_queue *udev_queue);
17899ca880aSopenharmony_ciint udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned long long int seqnum) __attribute__ ((deprecated));
17999ca880aSopenharmony_ciint udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue,
18099ca880aSopenharmony_ci                                               unsigned long long int start, unsigned long long int end) __attribute__ ((deprecated));
18199ca880aSopenharmony_ciint udev_queue_get_fd(struct udev_queue *udev_queue);
18299ca880aSopenharmony_ciint udev_queue_flush(struct udev_queue *udev_queue);
18399ca880aSopenharmony_cistruct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev_queue) __attribute__ ((deprecated));
18499ca880aSopenharmony_ci
18599ca880aSopenharmony_ci/*
18699ca880aSopenharmony_ci *  udev_hwdb
18799ca880aSopenharmony_ci *
18899ca880aSopenharmony_ci *  access to the static hardware properties database
18999ca880aSopenharmony_ci */
19099ca880aSopenharmony_cistruct udev_hwdb;
19199ca880aSopenharmony_cistruct udev_hwdb *udev_hwdb_new(struct udev *udev);
19299ca880aSopenharmony_cistruct udev_hwdb *udev_hwdb_ref(struct udev_hwdb *hwdb);
19399ca880aSopenharmony_cistruct udev_hwdb *udev_hwdb_unref(struct udev_hwdb *hwdb);
19499ca880aSopenharmony_cistruct udev_list_entry *udev_hwdb_get_properties_list_entry(struct udev_hwdb *hwdb, const char *modalias, unsigned int flags);
19599ca880aSopenharmony_ci
19699ca880aSopenharmony_ci/*
19799ca880aSopenharmony_ci * udev_util
19899ca880aSopenharmony_ci *
19999ca880aSopenharmony_ci * udev specific utilities
20099ca880aSopenharmony_ci */
20199ca880aSopenharmony_ciint udev_util_encode_string(const char *str, char *str_enc, size_t len);
20299ca880aSopenharmony_ci
20399ca880aSopenharmony_ci
20499ca880aSopenharmony_ci#ifdef __cplusplus
20599ca880aSopenharmony_ci} /* extern "C" */
20699ca880aSopenharmony_ci#endif
207