]> git.ipfire.org Git - thirdparty/systemd.git/commit - src/core/dbus-manager.c
install: follow unit file symlinks in /usr, but not /etc when looking for [Install...
authorLennart Poettering <lennart@poettering.net>
Thu, 8 Oct 2015 20:31:56 +0000 (22:31 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 12 Nov 2015 16:57:04 +0000 (17:57 +0100)
commit0ec0deaa30d0e68430f03fa6f32affa576481d18
treeecfd89525b710466dc7785dfc877645bc1f12540
parentd073dea0a89c271fc4a769d5b3b2db395aa0239a
install: follow unit file symlinks in /usr, but not /etc when looking for [Install] data

Some distributions use alias unit files via symlinks in /usr to cover
for legacy service names. With this change we'll allow "systemctl
enable" on such aliases.

Previously, our rule was that symlinks are user configuration that
"systemctl enable" + "systemctl disable" creates and removes, while unit
files is where the instructions to do so are store. As a result of the
rule we'd never read install information through symlinks, since that
would mix enablement state with installation instructions.

Now, the new rule is that only symlinks inside of /etc are
configuration. Unit files, and symlinks in /usr are now valid for
installation instructions.

This patch is quite a rework of the whole install logic, and makes the
following addional changes:

- Adds a complete test "test-instal-root" that tests the install logic
  pretty comprehensively.

- Never uses canonicalize_file_name(), because that's incompatible with
  operation relative to a specific root directory.

- unit_file_get_state() is reworked to return a proper error, and
  returns the state in a call-by-ref parameter. This cleans up confusion
  between the enum type and errno-like errors.

- The new logic puts a limit on how long to follow unit file symlinks:
  it will do so only for 64 steps at max.

- The InstallContext object's fields are renamed to will_process and
  has_processed (will_install and has_installed) since they are also
  used for deinstallation and all kinds of other operations.

- The root directory is always verified before use.

- install.c is reordered to place the exported functions together.

- Stricter rules are followed when traversing symlinks: the unit suffix
  must say identical, and it's not allowed to link between regular units
  and templated units.

- Various modernizations

- The "invalid" unit file state has been renamed to "bad", in order to
  avoid confusion between UNIT_FILE_INVALID and
  _UNIT_FILE_STATE_INVALID. Given that the state should normally not be
  seen and is not documented this should not be a problematic change.
  The new name is now documented however.

Fixes #1375, #1718, #1706
12 files changed:
Makefile.am
man/systemctl.xml
src/basic/fs-util.c
src/basic/fs-util.h
src/core/dbus-manager.c
src/core/unit.c
src/shared/install.c
src/shared/install.h
src/systemctl/systemctl.c
src/sysv-generator/sysv-generator.c
src/test/test-install-root.c [new file with mode: 0644]
src/test/test-install.c