install: don't enforce that .d/ dropin files (and their symlink chain elements) for...
authorLennart Poettering <lennart@poettering.net>
Wed, 28 Mar 2018 14:44:19 +0000 (16:44 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 29 Mar 2018 13:45:02 +0000 (15:45 +0200)
commitd04a93864dec3f7cd80018994be03dc82b30a474
tree69bad694d9acda5428b369fb4478fec0790d4c16
parent244d2f07b49e3470d679fdd0f6ebd24fac8d5dc7
install: don't enforce that .d/ dropin files (and their symlink chain elements) for units must have names that qualify as unit names

The names of drop-in files can be anything as long as they are suffixed
in ".conf", hence don't be stricter than necessary when validating the
names used in symlink chains of such drop-in files.

Also, drop-in files should not be ale to change the type of unit file
itself, i.e. not affect whether it is considered masked or an alias as a
whole.

This adds a flag SEARCH_DROPIN that is passed whenever we load a drop-in
rather the main unit file, and in that case loosen checks and behaviour
we otherwise enforce for the unit file itself. Specifically:

1. If SEARCH_DROPIN is passed we won't change the unit's info->type
   field anymore, as that field (which can be REGULAR, MASKED, SYMLINK)
   should not be affected by drop-ins, but only by the unit file itself.

2. If SEARCH_DROPIN is passed we will shortcut following of symlink
   chains, and not validate the naming of each element in the chain,
   since that's irrelevant for drop-ins, and only matters for the unit
   file itself.

Or in other words, without this:

1. A symlink /etc/systemd/system/foobar.service.d/20-quux.conf →
   /dev/null might have caused the whole of foobar.service to be
   considered "masked".

2. A symlink /etc/systemd/system/foobar.service.d/20-quux.conf →
   /tmp/miepf might have caused the whole loading of foobar.service to
   fail as EINVAL, as "miepf" is not a valid unit name.
src/shared/install.c