2 This file is part of systemd.
4 Copyright 2008-2012 Kay Sievers <kay@vrfy.org>
5 Copyright 2014-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/>.
26 #include "sd-device.h"
28 #include "device-util.h"
29 #include "device-enumerator-private.h"
31 #define DEVICE_ENUMERATE_MAX_DEPTH 256
33 typedef enum DeviceEnumerationType
{
34 DEVICE_ENUMERATION_TYPE_DEVICES
,
35 DEVICE_ENUMERATION_TYPE_SUBSYSTEMS
,
36 _DEVICE_ENUMERATION_TYPE_MAX
,
37 _DEVICE_ENUMERATION_TYPE_INVALID
= -1,
38 } DeviceEnumerationType
;
40 struct sd_device_enumerator
{
43 DeviceEnumerationType type
;
48 Set
*nomatch_subsystem
;
49 Hashmap
*match_sysattr
;
50 Hashmap
*nomatch_sysattr
;
51 Hashmap
*match_property
;
54 sd_device
*match_parent
;
55 bool match_allow_uninitialized
;
58 _public_
int sd_device_enumerator_new(sd_device_enumerator
**ret
) {
59 _cleanup_device_enumerator_unref_ sd_device_enumerator
*enumerator
= NULL
;
63 enumerator
= new0(sd_device_enumerator
, 1);
67 enumerator
->n_ref
= 1;
68 enumerator
->type
= _DEVICE_ENUMERATION_TYPE_INVALID
;
76 _public_ sd_device_enumerator
*sd_device_enumerator_ref(sd_device_enumerator
*enumerator
) {
77 assert_return(enumerator
, NULL
);
79 assert_se((++ enumerator
->n_ref
) >= 2);
84 _public_ sd_device_enumerator
*sd_device_enumerator_unref(sd_device_enumerator
*enumerator
) {
85 if (enumerator
&& (-- enumerator
->n_ref
) == 0) {
88 while ((device
= prioq_pop(enumerator
->devices
)))
89 sd_device_unref(device
);
91 prioq_free(enumerator
->devices
);
93 set_free_free(enumerator
->match_subsystem
);
94 set_free_free(enumerator
->nomatch_subsystem
);
95 hashmap_free_free_free(enumerator
->match_sysattr
);
96 hashmap_free_free_free(enumerator
->nomatch_sysattr
);
97 hashmap_free_free_free(enumerator
->match_property
);
98 set_free_free(enumerator
->match_sysname
);
99 set_free_free(enumerator
->match_tag
);
100 sd_device_unref(enumerator
->match_parent
);
108 _public_
int sd_device_enumerator_add_match_subsystem(sd_device_enumerator
*enumerator
, const char *subsystem
, int match
) {
112 assert_return(enumerator
, -EINVAL
);
113 assert_return(subsystem
, -EINVAL
);
116 set
= &enumerator
->match_subsystem
;
118 set
= &enumerator
->nomatch_subsystem
;
120 r
= set_ensure_allocated(set
, NULL
);
124 r
= set_put_strdup(*set
, subsystem
);
128 enumerator
->scan_uptodate
= false;
133 _public_
int sd_device_enumerator_add_match_sysattr(sd_device_enumerator
*enumerator
, const char *_sysattr
, const char *_value
, int match
) {
134 _cleanup_free_
char *sysattr
= NULL
, *value
= NULL
;
138 assert_return(enumerator
, -EINVAL
);
139 assert_return(_sysattr
, -EINVAL
);
140 assert_return(_value
, -EINVAL
);
143 hashmap
= &enumerator
->match_sysattr
;
145 hashmap
= &enumerator
->nomatch_sysattr
;
147 r
= hashmap_ensure_allocated(hashmap
, NULL
);
151 sysattr
= strdup(_sysattr
);
155 value
= strdup(_value
);
159 r
= hashmap_put(*hashmap
, sysattr
, value
);
166 enumerator
->scan_uptodate
= false;
171 _public_
int sd_device_enumerator_add_match_property(sd_device_enumerator
*enumerator
, const char *_property
, const char *_value
) {
172 _cleanup_free_
char *property
= NULL
, *value
= NULL
;
175 assert_return(enumerator
, -EINVAL
);
176 assert_return(_property
, -EINVAL
);
177 assert_return(_value
, -EINVAL
);
179 r
= hashmap_ensure_allocated(&enumerator
->match_property
, NULL
);
183 property
= strdup(_property
);
187 value
= strdup(_value
);
191 r
= hashmap_put(enumerator
->match_property
, property
, value
);
198 enumerator
->scan_uptodate
= false;
203 _public_
int sd_device_enumerator_add_match_sysname(sd_device_enumerator
*enumerator
, const char *sysname
) {
206 assert_return(enumerator
, -EINVAL
);
207 assert_return(sysname
, -EINVAL
);
209 r
= set_ensure_allocated(&enumerator
->match_sysname
, NULL
);
213 r
= set_put_strdup(enumerator
->match_sysname
, sysname
);
217 enumerator
->scan_uptodate
= false;
222 _public_
int sd_device_enumerator_add_match_tag(sd_device_enumerator
*enumerator
, const char *tag
) {
225 assert_return(enumerator
, -EINVAL
);
226 assert_return(tag
, -EINVAL
);
228 r
= set_ensure_allocated(&enumerator
->match_tag
, NULL
);
232 r
= set_put_strdup(enumerator
->match_tag
, tag
);
236 enumerator
->scan_uptodate
= false;
241 _public_
int sd_device_enumerator_add_match_parent(sd_device_enumerator
*enumerator
, sd_device
*parent
) {
242 assert_return(enumerator
, -EINVAL
);
243 assert_return(parent
, -EINVAL
);
245 sd_device_unref(enumerator
->match_parent
);
246 enumerator
->match_parent
= sd_device_ref(parent
);
248 enumerator
->scan_uptodate
= false;
253 _public_
int sd_device_enumerator_allow_uninitialized(sd_device_enumerator
*enumerator
) {
254 assert_return(enumerator
, -EINVAL
);
256 enumerator
->match_allow_uninitialized
= true;
258 enumerator
->scan_uptodate
= false;
263 int device_enumerator_add_match_is_initialized(sd_device_enumerator
*enumerator
) {
264 assert_return(enumerator
, -EINVAL
);
266 enumerator
->match_allow_uninitialized
= false;
268 enumerator
->scan_uptodate
= false;
273 static int device_compare(const void *_a
, const void *_b
) {
274 sd_device
*a
= (sd_device
*)_a
, *b
= (sd_device
*)_b
;
275 const char *devpath_a
, *devpath_b
, *sound_a
;
276 bool delay_a
, delay_b
;
278 assert_se(sd_device_get_devpath(a
, &devpath_a
) >= 0);
279 assert_se(sd_device_get_devpath(b
, &devpath_b
) >= 0);
281 sound_a
= strstr(devpath_a
, "/sound/card");
283 /* For sound cards the control device must be enumerated last to
284 * make sure it's the final device node that gets ACLs applied.
285 * Applications rely on this fact and use ACL changes on the
286 * control node as an indicator that the ACL change of the
287 * entire sound card completed. The kernel makes this guarantee
288 * when creating those devices, and hence we should too when
289 * enumerating them. */
290 sound_a
+= strlen("/sound/card");
291 sound_a
= strchr(sound_a
, '/');
296 prefix_len
= sound_a
- devpath_a
;
298 if (strncmp(devpath_a
, devpath_b
, prefix_len
) == 0) {
301 sound_b
= devpath_b
+ prefix_len
;
303 if (startswith(sound_a
, "/controlC") &&
304 !startswith(sound_b
, "/contolC"))
307 if (!startswith(sound_a
, "/controlC") &&
308 startswith(sound_b
, "/controlC"))
314 /* md and dm devices are enumerated after all other devices */
315 delay_a
= strstr(devpath_a
, "/block/md") || strstr(devpath_a
, "/block/dm-");
316 delay_b
= strstr(devpath_b
, "/block/md") || strstr(devpath_b
, "/block/dm-");
317 if (delay_a
!= delay_b
)
318 return delay_a
- delay_b
;
320 return strcmp(devpath_a
, devpath_b
);
323 int device_enumerator_add_device(sd_device_enumerator
*enumerator
, sd_device
*device
) {
326 assert_return(enumerator
, -EINVAL
);
327 assert_return(device
, -EINVAL
);
329 r
= prioq_ensure_allocated(&enumerator
->devices
, device_compare
);
333 r
= prioq_put(enumerator
->devices
, device
, NULL
);
337 sd_device_ref(device
);
342 static bool match_sysattr_value(sd_device
*device
, const char *sysattr
, const char *match_value
) {
349 r
= sd_device_get_sysattr_value(device
, sysattr
, &value
);
356 if (fnmatch(match_value
, value
, 0) == 0)
362 static bool match_sysattr(sd_device_enumerator
*enumerator
, sd_device
*device
) {
370 HASHMAP_FOREACH_KEY(value
, sysattr
, enumerator
->nomatch_sysattr
, i
)
371 if (match_sysattr_value(device
, sysattr
, value
))
374 HASHMAP_FOREACH_KEY(value
, sysattr
, enumerator
->match_sysattr
, i
)
375 if (!match_sysattr_value(device
, sysattr
, value
))
381 static bool match_property(sd_device_enumerator
*enumerator
, sd_device
*device
) {
382 const char *property
;
389 if (hashmap_isempty(enumerator
->match_property
))
392 HASHMAP_FOREACH_KEY(value
, property
, enumerator
->match_property
, i
) {
393 const char *property_dev
, *value_dev
;
395 FOREACH_DEVICE_PROPERTY(device
, property_dev
, value_dev
) {
396 if (fnmatch(property
, property_dev
, 0) != 0)
399 if (!value
&& !value_dev
)
402 if (!value
|| !value_dev
)
405 if (fnmatch(value
, value_dev
, 0) == 0)
413 static bool match_tag(sd_device_enumerator
*enumerator
, sd_device
*device
) {
420 SET_FOREACH(tag
, enumerator
->match_tag
, i
)
421 if (!sd_device_has_tag(device
, tag
))
427 static bool match_parent(sd_device_enumerator
*enumerator
, sd_device
*device
) {
428 const char *devpath
, *devpath_dev
;
434 if (!enumerator
->match_parent
)
437 r
= sd_device_get_devpath(enumerator
->match_parent
, &devpath
);
440 r
= sd_device_get_devpath(device
, &devpath_dev
);
443 return startswith(devpath_dev
, devpath
);
446 static bool match_sysname(sd_device_enumerator
*enumerator
, const char *sysname
) {
447 const char *sysname_match
;
453 if (set_isempty(enumerator
->match_sysname
))
456 SET_FOREACH(sysname_match
, enumerator
->match_sysname
, i
)
457 if (fnmatch(sysname_match
, sysname
, 0) == 0)
463 static int enumerator_scan_dir_and_add_devices(sd_device_enumerator
*enumerator
, const char *basedir
, const char *subdir1
, const char *subdir2
) {
464 _cleanup_closedir_
DIR *dir
= NULL
;
472 path
= strjoina("/sys/", basedir
, "/");
475 path
= strjoina(path
, subdir1
, "/");
478 path
= strjoina(path
, subdir2
, "/");
484 FOREACH_DIRENT_ALL(dent
, dir
, return -errno
) {
485 _cleanup_device_unref_ sd_device
*device
= NULL
;
486 char syspath
[strlen(path
) + 1 + strlen(dent
->d_name
) + 1];
488 int ifindex
, initialized
, k
;
490 if (dent
->d_name
[0] == '.')
493 if (!match_sysname(enumerator
, dent
->d_name
))
496 (void)sprintf(syspath
, "%s%s", path
, dent
->d_name
);
498 k
= sd_device_new_from_syspath(&device
, syspath
);
501 /* this is necessarily racey, so ignore missing devices */
507 k
= sd_device_get_devnum(device
, &devnum
);
513 k
= sd_device_get_ifindex(device
, &ifindex
);
519 k
= sd_device_get_is_initialized(device
, &initialized
);
526 * All devices with a device node or network interfaces
527 * possibly need udev to adjust the device node permission
528 * or context, or rename the interface before it can be
529 * reliably used from other processes.
531 * For now, we can only check these types of devices, we
532 * might not store a database, and have no way to find out
533 * for all other types of devices.
535 if (!enumerator
->match_allow_uninitialized
&&
537 (major(devnum
) > 0 || ifindex
> 0))
540 if (!match_parent(enumerator
, device
))
543 if (!match_tag(enumerator
, device
))
546 if (!match_property(enumerator
, device
))
549 if (!match_sysattr(enumerator
, device
))
552 k
= device_enumerator_add_device(enumerator
, device
);
560 static bool match_subsystem(sd_device_enumerator
*enumerator
, const char *subsystem
) {
561 const char *subsystem_match
;
569 SET_FOREACH(subsystem_match
, enumerator
->nomatch_subsystem
, i
)
570 if (fnmatch(subsystem_match
, subsystem
, 0) == 0)
573 if (set_isempty(enumerator
->match_subsystem
))
576 SET_FOREACH(subsystem_match
, enumerator
->match_subsystem
, i
)
577 if (fnmatch(subsystem_match
, subsystem
, 0) == 0)
583 static int enumerator_scan_dir(sd_device_enumerator
*enumerator
, const char *basedir
, const char *subdir
, const char *subsystem
) {
584 _cleanup_closedir_
DIR *dir
= NULL
;
589 path
= strjoina("/sys/", basedir
);
595 log_debug(" device-enumerator: scanning %s", path
);
597 FOREACH_DIRENT_ALL(dent
, dir
, return -errno
) {
600 if (dent
->d_name
[0] == '.')
603 if (!match_subsystem(enumerator
, subsystem
? : dent
->d_name
))
606 k
= enumerator_scan_dir_and_add_devices(enumerator
, basedir
, dent
->d_name
, subdir
);
614 static int enumerator_scan_devices_tag(sd_device_enumerator
*enumerator
, const char *tag
) {
615 _cleanup_closedir_
DIR *dir
= NULL
;
623 path
= strjoina("/run/udev/tags/", tag
);
630 log_error("sd-device-enumerator: could not open tags directory %s: %m", path
);
635 /* TODO: filter away subsystems? */
637 FOREACH_DIRENT_ALL(dent
, dir
, return -errno
) {
638 _cleanup_device_unref_ sd_device
*device
= NULL
;
639 const char *subsystem
, *sysname
;
642 if (dent
->d_name
[0] == '.')
645 k
= sd_device_new_from_device_id(&device
, dent
->d_name
);
648 /* this is necessarily racy, so ignore missing devices */
654 k
= sd_device_get_subsystem(device
, &subsystem
);
660 if (!match_subsystem(enumerator
, subsystem
))
663 k
= sd_device_get_sysname(device
, &sysname
);
669 if (!match_sysname(enumerator
, sysname
))
672 if (!match_parent(enumerator
, device
))
675 if (!match_property(enumerator
, device
))
678 if (!match_sysattr(enumerator
, device
))
681 k
= device_enumerator_add_device(enumerator
, device
);
691 static int enumerator_scan_devices_tags(sd_device_enumerator
*enumerator
) {
698 SET_FOREACH(tag
, enumerator
->match_tag
, i
) {
699 r
= enumerator_scan_devices_tag(enumerator
, tag
);
707 static int parent_add_child(sd_device_enumerator
*enumerator
, const char *path
) {
708 _cleanup_device_unref_ sd_device
*device
= NULL
;
709 const char *subsystem
, *sysname
;
712 r
= sd_device_new_from_syspath(&device
, path
);
714 /* this is necessarily racy, so ignore missing devices */
719 r
= sd_device_get_subsystem(device
, &subsystem
);
723 if (!match_subsystem(enumerator
, subsystem
))
726 r
= sd_device_get_sysname(device
, &sysname
);
730 if (!match_sysname(enumerator
, sysname
))
733 if (!match_property(enumerator
, device
))
736 if (!match_sysattr(enumerator
, device
))
739 r
= device_enumerator_add_device(enumerator
, device
);
746 static int parent_crawl_children(sd_device_enumerator
*enumerator
, const char *path
, unsigned maxdepth
) {
747 _cleanup_closedir_
DIR *dir
= NULL
;
753 log_debug("sd-device-enumerate: could not open parent directory %s: %m", path
);
757 FOREACH_DIRENT_ALL(dent
, dir
, return -errno
) {
758 _cleanup_free_
char *child
= NULL
;
761 if (dent
->d_name
[0] == '.')
764 if (dent
->d_type
!= DT_DIR
)
767 child
= strjoin(path
, "/", dent
->d_name
, NULL
);
771 k
= parent_add_child(enumerator
, child
);
776 parent_crawl_children(enumerator
, child
, maxdepth
- 1);
778 log_debug("device-enumerate: max depth reached, %s: ignoring devices", child
);
784 static int enumerator_scan_devices_children(sd_device_enumerator
*enumerator
) {
788 r
= sd_device_get_syspath(enumerator
->match_parent
, &path
);
792 k
= parent_add_child(enumerator
, path
);
796 k
= parent_crawl_children(enumerator
, path
, DEVICE_ENUMERATE_MAX_DEPTH
);
803 static int enumerator_scan_devices_all(sd_device_enumerator
*enumerator
) {
806 log_debug("device-enumerator: scan all dirs");
808 if (access("/sys/subsystem", F_OK
) >= 0) {
809 /* we have /subsystem/, forget all the old stuff */
810 r
= enumerator_scan_dir(enumerator
, "subsystem", "devices", NULL
);
812 log_debug("device-enumerator: failed to scan /sys/subsystem: %s", strerror(-r
));
818 k
= enumerator_scan_dir(enumerator
, "bus", "devices", NULL
);
820 log_debug_errno(k
, "device-enumerator: failed to scan /sys/bus: %m");
824 k
= enumerator_scan_dir(enumerator
, "class", NULL
, NULL
);
826 log_debug_errno(k
, "device-enumerator: failed to scan /sys/class: %m");
834 int device_enumerator_scan_devices(sd_device_enumerator
*enumerator
) {
840 if (enumerator
->scan_uptodate
&&
841 enumerator
->type
== DEVICE_ENUMERATION_TYPE_DEVICES
)
844 while ((device
= prioq_pop(enumerator
->devices
)))
845 sd_device_unref(device
);
847 if (!set_isempty(enumerator
->match_tag
)) {
848 r
= enumerator_scan_devices_tags(enumerator
);
851 } else if (enumerator
->match_parent
) {
852 r
= enumerator_scan_devices_children(enumerator
);
856 r
= enumerator_scan_devices_all(enumerator
);
861 enumerator
->scan_uptodate
= true;
866 _public_ sd_device
*sd_device_enumerator_get_device_first(sd_device_enumerator
*enumerator
) {
869 assert_return(enumerator
, NULL
);
871 r
= device_enumerator_scan_devices(enumerator
);
875 enumerator
->type
= DEVICE_ENUMERATION_TYPE_DEVICES
;
877 return prioq_peek(enumerator
->devices
);
880 _public_ sd_device
*sd_device_enumerator_get_device_next(sd_device_enumerator
*enumerator
) {
881 assert_return(enumerator
, NULL
);
883 if (!enumerator
->scan_uptodate
||
884 enumerator
->type
!= DEVICE_ENUMERATION_TYPE_DEVICES
)
887 sd_device_unref(prioq_pop(enumerator
->devices
));
889 return prioq_peek(enumerator
->devices
);
892 int device_enumerator_scan_subsystems(sd_device_enumerator
*enumerator
) {
894 const char *subsysdir
;
899 if (enumerator
->scan_uptodate
&&
900 enumerator
->type
== DEVICE_ENUMERATION_TYPE_SUBSYSTEMS
)
903 while ((device
= prioq_pop(enumerator
->devices
)))
904 sd_device_unref(device
);
907 if (match_subsystem(enumerator
, "module")) {
908 k
= enumerator_scan_dir_and_add_devices(enumerator
, "module", NULL
, NULL
);
910 log_debug_errno(k
, "device-enumerator: failed to scan modules: %m");
915 if (access("/sys/subsystem", F_OK
) >= 0)
916 subsysdir
= "subsystem";
920 /* subsystems (only buses support coldplug) */
921 if (match_subsystem(enumerator
, "subsystem")) {
922 k
= enumerator_scan_dir_and_add_devices(enumerator
, subsysdir
, NULL
, NULL
);
924 log_debug_errno(k
, "device-enumerator: failed to scan subsystems: %m");
929 /* subsystem drivers */
930 if (match_subsystem(enumerator
, "drivers")) {
931 k
= enumerator_scan_dir(enumerator
, subsysdir
, "drivers", "drivers");
933 log_debug_errno(k
, "device-enumerator: failed to scan drivers: %m");
938 enumerator
->scan_uptodate
= true;
943 _public_ sd_device
*sd_device_enumerator_get_subsystem_first(sd_device_enumerator
*enumerator
) {
946 assert_return(enumerator
, NULL
);
948 r
= device_enumerator_scan_subsystems(enumerator
);
952 enumerator
->type
= DEVICE_ENUMERATION_TYPE_SUBSYSTEMS
;
954 return prioq_peek(enumerator
->devices
);
957 _public_ sd_device
*sd_device_enumerator_get_subsystem_next(sd_device_enumerator
*enumerator
) {
958 assert_return(enumerator
, NULL
);
960 if (enumerator
->scan_uptodate
||
961 enumerator
->type
!= DEVICE_ENUMERATION_TYPE_SUBSYSTEMS
)
964 sd_device_unref(prioq_pop(enumerator
->devices
));
966 return prioq_peek(enumerator
->devices
);
969 sd_device
*device_enumerator_get_first(sd_device_enumerator
*enumerator
) {
970 assert_return(enumerator
, NULL
);
972 return prioq_peek(enumerator
->devices
);
975 sd_device
*device_enumerator_get_next(sd_device_enumerator
*enumerator
) {
976 assert_return(enumerator
, NULL
);
978 sd_device_unref(prioq_pop(enumerator
->devices
));
980 return prioq_peek(enumerator
->devices
);