summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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");