1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
6 This file is part of systemd.
8 Copyright 2010 Lennart Poettering
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
28 #define UNIT_NAME_MAX 256
30 typedef enum UnitType UnitType;
31 typedef enum UnitLoadState UnitLoadState;
32 typedef enum UnitDependency UnitDependency;
49 _UNIT_TYPE_INVALID = -1
60 _UNIT_LOAD_STATE_INVALID = -1
64 /* Positive dependencies */
66 UNIT_REQUIRES_OVERRIDABLE,
68 UNIT_REQUISITE_OVERRIDABLE,
73 /* Inverse of the above */
74 UNIT_REQUIRED_BY, /* inverse of 'requires' and 'requisite' is 'required_by' */
75 UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' and 'requisite_overridable' is 'soft_required_by' */
76 UNIT_WANTED_BY, /* inverse of 'wants' */
77 UNIT_BOUND_BY, /* inverse of 'binds_to' */
78 UNIT_CONSISTS_OF, /* inverse of 'part_of' */
80 /* Negative dependencies */
81 UNIT_CONFLICTS, /* inverse of 'conflicts' is 'conflicted_by' */
85 UNIT_BEFORE, /* inverse of 'before' is 'after' and vice versa */
91 /* Triggers (i.e. a socket triggers a service) */
95 /* Propagate reloads */
96 UNIT_PROPAGATES_RELOAD_TO,
97 UNIT_RELOAD_PROPAGATED_FROM,
99 /* Joins namespace of */
100 UNIT_JOINS_NAMESPACE_OF,
102 /* Reference information for GC logic */
103 UNIT_REFERENCES, /* Inverse of 'references' is 'referenced_by' */
106 _UNIT_DEPENDENCY_MAX,
107 _UNIT_DEPENDENCY_INVALID = -1
110 typedef enum UnitNameFlags {
111 UNIT_NAME_PLAIN = 1, /* Allow foo.service */
112 UNIT_NAME_INSTANCE = 2, /* Allow foo@bar.service */
113 UNIT_NAME_TEMPLATE = 4, /* Allow foo@.service */
114 UNIT_NAME_ANY = UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE,
117 bool unit_name_is_valid(const char *n, UnitNameFlags flags) _pure_;
118 bool unit_prefix_is_valid(const char *p) _pure_;
119 bool unit_instance_is_valid(const char *i) _pure_;
120 bool unit_suffix_is_valid(const char *s) _pure_;
122 static inline int unit_prefix_and_instance_is_valid(const char *p) {
123 /* For prefix+instance and instance the same rules apply */
124 return unit_instance_is_valid(p);
127 int unit_name_to_prefix(const char *n, char **prefix);
128 int unit_name_to_instance(const char *n, char **instance);
129 int unit_name_to_prefix_and_instance(const char *n, char **ret);
131 UnitType unit_name_to_type(const char *n) _pure_;
133 int unit_name_change_suffix(const char *n, const char *suffix, char **ret);
135 int unit_name_build(const char *prefix, const char *instance, const char *suffix, char **ret);
137 char *unit_name_escape(const char *f);
138 int unit_name_unescape(const char *f, char **ret);
139 int unit_name_path_escape(const char *f, char **ret);
140 int unit_name_path_unescape(const char *f, char **ret);
142 int unit_name_replace_instance(const char *f, const char *i, char **ret);
144 int unit_name_template(const char *f, char **ret);
146 int unit_name_from_path(const char *path, const char *suffix, char **ret);
147 int unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix, char **ret);
148 int unit_name_to_path(const char *name, char **ret);
150 char *unit_dbus_path_from_name(const char *name);
151 int unit_name_from_dbus_path(const char *path, char **name);
153 typedef enum UnitNameMangle {
158 int unit_name_mangle_with_suffix(const char *name, UnitNameMangle allow_globs, const char *suffix, char **ret);
160 static inline int unit_name_mangle(const char *name, UnitNameMangle allow_globs, char **ret) {
161 return unit_name_mangle_with_suffix(name, allow_globs, ".service", ret);
164 int slice_build_parent_slice(const char *slice, char **ret);
165 int slice_build_subslice(const char *slice, const char*name, char **subslice);
166 bool slice_name_is_valid(const char *name);
168 const char *unit_type_to_string(UnitType i) _const_;
169 UnitType unit_type_from_string(const char *s) _pure_;
171 const char *unit_load_state_to_string(UnitLoadState i) _const_;
172 UnitLoadState unit_load_state_from_string(const char *s) _pure_;
174 const char *unit_dependency_to_string(UnitDependency i) _const_;
175 UnitDependency unit_dependency_from_string(const char *s) _pure_;