]>
git.proxmox.com Git - systemd.git/blob - src/libudev/libudev-device.c
2 This file is part of systemd.
4 Copyright 2008-2012 Kay Sievers <kay@vrfy.org>
5 Copyright 2015 Tom Gundersen <teg@jklm.no>
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
33 #include <sys/ioctl.h>
34 #include <sys/socket.h>
35 #include <linux/sockios.h>
37 #include "sd-device.h"
38 #include "device-util.h"
39 #include "device-private.h"
42 #include "libudev-private.h"
43 #include "libudev-device-internal.h"
46 * SECTION:libudev-device
47 * @short_description: kernel sys devices
49 * Representation of kernel sys devices. Devices are uniquely identified
50 * by their syspath, every device has exactly one path in the kernel sys
51 * filesystem. Devices usually belong to a kernel subsystem, and have
52 * a unique name inside that subsystem.
56 * udev_device_get_seqnum:
57 * @udev_device: udev device
59 * This is only valid if the device was received through a monitor. Devices read from
60 * sys do not have a sequence number.
62 * Returns: the kernel event sequence number, or 0 if there is no sequence number available.
64 _public_
unsigned long long int udev_device_get_seqnum(struct udev_device
*udev_device
)
67 unsigned long long ret
;
70 assert_return_errno(udev_device
, 0, EINVAL
);
72 r
= sd_device_get_property_value(udev_device
->device
, "SEQNUM", &seqnum
);
80 r
= safe_atollu(seqnum
, &ret
);
90 * udev_device_get_devnum:
91 * @udev_device: udev device
93 * Get the device major/minor number.
95 * Returns: the dev_t number.
97 _public_ dev_t
udev_device_get_devnum(struct udev_device
*udev_device
)
102 assert_return_errno(udev_device
, makedev(0, 0), EINVAL
);
104 r
= sd_device_get_devnum(udev_device
->device
, &devnum
);
107 return makedev(0, 0);
114 * udev_device_get_driver:
115 * @udev_device: udev device
117 * Get the kernel driver name.
119 * Returns: the driver name string, or #NULL if there is no driver attached.
121 _public_
const char *udev_device_get_driver(struct udev_device
*udev_device
)
126 assert_return_errno(udev_device
, NULL
, EINVAL
);
128 r
= sd_device_get_driver(udev_device
->device
, &driver
);
138 * udev_device_get_devtype:
139 * @udev_device: udev device
141 * Retrieve the devtype string of the udev device.
143 * Returns: the devtype name of the udev device, or #NULL if it can not be determined
145 _public_
const char *udev_device_get_devtype(struct udev_device
*udev_device
)
150 assert_return_errno(udev_device
, NULL
, EINVAL
);
152 r
= sd_device_get_devtype(udev_device
->device
, &devtype
);
162 * udev_device_get_subsystem:
163 * @udev_device: udev device
165 * Retrieve the subsystem string of the udev device. The string does not
168 * Returns: the subsystem name of the udev device, or #NULL if it can not be determined
170 _public_
const char *udev_device_get_subsystem(struct udev_device
*udev_device
)
172 const char *subsystem
;
175 assert_return_errno(udev_device
, NULL
, EINVAL
);
177 r
= sd_device_get_subsystem(udev_device
->device
, &subsystem
);
187 * udev_device_get_property_value:
188 * @udev_device: udev device
189 * @key: property name
191 * Get the value of a given property.
193 * Returns: the property string, or #NULL if there is no such property.
195 _public_
const char *udev_device_get_property_value(struct udev_device
*udev_device
, const char *key
)
197 const char *value
= NULL
;
200 assert_return_errno(udev_device
&& key
, NULL
, EINVAL
);
202 r
= sd_device_get_property_value(udev_device
->device
, key
, &value
);
211 struct udev_device
*udev_device_new(struct udev
*udev
) {
212 struct udev_device
*udev_device
;
214 assert_return_errno(udev
, NULL
, EINVAL
);
216 udev_device
= new0(struct udev_device
, 1);
221 udev_device
->refcount
= 1;
222 udev_device
->udev
= udev
;
223 udev_list_init(udev
, &udev_device
->properties
, true);
224 udev_list_init(udev
, &udev_device
->tags
, true);
225 udev_list_init(udev
, &udev_device
->sysattrs
, true);
226 udev_list_init(udev
, &udev_device
->devlinks
, true);
232 * udev_device_new_from_syspath:
233 * @udev: udev library context
234 * @syspath: sys device path including sys directory
236 * Create new udev device, and fill in information from the sys
237 * device and the udev database entry. The syspath is the absolute
238 * path to the device, including the sys mount point.
240 * The initial refcount is 1, and needs to be decremented to
241 * release the resources of the udev device.
243 * Returns: a new udev device, or #NULL, if it does not exist
245 _public_
struct udev_device
*udev_device_new_from_syspath(struct udev
*udev
, const char *syspath
) {
246 struct udev_device
*udev_device
;
249 udev_device
= udev_device_new(udev
);
253 r
= sd_device_new_from_syspath(&udev_device
->device
, syspath
);
256 udev_device_unref(udev_device
);
264 * udev_device_new_from_devnum:
265 * @udev: udev library context
266 * @type: char or block device
267 * @devnum: device major/minor number
269 * Create new udev device, and fill in information from the sys
270 * device and the udev database entry. The device is looked-up
271 * by its major/minor number and type. Character and block device
272 * numbers are not unique across the two types.
274 * The initial refcount is 1, and needs to be decremented to
275 * release the resources of the udev device.
277 * Returns: a new udev device, or #NULL, if it does not exist
279 _public_
struct udev_device
*udev_device_new_from_devnum(struct udev
*udev
, char type
, dev_t devnum
)
281 struct udev_device
*udev_device
;
284 udev_device
= udev_device_new(udev
);
288 r
= sd_device_new_from_devnum(&udev_device
->device
, type
, devnum
);
291 udev_device_unref(udev_device
);
299 * udev_device_new_from_device_id:
300 * @udev: udev library context
301 * @id: text string identifying a kernel device
303 * Create new udev device, and fill in information from the sys
304 * device and the udev database entry. The device is looked-up
305 * by a special string:
306 * b8:2 - block device major:minor
307 * c128:1 - char device major:minor
308 * n3 - network device ifindex
309 * +sound:card29 - kernel driver core subsystem:device name
311 * The initial refcount is 1, and needs to be decremented to
312 * release the resources of the udev device.
314 * Returns: a new udev device, or #NULL, if it does not exist
316 _public_
struct udev_device
*udev_device_new_from_device_id(struct udev
*udev
, const char *id
)
318 struct udev_device
*udev_device
;
321 udev_device
= udev_device_new(udev
);
325 r
= sd_device_new_from_device_id(&udev_device
->device
, id
);
328 udev_device_unref(udev_device
);
336 * udev_device_new_from_subsystem_sysname:
337 * @udev: udev library context
338 * @subsystem: the subsystem of the device
339 * @sysname: the name of the device
341 * Create new udev device, and fill in information from the sys device
342 * and the udev database entry. The device is looked up by the subsystem
343 * and name string of the device, like "mem" / "zero", or "block" / "sda".
345 * The initial refcount is 1, and needs to be decremented to
346 * release the resources of the udev device.
348 * Returns: a new udev device, or #NULL, if it does not exist
350 _public_
struct udev_device
*udev_device_new_from_subsystem_sysname(struct udev
*udev
, const char *subsystem
, const char *sysname
)
352 struct udev_device
*udev_device
;
355 udev_device
= udev_device_new(udev
);
359 r
= sd_device_new_from_subsystem_sysname(&udev_device
->device
, subsystem
, sysname
);
362 udev_device_unref(udev_device
);
370 * udev_device_new_from_environment
371 * @udev: udev library context
373 * Create new udev device, and fill in information from the
374 * current process environment. This only works reliable if
375 * the process is called from a udev rule. It is usually used
376 * for tools executed from IMPORT= rules.
378 * The initial refcount is 1, and needs to be decremented to
379 * release the resources of the udev device.
381 * Returns: a new udev device, or #NULL, if it does not exist
383 _public_
struct udev_device
*udev_device_new_from_environment(struct udev
*udev
)
385 struct udev_device
*udev_device
;
388 udev_device
= udev_device_new(udev
);
392 r
= device_new_from_strv(&udev_device
->device
, environ
);
395 udev_device_unref(udev_device
);
402 static struct udev_device
*device_new_from_parent(struct udev_device
*child
)
404 struct udev_device
*parent
;
407 assert_return_errno(child
, NULL
, EINVAL
);
409 parent
= udev_device_new(child
->udev
);
413 r
= sd_device_get_parent(child
->device
, &parent
->device
);
416 udev_device_unref(parent
);
420 /* the parent is unref'ed with the child, so take a ref from libudev as well */
421 sd_device_ref(parent
->device
);
427 * udev_device_get_parent:
428 * @udev_device: the device to start searching from
430 * Find the next parent device, and fill in information from the sys
431 * device and the udev database entry.
433 * Returned device is not referenced. It is attached to the child
434 * device, and will be cleaned up when the child device is cleaned up.
436 * It is not necessarily just the upper level directory, empty or not
437 * recognized sys directories are ignored.
439 * It can be called as many times as needed, without caring about
442 * Returns: a new udev device, or #NULL, if it no parent exist.
444 _public_
struct udev_device
*udev_device_get_parent(struct udev_device
*udev_device
)
446 assert_return_errno(udev_device
, NULL
, EINVAL
);
448 if (!udev_device
->parent_set
) {
449 udev_device
->parent_set
= true;
450 udev_device
->parent
= device_new_from_parent(udev_device
);
453 /* TODO: errno will differ here in case parent == NULL */
454 return udev_device
->parent
;
458 * udev_device_get_parent_with_subsystem_devtype:
459 * @udev_device: udev device to start searching from
460 * @subsystem: the subsystem of the device
461 * @devtype: the type (DEVTYPE) of the device
463 * Find the next parent device, with a matching subsystem and devtype
464 * value, and fill in information from the sys device and the udev
467 * If devtype is #NULL, only subsystem is checked, and any devtype will
470 * Returned device is not referenced. It is attached to the child
471 * device, and will be cleaned up when the child device is cleaned up.
473 * It can be called as many times as needed, without caring about
476 * Returns: a new udev device, or #NULL if no matching parent exists.
478 _public_
struct udev_device
*udev_device_get_parent_with_subsystem_devtype(struct udev_device
*udev_device
, const char *subsystem
, const char *devtype
)
483 assert_return_errno(udev_device
, NULL
, EINVAL
);
485 /* this relies on the fact that finding the subdevice of a parent or the
486 parent of a subdevice commute */
488 /* first find the correct sd_device */
489 r
= sd_device_get_parent_with_subsystem_devtype(udev_device
->device
, subsystem
, devtype
, &parent
);
495 /* then walk the chain of udev_device parents until the correspanding
497 while ((udev_device
= udev_device_get_parent(udev_device
))) {
498 if (udev_device
->device
== parent
)
507 * udev_device_get_udev:
508 * @udev_device: udev device
510 * Retrieve the udev library context the device was created with.
512 * Returns: the udev library context
514 _public_
struct udev
*udev_device_get_udev(struct udev_device
*udev_device
)
516 assert_return_errno(udev_device
, NULL
, EINVAL
);
518 return udev_device
->udev
;
523 * @udev_device: udev device
525 * Take a reference of a udev device.
527 * Returns: the passed udev device
529 _public_
struct udev_device
*udev_device_ref(struct udev_device
*udev_device
)
532 udev_device
->refcount
++;
539 * @udev_device: udev device
541 * Drop a reference of a udev device. If the refcount reaches zero,
542 * the resources of the device will be released.
546 _public_
struct udev_device
*udev_device_unref(struct udev_device
*udev_device
)
548 if (udev_device
&& (-- udev_device
->refcount
) == 0) {
549 sd_device_unref(udev_device
->device
);
550 udev_device_unref(udev_device
->parent
);
552 udev_list_cleanup(&udev_device
->properties
);
553 udev_list_cleanup(&udev_device
->sysattrs
);
554 udev_list_cleanup(&udev_device
->tags
);
555 udev_list_cleanup(&udev_device
->devlinks
);
564 * udev_device_get_devpath:
565 * @udev_device: udev device
567 * Retrieve the kernel devpath value of the udev device. The path
568 * does not contain the sys mount point, and starts with a '/'.
570 * Returns: the devpath of the udev device
572 _public_
const char *udev_device_get_devpath(struct udev_device
*udev_device
)
577 assert_return_errno(udev_device
, NULL
, EINVAL
);
579 r
= sd_device_get_devpath(udev_device
->device
, &devpath
);
589 * udev_device_get_syspath:
590 * @udev_device: udev device
592 * Retrieve the sys path of the udev device. The path is an
593 * absolute path and starts with the sys mount point.
595 * Returns: the sys path of the udev device
597 _public_
const char *udev_device_get_syspath(struct udev_device
*udev_device
)
602 assert_return_errno(udev_device
, NULL
, EINVAL
);
604 r
= sd_device_get_syspath(udev_device
->device
, &syspath
);
614 * udev_device_get_sysname:
615 * @udev_device: udev device
617 * Get the kernel device name in /sys.
619 * Returns: the name string of the device device
621 _public_
const char *udev_device_get_sysname(struct udev_device
*udev_device
)
626 assert_return_errno(udev_device
, NULL
, EINVAL
);
628 r
= sd_device_get_sysname(udev_device
->device
, &sysname
);
638 * udev_device_get_sysnum:
639 * @udev_device: udev device
641 * Get the instance number of the device.
643 * Returns: the trailing number string of the device name
645 _public_
const char *udev_device_get_sysnum(struct udev_device
*udev_device
)
650 assert_return_errno(udev_device
, NULL
, EINVAL
);
652 r
= sd_device_get_sysnum(udev_device
->device
, &sysnum
);
662 * udev_device_get_devnode:
663 * @udev_device: udev device
665 * Retrieve the device node file name belonging to the udev device.
666 * The path is an absolute path, and starts with the device directory.
668 * Returns: the device node file name of the udev device, or #NULL if no device node exists
670 _public_
const char *udev_device_get_devnode(struct udev_device
*udev_device
)
675 assert_return_errno(udev_device
, NULL
, EINVAL
);
677 r
= sd_device_get_devname(udev_device
->device
, &devnode
);
687 * udev_device_get_devlinks_list_entry:
688 * @udev_device: udev device
690 * Retrieve the list of device links pointing to the device file of
691 * the udev device. The next list entry can be retrieved with
692 * udev_list_entry_get_next(), which returns #NULL if no more entries exist.
693 * The devlink path can be retrieved from the list entry by
694 * udev_list_entry_get_name(). The path is an absolute path, and starts with
695 * the device directory.
697 * Returns: the first entry of the device node link list
699 _public_
struct udev_list_entry
*udev_device_get_devlinks_list_entry(struct udev_device
*udev_device
)
701 assert_return_errno(udev_device
, NULL
, EINVAL
);
703 if (device_get_devlinks_generation(udev_device
->device
) != udev_device
->devlinks_generation
||
704 !udev_device
->devlinks_read
) {
707 udev_list_cleanup(&udev_device
->devlinks
);
709 FOREACH_DEVICE_DEVLINK(udev_device
->device
, devlink
)
710 udev_list_entry_add(&udev_device
->devlinks
, devlink
, NULL
);
712 udev_device
->devlinks_read
= true;
713 udev_device
->devlinks_generation
= device_get_devlinks_generation(udev_device
->device
);
716 return udev_list_get_entry(&udev_device
->devlinks
);
720 * udev_device_get_event_properties_entry:
721 * @udev_device: udev device
723 * Retrieve the list of key/value device properties of the udev
724 * device. The next list entry can be retrieved with udev_list_entry_get_next(),
725 * which returns #NULL if no more entries exist. The property name
726 * can be retrieved from the list entry by udev_list_entry_get_name(),
727 * the property value by udev_list_entry_get_value().
729 * Returns: the first entry of the property list
731 _public_
struct udev_list_entry
*udev_device_get_properties_list_entry(struct udev_device
*udev_device
)
733 assert_return_errno(udev_device
, NULL
, EINVAL
);
735 if (device_get_properties_generation(udev_device
->device
) != udev_device
->properties_generation
||
736 !udev_device
->properties_read
) {
737 const char *key
, *value
;
739 udev_list_cleanup(&udev_device
->properties
);
741 FOREACH_DEVICE_PROPERTY(udev_device
->device
, key
, value
)
742 udev_list_entry_add(&udev_device
->properties
, key
, value
);
744 udev_device
->properties_read
= true;
745 udev_device
->properties_generation
= device_get_properties_generation(udev_device
->device
);
748 return udev_list_get_entry(&udev_device
->properties
);
752 * udev_device_get_action:
753 * @udev_device: udev device
755 * This is only valid if the device was received through a monitor. Devices read from
756 * sys do not have an action string. Usual actions are: add, remove, change, online,
759 * Returns: the kernel action value, or #NULL if there is no action value available.
761 _public_
const char *udev_device_get_action(struct udev_device
*udev_device
) {
762 const char *action
= NULL
;
765 assert_return_errno(udev_device
, NULL
, EINVAL
);
767 r
= sd_device_get_property_value(udev_device
->device
, "ACTION", &action
);
768 if (r
< 0 && r
!= -ENOENT
) {
777 * udev_device_get_usec_since_initialized:
778 * @udev_device: udev device
780 * Return the number of microseconds passed since udev set up the
781 * device for the first time.
783 * This is only implemented for devices with need to store properties
784 * in the udev database. All other devices return 0 here.
786 * Returns: the number of microseconds since the device was first seen.
788 _public_
unsigned long long int udev_device_get_usec_since_initialized(struct udev_device
*udev_device
)
793 assert_return(udev_device
, -EINVAL
);
795 r
= sd_device_get_usec_since_initialized(udev_device
->device
, &ts
);
805 * udev_device_get_sysattr_value:
806 * @udev_device: udev device
807 * @sysattr: attribute name
809 * The retrieved value is cached in the device. Repeated calls will return the same
810 * value and not open the attribute again.
812 * Returns: the content of a sys attribute file, or #NULL if there is no sys attribute value.
814 _public_
const char *udev_device_get_sysattr_value(struct udev_device
*udev_device
, const char *sysattr
)
819 assert_return_errno(udev_device
, NULL
, EINVAL
);
821 r
= sd_device_get_sysattr_value(udev_device
->device
, sysattr
, &value
);
831 * udev_device_set_sysattr_value:
832 * @udev_device: udev device
833 * @sysattr: attribute name
834 * @value: new value to be set
836 * Update the contents of the sys attribute and the cached value of the device.
838 * Returns: Negative error code on failure or 0 on success.
840 _public_
int udev_device_set_sysattr_value(struct udev_device
*udev_device
, const char *sysattr
, char *value
)
844 assert_return(udev_device
, -EINVAL
);
846 r
= sd_device_set_sysattr_value(udev_device
->device
, sysattr
, value
);
854 * udev_device_get_sysattr_list_entry:
855 * @udev_device: udev device
857 * Retrieve the list of available sysattrs, with value being empty;
858 * This just return all available sysfs attributes for a particular
859 * device without reading their values.
861 * Returns: the first entry of the property list
863 _public_
struct udev_list_entry
*udev_device_get_sysattr_list_entry(struct udev_device
*udev_device
)
865 assert_return_errno(udev_device
, NULL
, EINVAL
);
867 if (!udev_device
->sysattrs_read
) {
870 udev_list_cleanup(&udev_device
->sysattrs
);
872 FOREACH_DEVICE_SYSATTR(udev_device
->device
, sysattr
)
873 udev_list_entry_add(&udev_device
->properties
, sysattr
, NULL
);
875 udev_device
->sysattrs_read
= true;
878 return udev_list_get_entry(&udev_device
->sysattrs
);
882 * udev_device_get_is_initialized:
883 * @udev_device: udev device
885 * Check if udev has already handled the device and has set up
886 * device node permissions and context, or has renamed a network
889 * This is only implemented for devices with a device node
890 * or network interfaces. All other devices return 1 here.
892 * Returns: 1 if the device is set up. 0 otherwise.
894 _public_
int udev_device_get_is_initialized(struct udev_device
*udev_device
)
898 assert_return(udev_device
, -EINVAL
);
900 r
= sd_device_get_is_initialized(udev_device
->device
, &initialized
);
911 * udev_device_get_tags_list_entry:
912 * @udev_device: udev device
914 * Retrieve the list of tags attached to the udev device. The next
915 * list entry can be retrieved with udev_list_entry_get_next(),
916 * which returns #NULL if no more entries exist. The tag string
917 * can be retrieved from the list entry by udev_list_entry_get_name().
919 * Returns: the first entry of the tag list
921 _public_
struct udev_list_entry
*udev_device_get_tags_list_entry(struct udev_device
*udev_device
)
923 assert_return_errno(udev_device
, NULL
, EINVAL
);
925 if (device_get_tags_generation(udev_device
->device
) != udev_device
->tags_generation
||
926 !udev_device
->tags_read
) {
929 udev_list_cleanup(&udev_device
->tags
);
931 FOREACH_DEVICE_TAG(udev_device
->device
, tag
)
932 udev_list_entry_add(&udev_device
->tags
, tag
, NULL
);
934 udev_device
->tags_read
= true;
935 udev_device
->tags_generation
= device_get_tags_generation(udev_device
->device
);
938 return udev_list_get_entry(&udev_device
->tags
);
942 * udev_device_has_tag:
943 * @udev_device: udev device
946 * Check if a given device has a certain tag associated.
948 * Returns: 1 if the tag is found. 0 otherwise.
950 _public_
int udev_device_has_tag(struct udev_device
*udev_device
, const char *tag
)
952 assert_return(udev_device
, 0);
954 return sd_device_has_tag(udev_device
->device
, tag
);