summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/conf-parser.c37
-rw-r--r--src/shared/conf-parser.h1
-rw-r--r--src/shared/efivars.c1
-rw-r--r--src/shared/generator.c41
-rw-r--r--src/shared/generator.h6
-rw-r--r--src/shared/meson.build2
6 files changed, 86 insertions, 2 deletions
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index d8393cbc8d..dae521ef9f 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -960,3 +960,40 @@ int config_parse_ifname(
return 0;
}
+
+int config_parse_ip_port(
+ const char *unit,
+ const char *filename,
+ unsigned line,
+ const char *section,
+ unsigned section_line,
+ const char *lvalue,
+ int ltype,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ uint16_t *s = data;
+ uint16_t port;
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if (isempty(rvalue)) {
+ *s = 0;
+ return 0;
+ }
+
+ r = parse_ip_port(rvalue, &port);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse port '%s'.", rvalue);
+ return 0;
+ }
+
+ *s = port;
+
+ return 0;
+}
diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h
index 82ea5c1288..ce1113485d 100644
--- a/src/shared/conf-parser.h
+++ b/src/shared/conf-parser.h
@@ -140,6 +140,7 @@ int config_parse_log_level(const char *unit, const char *filename, unsigned line
int config_parse_signal(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_personality(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_ifname(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+int config_parse_ip_port(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
#define DEFINE_CONFIG_PARSE_ENUM(function,name,type,msg) \
int function(const char *unit, \
diff --git a/src/shared/efivars.c b/src/shared/efivars.c
index 8631a5a5d9..8229e6b183 100644
--- a/src/shared/efivars.c
+++ b/src/shared/efivars.c
@@ -269,6 +269,7 @@ int efi_set_variable(
_cleanup_close_ int fd = -1;
assert(name);
+ assert(value);
if (asprintf(&p,
"/sys/firmware/efi/efivars/%s-%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
diff --git a/src/shared/generator.c b/src/shared/generator.c
index 9a069b2f97..19ec133772 100644
--- a/src/shared/generator.c
+++ b/src/shared/generator.c
@@ -188,10 +188,49 @@ int generator_write_timeouts(
return write_drop_in_format(dir, unit, 50, "device-timeout",
"# Automatically generated by %s\n\n"
- "[Unit]\nJobTimeoutSec=%s",
+ "[Unit]\nJobRunningTimeoutSec=%s",
program_invocation_short_name, timeout);
}
+int generator_write_device_deps(
+ const char *dir,
+ const char *what,
+ const char *where,
+ const char *opts) {
+
+ /* fstab records that specify _netdev option should apply the network
+ * ordering on the actual device depending on network connection. If we
+ * are not mounting real device (NFS, CIFS), we rely on _netdev effect
+ * on the mount unit itself. */
+
+ _cleanup_free_ char *node = NULL, *unit = NULL;
+ int r;
+
+ if (!fstab_test_option(opts, "_netdev\0"))
+ return 0;
+
+ node = fstab_node_to_udev_node(what);
+ if (!node)
+ return log_oom();
+
+ /* Nothing to apply dependencies to. */
+ if (!is_device_path(node))
+ return 0;
+
+ r = unit_name_from_path(node, ".device", &unit);
+ if (r < 0)
+ return log_error_errno(r, "Failed to make unit name from path: %m");
+
+ /* See mount_add_default_dependencies for explanation why we create such
+ * dependencies. */
+ return write_drop_in_format(dir, unit, 50, "netdev-dependencies",
+ "# Automatically generated by %s\n\n"
+ "[Unit]\n"
+ "After=" SPECIAL_NETWORK_ONLINE_TARGET " " SPECIAL_NETWORK_TARGET "\n"
+ "Wants=" SPECIAL_NETWORK_ONLINE_TARGET "\n",
+ program_invocation_short_name);
+}
+
int generator_write_initrd_root_device_deps(const char *dir, const char *what) {
_cleanup_free_ char *unit = NULL;
int r;
diff --git a/src/shared/generator.h b/src/shared/generator.h
index a6017c1b76..825d934c8e 100644
--- a/src/shared/generator.h
+++ b/src/shared/generator.h
@@ -35,6 +35,12 @@ int generator_write_timeouts(
const char *opts,
char **filtered);
+int generator_write_device_deps(
+ const char *dir,
+ const char *what,
+ const char *where,
+ const char *opts);
+
int generator_write_initrd_root_device_deps(
const char *dir,
const char *what);
diff --git a/src/shared/meson.build b/src/shared/meson.build
index 49a7d9f30b..b684e5b543 100644
--- a/src/shared/meson.build
+++ b/src/shared/meson.build
@@ -127,10 +127,10 @@ libshared = shared_library(
basic_sources,
journal_internal_sources,
libsystemd_internal_sources,
+ libudev_sources,
include_directories : includes,
link_args : ['-shared'],
c_args : ['-fvisibility=default'],
- link_with : [libudev],
dependencies : [threads,
librt,
libcap,