diff --git a/src/shared/dropin.c b/src/shared/dropin.c index 96cd08aab2..6844c2b647 100644 --- a/src/shared/dropin.c +++ b/src/shared/dropin.c @@ -236,6 +236,10 @@ int unit_file_find_dropin_paths( assert(ret); + SET_FOREACH(name, names, i) + STRV_FOREACH(p, lookup_path) + (void) unit_file_find_dirs(original_root, unit_path_cache, *p, name, dir_suffix, &dirs); + /* All the names in the unit are of the same type so just grab one. */ name = (char*) set_first(names); if (name) { @@ -247,7 +251,7 @@ int unit_file_find_dropin_paths( "Failed to to derive unit type from unit name: %s", name); - /* Special top level drop in for ".". Add this first as it's the most generic + /* Special top level drop in for ".". Add this last as it's the most generic * and should be able to be overridden by more specific drop-ins. */ STRV_FOREACH(p, lookup_path) (void) unit_file_find_dirs(original_root, @@ -258,10 +262,6 @@ int unit_file_find_dropin_paths( &dirs); } - SET_FOREACH(name, names, i) - STRV_FOREACH(p, lookup_path) - (void) unit_file_find_dirs(original_root, unit_path_cache, *p, name, dir_suffix, &dirs); - if (strv_isempty(dirs)) { *ret = NULL; return 0; diff --git a/test/TEST-15-DROPIN/test-dropin.sh b/test/TEST-15-DROPIN/test-dropin.sh index fd500c1a0b..f80c9df107 100755 --- a/test/TEST-15-DROPIN/test-dropin.sh +++ b/test/TEST-15-DROPIN/test-dropin.sh @@ -117,6 +117,30 @@ EOF clear_services a b c } +test_hierarchical_dropins () { + echo "Testing hierarchical dropins..." + echo "*** test service.d/ top level drop-in" + create_services a-b-c + check_ko a-b-c ExecCondition "/bin/echo service.d" + check_ko a-b-c ExecCondition "/bin/echo a-.service.d" + check_ko a-b-c ExecCondition "/bin/echo a-b-.service.d" + check_ko a-b-c ExecCondition "/bin/echo a-b-c.service.d" + + for dropin in service.d a-.service.d a-b-.service.d a-b-c.service.d; do + mkdir -p /usr/lib/systemd/system/$dropin + echo " +[Service] +ExecCondition=/bin/echo $dropin + " > /usr/lib/systemd/system/$dropin/override.conf + check_ok a-b-c ExecCondition "/bin/echo $dropin" + done + for dropin in service.d a-.service.d a-b-.service.d a-b-c.service.d; do + rm -rf /usr/lib/systemd/system/$dropin + done + + clear_services a-b-c +} + test_template_dropins () { echo "Testing template dropins..." @@ -433,6 +457,7 @@ test_invalid_dropins () { } test_basic_dropins +test_hierarchical_dropins test_template_dropins test_alias_dropins test_masked_dropins