summaryrefslogtreecommitdiff
path: root/src/shared/install.h
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-04-17 10:16:44 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-04-19 08:58:00 -0400
commitaf3d811352094f3f1304bdf8ba9cdd2b4b03b55c (patch)
treeed4ded67db03941683d54251bfa6805280128e7c /src/shared/install.h
parent795ff6d5d827eb5743d9e37c4acaee4bdeff58b4 (diff)
shared/install,systemctl,core: report offending file on installation error
Fixes #2191: $ systemctl --root=/ enable sddm Created symlink /etc/systemd/system/display-manager.service, pointing to /usr/lib/systemd/system/sddm.service. $ sudo build/systemctl --root=/ enable gdm Failed to enable unit, file /etc/systemd/system/display-manager.service already exists and is a symlink to /usr/lib/systemd/system/sddm.service. $ sudo build/systemctl --root= enable sddm $ sudo build/systemctl --root= enable gdm Failed to enable unit: File /etc/systemd/system/display-manager.service already exists and is a symlink to /usr/lib/systemd/system/sddm.service. (I tried a few different approaches to pass the error information back to the caller. Adding a new parameter to hold the error results in a gigantic patch and a lot of hassle to pass the args arounds. Adding this information to the changes array is straightforward and can be more easily extended in the future.) In case local installation is performed, the full set of errors can be reported and we do that. When running over dbus, only the first error is reported.
Diffstat (limited to 'src/shared/install.h')
-rw-r--r--src/shared/install.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/shared/install.h b/src/shared/install.h
index 219b48f428..82c62095d5 100644
--- a/src/shared/install.h
+++ b/src/shared/install.h
@@ -77,8 +77,12 @@ enum UnitFileChangeType {
_UNIT_FILE_CHANGE_TYPE_INVALID = -1
};
+/* type can either one of the UnitFileChangeTypes listed above, or a negative error.
+ * If source is specified, it should be the contents of the path symlink.
+ * In case of an error, source should be the existing symlink contents or NULL
+ */
struct UnitFileChange {
- UnitFileChangeType type;
+ int type; /* UnitFileChangeType or bust */
char *path;
char *source;
};
@@ -233,6 +237,7 @@ Hashmap* unit_file_list_free(Hashmap *h);
int unit_file_changes_add(UnitFileChange **changes, unsigned *n_changes, UnitFileChangeType type, const char *path, const char *source);
void unit_file_changes_free(UnitFileChange *changes, unsigned n_changes);
+void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *changes, unsigned n_changes, bool quiet);
int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name);