chiark / gitweb /
service: add the ability for units to join other unit's PrivateNetwork= and PrivateTm...
[elogind.git] / src / core / load-fragment.c
index 110f7fbb6e23f70e53a342cb8e0a0b246a538833..8a42e739bedc11572fd7a261ff7bc7dfdf7b6f8c 100644 (file)
@@ -58,6 +58,7 @@ int config_parse_warn_compat(const char *unit,
                              const char *filename,
                              unsigned line,
                              const char *section,
+                             unsigned section_line,
                              const char *lvalue,
                              int ltype,
                              const char *rvalue,
@@ -75,6 +76,7 @@ int config_parse_unit_deps(const char* unit,
                            const char *filename,
                            unsigned line,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            int ltype,
                            const char *rvalue,
@@ -119,6 +121,7 @@ int config_parse_unit_string_printf(const char *unit,
                                     const char *filename,
                                     unsigned line,
                                     const char *section,
+                                    unsigned section_line,
                                     const char *lvalue,
                                     int ltype,
                                     const char *rvalue,
@@ -139,7 +142,7 @@ int config_parse_unit_string_printf(const char *unit,
                 log_syntax(unit, LOG_ERR, filename, line, -r,
                            "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
 
-        return config_parse_string(unit, filename, line, section, lvalue, ltype,
+        return config_parse_string(unit, filename, line, section, section_line, lvalue, ltype,
                                    k ? k : rvalue, data, userdata);
 }
 
@@ -147,6 +150,7 @@ int config_parse_unit_strv_printf(const char *unit,
                                   const char *filename,
                                   unsigned line,
                                   const char *section,
+                                  unsigned section_line,
                                   const char *lvalue,
                                   int ltype,
                                   const char *rvalue,
@@ -167,7 +171,7 @@ int config_parse_unit_strv_printf(const char *unit,
                 log_syntax(unit, LOG_ERR, filename, line, -r,
                            "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
 
-        return config_parse_strv(unit, filename, line, section, lvalue, ltype,
+        return config_parse_strv(unit, filename, line, section, section_line, lvalue, ltype,
                                  k ? k : rvalue, data, userdata);
 }
 
@@ -175,6 +179,7 @@ int config_parse_unit_path_printf(const char *unit,
                                   const char *filename,
                                   unsigned line,
                                   const char *section,
+                                  unsigned section_line,
                                   const char *lvalue,
                                   int ltype,
                                   const char *rvalue,
@@ -195,7 +200,7 @@ int config_parse_unit_path_printf(const char *unit,
                 log_syntax(unit, LOG_ERR, filename, line, -r,
                            "Failed to resolve unit specifiers on %s, ignoring: %s", rvalue, strerror(-r));
 
-        return config_parse_path(unit, filename, line, section, lvalue, ltype,
+        return config_parse_path(unit, filename, line, section, section_line, lvalue, ltype,
                                  k ? k : rvalue, data, userdata);
 }
 
@@ -203,6 +208,7 @@ int config_parse_socket_listen(const char *unit,
                                const char *filename,
                                unsigned line,
                                const char *section,
+                               unsigned section_line,
                                const char *lvalue,
                                int ltype,
                                const char *rvalue,
@@ -313,6 +319,7 @@ int config_parse_socket_bind(const char *unit,
                              const char *filename,
                              unsigned line,
                              const char *section,
+                             unsigned section_line,
                              const char *lvalue,
                              int ltype,
                              const char *rvalue,
@@ -351,6 +358,7 @@ int config_parse_exec_nice(const char *unit,
                            const char *filename,
                            unsigned line,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            int ltype,
                            const char *rvalue,
@@ -388,6 +396,7 @@ int config_parse_exec_oom_score_adjust(const char* unit,
                                        const char *filename,
                                        unsigned line,
                                        const char *section,
+                                       unsigned section_line,
                                        const char *lvalue,
                                        int ltype,
                                        const char *rvalue,
@@ -425,6 +434,7 @@ int config_parse_exec(const char *unit,
                       const char *filename,
                       unsigned line,
                       const char *section,
+                      unsigned section_line,
                       const char *lvalue,
                       int ltype,
                       const char *rvalue,
@@ -596,6 +606,7 @@ int config_parse_socket_bindtodevice(const char* unit,
                                      const char *filename,
                                      unsigned line,
                                      const char *section,
+                                     unsigned section_line,
                                      const char *lvalue,
                                      int ltype,
                                      const char *rvalue,
@@ -630,6 +641,7 @@ int config_parse_exec_io_class(const char *unit,
                                const char *filename,
                                unsigned line,
                                const char *section,
+                               unsigned section_line,
                                const char *lvalue,
                                int ltype,
                                const char *rvalue,
@@ -661,6 +673,7 @@ int config_parse_exec_io_priority(const char *unit,
                                   const char *filename,
                                   unsigned line,
                                   const char *section,
+                                  unsigned section_line,
                                   const char *lvalue,
                                   int ltype,
                                   const char *rvalue,
@@ -692,6 +705,7 @@ int config_parse_exec_cpu_sched_policy(const char *unit,
                                        const char *filename,
                                        unsigned line,
                                        const char *section,
+                                       unsigned section_line,
                                        const char *lvalue,
                                        int ltype,
                                        const char *rvalue,
@@ -726,6 +740,7 @@ int config_parse_exec_cpu_sched_prio(const char *unit,
                                      const char *filename,
                                      unsigned line,
                                      const char *section,
+                                     unsigned section_line,
                                      const char *lvalue,
                                      int ltype,
                                      const char *rvalue,
@@ -767,6 +782,7 @@ int config_parse_exec_cpu_affinity(const char *unit,
                                    const char *filename,
                                    unsigned line,
                                    const char *section,
+                                   unsigned section_line,
                                    const char *lvalue,
                                    int ltype,
                                    const char *rvalue,
@@ -824,6 +840,7 @@ int config_parse_exec_capabilities(const char *unit,
                                    const char *filename,
                                    unsigned line,
                                    const char *section,
+                                   unsigned section_line,
                                    const char *lvalue,
                                    int ltype,
                                    const char *rvalue,
@@ -856,6 +873,7 @@ int config_parse_exec_secure_bits(const char *unit,
                                   const char *filename,
                                   unsigned line,
                                   const char *section,
+                                  unsigned section_line,
                                   const char *lvalue,
                                   int ltype,
                                   const char *rvalue,
@@ -905,6 +923,7 @@ int config_parse_bounding_set(const char *unit,
                               const char *filename,
                               unsigned line,
                               const char *section,
+                              unsigned section_line,
                               const char *lvalue,
                               int ltype,
                               const char *rvalue,
@@ -964,6 +983,7 @@ int config_parse_limit(const char *unit,
                        const char *filename,
                        unsigned line,
                        const char *section,
+                       unsigned section_line,
                        const char *lvalue,
                        int ltype,
                        const char *rvalue,
@@ -1008,6 +1028,7 @@ int config_parse_sysv_priority(const char *unit,
                                const char *filename,
                                unsigned line,
                                const char *section,
+                               unsigned section_line,
                                const char *lvalue,
                                int ltype,
                                const char *rvalue,
@@ -1040,6 +1061,7 @@ int config_parse_kill_signal(const char *unit,
                              const char *filename,
                              unsigned line,
                              const char *section,
+                             unsigned section_line,
                              const char *lvalue,
                              int ltype,
                              const char *rvalue,
@@ -1069,6 +1091,7 @@ int config_parse_exec_mount_flags(const char *unit,
                                   const char *filename,
                                   unsigned line,
                                   const char *section,
+                                  unsigned section_line,
                                   const char *lvalue,
                                   int ltype,
                                   const char *rvalue,
@@ -1115,6 +1138,7 @@ int config_parse_timer(const char *unit,
                        const char *filename,
                        unsigned line,
                        const char *section,
+                       unsigned section_line,
                        const char *lvalue,
                        int ltype,
                        const char *rvalue,
@@ -1185,6 +1209,7 @@ int config_parse_trigger_unit(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -1239,6 +1264,7 @@ int config_parse_path_spec(const char *unit,
                            const char *filename,
                            unsigned line,
                            const char *section,
+                           unsigned section_line,
                            const char *lvalue,
                            int ltype,
                            const char *rvalue,
@@ -1305,6 +1331,7 @@ int config_parse_socket_service(const char *unit,
                                 const char *filename,
                                 unsigned line,
                                 const char *section,
+                                unsigned section_line,
                                 const char *lvalue,
                                 int ltype,
                                 const char *rvalue,
@@ -1323,15 +1350,17 @@ int config_parse_socket_service(const char *unit,
         assert(data);
 
         r = unit_name_printf(UNIT(s), rvalue, &p);
-        if (r < 0)
+        if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, -r, "Failed to resolve specifiers, ignoring: %s", rvalue);
+                return 0;
+        }
 
-        if (!endswith(p ?: rvalue, ".service")) {
+        if (!endswith(p, ".service")) {
                 log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Unit must be of type service, ignoring: %s", rvalue);
                 return 0;
         }
 
-        r = manager_load_unit(UNIT(s)->manager, p ?: rvalue, NULL, &error, &x);
+        r = manager_load_unit(UNIT(s)->manager, p, NULL, &error, &x);
         if (r < 0) {
                 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to load unit %s, ignoring: %s", rvalue, bus_error_message(&error, r));
                 return 0;
@@ -1346,6 +1375,7 @@ int config_parse_service_sockets(const char *unit,
                                  const char *filename,
                                  unsigned line,
                                  const char *section,
+                                 unsigned section_line,
                                  const char *lvalue,
                                  int ltype,
                                  const char *rvalue,
@@ -1398,6 +1428,7 @@ int config_parse_service_timeout(const char *unit,
                                  const char *filename,
                                  unsigned line,
                                  const char *section,
+                                 unsigned section_line,
                                  const char *lvalue,
                                  int ltype,
                                  const char *rvalue,
@@ -1412,7 +1443,7 @@ int config_parse_service_timeout(const char *unit,
         assert(rvalue);
         assert(s);
 
-        r = config_parse_sec(unit, filename, line, section, lvalue, ltype,
+        r = config_parse_sec(unit, filename, line, section, section_line, lvalue, ltype,
                              rvalue, data, userdata);
         if (r < 0)
                 return r;
@@ -1430,6 +1461,7 @@ int config_parse_unit_env_file(const char *unit,
                                const char *filename,
                                unsigned line,
                                const char *section,
+                               unsigned section_line,
                                const char *lvalue,
                                int ltype,
                                const char *rvalue,
@@ -1477,6 +1509,7 @@ int config_parse_environ(const char *unit,
                          const char *filename,
                          unsigned line,
                          const char *section,
+                         unsigned section_line,
                          const char *lvalue,
                          int ltype,
                          const char *rvalue,
@@ -1542,6 +1575,7 @@ int config_parse_ip_tos(const char *unit,
                         const char *filename,
                         unsigned line,
                         const char *section,
+                        unsigned section_line,
                         const char *lvalue,
                         int ltype,
                         const char *rvalue,
@@ -1570,6 +1604,7 @@ int config_parse_unit_condition_path(const char *unit,
                                      const char *filename,
                                      unsigned line,
                                      const char *section,
+                                     unsigned section_line,
                                      const char *lvalue,
                                      int ltype,
                                      const char *rvalue,
@@ -1631,6 +1666,7 @@ int config_parse_unit_condition_string(const char *unit,
                                        const char *filename,
                                        unsigned line,
                                        const char *section,
+                                       unsigned section_line,
                                        const char *lvalue,
                                        int ltype,
                                        const char *rvalue,
@@ -1686,6 +1722,7 @@ int config_parse_unit_condition_null(const char *unit,
                                      const char *filename,
                                      unsigned line,
                                      const char *section,
+                                     unsigned section_line,
                                      const char *lvalue,
                                      int ltype,
                                      const char *rvalue,
@@ -1744,6 +1781,7 @@ int config_parse_unit_requires_mounts_for(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -1789,6 +1827,7 @@ int config_parse_documentation(const char *unit,
                                const char *filename,
                                unsigned line,
                                const char *section,
+                               unsigned section_line,
                                const char *lvalue,
                                int ltype,
                                const char *rvalue,
@@ -1811,7 +1850,7 @@ int config_parse_documentation(const char *unit,
                 return 0;
         }
 
-        r = config_parse_unit_strv_printf(unit, filename, line, section, lvalue, ltype,
+        r = config_parse_unit_strv_printf(unit, filename, line, section, section_line, lvalue, ltype,
                                           rvalue, data, userdata);
         if (r < 0)
                 return r;
@@ -1846,6 +1885,7 @@ int config_parse_syscall_filter(const char *unit,
                                 const char *filename,
                                 unsigned line,
                                 const char *section,
+                                unsigned section_line,
                                 const char *lvalue,
                                 int ltype,
                                 const char *rvalue,
@@ -1927,6 +1967,7 @@ int config_parse_unit_slice(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -1976,6 +2017,7 @@ int config_parse_cpu_shares(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2011,6 +2053,7 @@ int config_parse_memory_limit(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2044,6 +2087,7 @@ int config_parse_device_allow(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2103,6 +2147,7 @@ int config_parse_blockio_weight(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2139,6 +2184,7 @@ int config_parse_blockio_device_weight(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2209,6 +2255,7 @@ int config_parse_blockio_bandwidth(
                 const char *filename,
                 unsigned line,
                 const char *section,
+                unsigned section_line,
                 const char *lvalue,
                 int ltype,
                 const char *rvalue,
@@ -2281,6 +2328,37 @@ int config_parse_blockio_bandwidth(
         return 0;
 }
 
+DEFINE_CONFIG_PARSE_ENUM(config_parse_job_mode, job_mode, JobMode, "Failed to parse job mode");
+
+int config_parse_job_mode_isolate(
+                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) {
+
+        JobMode *m = data;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+
+        r = parse_boolean(rvalue);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse boolean, ignoring: %s", rvalue);
+                return 0;
+        }
+
+        *m = r ? JOB_ISOLATE : JOB_REPLACE;
+        return 0;
+}
+
 #define FOLLOW_MAX 8
 
 static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {