summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-03-07 19:07:30 +0100
committerLennart Poettering <lennart@poettering.net>2016-04-12 13:43:31 +0200
commite4fca67ff02c44216780c5a61b1ab66cb6c09752 (patch)
tree60ceb4be28c9cbafaa763e90a0af632d9d32ede3
parent401017e04d3d1ac41fabb939278984acc8298ddb (diff)
install: introduce a new unit file state "transient"
Now, that the search path logic knows the unit path for transient units we also can introduce an explicit unit file state "transient" that clarifies to the user what kind of unit file he is encountering.
-rw-r--r--man/systemctl.xml5
-rw-r--r--src/core/dbus-manager.c4
-rw-r--r--src/shared/install.c32
-rw-r--r--src/shared/install.h1
-rw-r--r--src/systemctl/systemctl.c4
5 files changed, 42 insertions, 4 deletions
diff --git a/man/systemctl.xml b/man/systemctl.xml
index 0febdfd4de..064777810f 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -1187,6 +1187,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
<entry>0</entry>
</row>
<row>
+ <entry><literal>transient</literal></entry>
+ <entry>The unit file has been created dynamically with the runtime API. Transient units may not be enabled.</entry>
+ <entry>0</entry>
+ </row>
+ <row>
<entry><literal>bad</literal></entry>
<entry>The unit file is invalid or another error occurred. Note that <command>is-enabled</command> will not actually return this state, but print an error message instead. However the unit file listing printed by <command>list-unit-files</command> might show it.</entry>
<entry>&gt; 0</entry>
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 5fc3526751..f0ee2fcb36 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -1641,7 +1641,7 @@ static int method_enable_unit_files_generic(
if (r == -ESHUTDOWN)
return sd_bus_error_setf(error, BUS_ERROR_UNIT_MASKED, "Unit file is masked.");
if (r == -EADDRNOTAVAIL)
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED, "Unit file is generated.");
+ return sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED, "Unit file is transient or generated.");
if (r < 0)
return r;
@@ -1866,7 +1866,7 @@ static int method_add_dependency_unit_files(sd_bus_message *message, void *userd
if (r == -ESHUTDOWN)
return sd_bus_error_setf(error, BUS_ERROR_UNIT_MASKED, "Unit file is masked.");
if (r == -EADDRNOTAVAIL)
- return sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED, "Unit file is generated.");
+ return sd_bus_error_setf(error, BUS_ERROR_UNIT_GENERATED, "Unit file is transient or generated.");
if (r < 0)
return r;
diff --git a/src/shared/install.c b/src/shared/install.c
index 6c5d3ce7d1..c19c85a3b5 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -119,6 +119,19 @@ static int path_is_generator(const LookupPaths *p, const char *path) {
path_equal(p->generator_late, parent);
}
+static int path_is_transient(const LookupPaths *p, const char *path) {
+ _cleanup_free_ char *parent = NULL;
+
+ assert(p);
+ assert(path);
+
+ parent = dirname_malloc(path);
+ if (!parent)
+ return -ENOMEM;
+
+ return path_equal(p->transient, parent);
+}
+
static int path_is_config(const LookupPaths *p, const char *path) {
_cleanup_free_ char *parent = NULL;
const char *rpath;
@@ -1710,6 +1723,8 @@ int unit_file_add_dependency(
return -ESHUTDOWN;
if (path_is_generator(&paths, target_info->path))
return -EADDRNOTAVAIL;
+ if (path_is_transient(&paths, target_info->path))
+ return -EADDRNOTAVAIL;
assert(target_info->type == UNIT_FILE_TYPE_REGULAR);
@@ -1723,6 +1738,8 @@ int unit_file_add_dependency(
return -ESHUTDOWN;
if (path_is_generator(&paths, i->path))
return -EADDRNOTAVAIL;
+ if (path_is_transient(&paths, i->path))
+ return -EADDRNOTAVAIL;
assert(i->type == UNIT_FILE_TYPE_REGULAR);
@@ -1777,6 +1794,8 @@ int unit_file_enable(
return -ESHUTDOWN;
if (path_is_generator(&paths, i->path))
return -EADDRNOTAVAIL;
+ if (path_is_transient(&paths, i->path))
+ return -EADDRNOTAVAIL;
assert(i->type == UNIT_FILE_TYPE_REGULAR);
}
@@ -1891,6 +1910,8 @@ int unit_file_set_default(
return -ESHUTDOWN;
if (path_is_generator(&paths, i->path))
return -EADDRNOTAVAIL;
+ if (path_is_transient(&paths, i->path))
+ return -EADDRNOTAVAIL;
old_path = skip_root(&paths, i->path);
new_path = strjoina(paths.persistent_config, "/" SPECIAL_DEFAULT_TARGET);
@@ -1975,6 +1996,14 @@ int unit_file_lookup_state(
break;
}
+ r = path_is_transient(paths, i->path);
+ if (r < 0)
+ return r;
+ if (r > 0) {
+ state = UNIT_FILE_TRANSIENT;
+ break;
+ }
+
r = find_symlinks_in_scope(scope, paths, i->name, &state);
if (r < 0)
return r;
@@ -2176,6 +2205,8 @@ static int preset_prepare_one(
return -ESHUTDOWN;
if (path_is_generator(paths, i->path))
return -EADDRNOTAVAIL;
+ if (path_is_transient(paths, i->path))
+ return -EADDRNOTAVAIL;
} else
r = install_info_discover(scope, minus, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
@@ -2372,6 +2403,7 @@ static const char* const unit_file_state_table[_UNIT_FILE_STATE_MAX] = {
[UNIT_FILE_DISABLED] = "disabled",
[UNIT_FILE_INDIRECT] = "indirect",
[UNIT_FILE_GENERATED] = "generated",
+ [UNIT_FILE_TRANSIENT] = "transient",
[UNIT_FILE_BAD] = "bad",
};
diff --git a/src/shared/install.h b/src/shared/install.h
index 9c33110e44..578664dd48 100644
--- a/src/shared/install.h
+++ b/src/shared/install.h
@@ -55,6 +55,7 @@ enum UnitFileState {
UNIT_FILE_DISABLED,
UNIT_FILE_INDIRECT,
UNIT_FILE_GENERATED,
+ UNIT_FILE_TRANSIENT,
UNIT_FILE_BAD,
_UNIT_FILE_STATE_MAX,
_UNIT_FILE_STATE_INVALID = -1
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 3fd44a01d4..b64a97375e 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -5444,7 +5444,7 @@ static int enable_unit(int argc, char *argv[], void *userdata) {
if (r == -ESHUTDOWN)
return log_error_errno(r, "Unit file is masked.");
if (r == -EADDRNOTAVAIL)
- return log_error_errno(r, "Unit file is generated.");
+ return log_error_errno(r, "Unit file is transient or generated.");
if (r < 0)
return log_error_errno(r, "Operation failed: %m");
@@ -5612,7 +5612,7 @@ static int add_dependency(int argc, char *argv[], void *userdata) {
if (r == -ESHUTDOWN)
return log_error_errno(r, "Unit file is masked.");
if (r == -EADDRNOTAVAIL)
- return log_error_errno(r, "Unit file is generated.");
+ return log_error_errno(r, "Unit file is transient or generated.");
if (r < 0)
return log_error_errno(r, "Can't add dependency: %m");