chiark / gitweb /
b2043d0870b0f9deb2a9219bc786bacfb071354a
[elogind.git] / src / shared / unit-name.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
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.
14
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.
19
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/>.
22 ***/
23
24 #include <stdbool.h>
25
26 #include "macro.h"
27
28 #define UNIT_NAME_MAX 256
29
30 typedef enum UnitType UnitType;
31 typedef enum UnitLoadState UnitLoadState;
32 typedef enum UnitDependency UnitDependency;
33
34 enum UnitType {
35         UNIT_SERVICE = 0,
36         UNIT_SOCKET,
37         UNIT_BUSNAME,
38         UNIT_TARGET,
39         UNIT_SNAPSHOT,
40         UNIT_DEVICE,
41         UNIT_MOUNT,
42         UNIT_AUTOMOUNT,
43         UNIT_SWAP,
44         UNIT_TIMER,
45         UNIT_PATH,
46         UNIT_SLICE,
47         UNIT_SCOPE,
48         _UNIT_TYPE_MAX,
49         _UNIT_TYPE_INVALID = -1
50 };
51
52 enum UnitLoadState {
53         UNIT_STUB = 0,
54         UNIT_LOADED,
55         UNIT_NOT_FOUND,
56         UNIT_ERROR,
57         UNIT_MERGED,
58         UNIT_MASKED,
59         _UNIT_LOAD_STATE_MAX,
60         _UNIT_LOAD_STATE_INVALID = -1
61 };
62
63 enum UnitDependency {
64         /* Positive dependencies */
65         UNIT_REQUIRES,
66         UNIT_REQUIRES_OVERRIDABLE,
67         UNIT_REQUISITE,
68         UNIT_REQUISITE_OVERRIDABLE,
69         UNIT_WANTS,
70         UNIT_BINDS_TO,
71         UNIT_PART_OF,
72
73         /* Inverse of the above */
74         UNIT_REQUIRED_BY,             /* inverse of 'requires' is 'required_by' */
75         UNIT_REQUIRED_BY_OVERRIDABLE, /* inverse of 'requires_overridable' is 'required_by_overridable' */
76         UNIT_REQUISITE_OF,            /* inverse of 'requisite' is 'requisite_of' */
77         UNIT_REQUISITE_OF_OVERRIDABLE,/* inverse of 'requisite_overridable' is 'requisite_of_overridable' */
78         UNIT_WANTED_BY,               /* inverse of 'wants' */
79         UNIT_BOUND_BY,                /* inverse of 'binds_to' */
80         UNIT_CONSISTS_OF,             /* inverse of 'part_of' */
81
82         /* Negative dependencies */
83         UNIT_CONFLICTS,               /* inverse of 'conflicts' is 'conflicted_by' */
84         UNIT_CONFLICTED_BY,
85
86         /* Order */
87         UNIT_BEFORE,                  /* inverse of 'before' is 'after' and vice versa */
88         UNIT_AFTER,
89
90         /* On Failure */
91         UNIT_ON_FAILURE,
92
93         /* Triggers (i.e. a socket triggers a service) */
94         UNIT_TRIGGERS,
95         UNIT_TRIGGERED_BY,
96
97         /* Propagate reloads */
98         UNIT_PROPAGATES_RELOAD_TO,
99         UNIT_RELOAD_PROPAGATED_FROM,
100
101         /* Joins namespace of */
102         UNIT_JOINS_NAMESPACE_OF,
103
104         /* Reference information for GC logic */
105         UNIT_REFERENCES,              /* Inverse of 'references' is 'referenced_by' */
106         UNIT_REFERENCED_BY,
107
108         _UNIT_DEPENDENCY_MAX,
109         _UNIT_DEPENDENCY_INVALID = -1
110 };
111
112 typedef enum UnitNameFlags {
113         UNIT_NAME_PLAIN = 1,      /* Allow foo.service */
114         UNIT_NAME_INSTANCE = 2,   /* Allow foo@bar.service */
115         UNIT_NAME_TEMPLATE = 4,   /* Allow foo@.service */
116         UNIT_NAME_ANY = UNIT_NAME_PLAIN|UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE,
117 } UnitNameFlags;
118
119 bool unit_name_is_valid(const char *n, UnitNameFlags flags) _pure_;
120 bool unit_prefix_is_valid(const char *p) _pure_;
121 bool unit_instance_is_valid(const char *i) _pure_;
122 bool unit_suffix_is_valid(const char *s) _pure_;
123
124 static inline int unit_prefix_and_instance_is_valid(const char *p) {
125         /* For prefix+instance and instance the same rules apply */
126         return unit_instance_is_valid(p);
127 }
128
129 int unit_name_to_prefix(const char *n, char **prefix);
130 int unit_name_to_instance(const char *n, char **instance);
131 int unit_name_to_prefix_and_instance(const char *n, char **ret);
132
133 UnitType unit_name_to_type(const char *n) _pure_;
134
135 int unit_name_change_suffix(const char *n, const char *suffix, char **ret);
136
137 int unit_name_build(const char *prefix, const char *instance, const char *suffix, char **ret);
138
139 char *unit_name_escape(const char *f);
140 int unit_name_unescape(const char *f, char **ret);
141 int unit_name_path_escape(const char *f, char **ret);
142 int unit_name_path_unescape(const char *f, char **ret);
143
144 int unit_name_replace_instance(const char *f, const char *i, char **ret);
145
146 int unit_name_template(const char *f, char **ret);
147
148 int unit_name_from_path(const char *path, const char *suffix, char **ret);
149 int unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix, char **ret);
150 int unit_name_to_path(const char *name, char **ret);
151
152 char *unit_dbus_path_from_name(const char *name);
153 int unit_name_from_dbus_path(const char *path, char **name);
154
155 typedef enum UnitNameMangle {
156         UNIT_NAME_NOGLOB,
157         UNIT_NAME_GLOB,
158 } UnitNameMangle;
159
160 int unit_name_mangle_with_suffix(const char *name, UnitNameMangle allow_globs, const char *suffix, char **ret);
161
162 static inline int unit_name_mangle(const char *name, UnitNameMangle allow_globs, char **ret) {
163         return unit_name_mangle_with_suffix(name, allow_globs, ".service", ret);
164 }
165
166 int slice_build_parent_slice(const char *slice, char **ret);
167 int slice_build_subslice(const char *slice, const char*name, char **subslice);
168 bool slice_name_is_valid(const char *name);
169
170 const char *unit_type_to_string(UnitType i) _const_;
171 UnitType unit_type_from_string(const char *s) _pure_;
172
173 const char *unit_load_state_to_string(UnitLoadState i) _const_;
174 UnitLoadState unit_load_state_from_string(const char *s) _pure_;
175
176 const char *unit_dependency_to_string(UnitDependency i) _const_;
177 UnitDependency unit_dependency_from_string(const char *s) _pure_;