2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek This file is part of systemd.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek Copyright 2014 Zbigniew Jędrzejewski-Szmek
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek systemd is free software; you can redistribute it and/or modify it
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek under the terms of the GNU Lesser General Public License as published by
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek the Free Software Foundation; either version 2.1 of the License, or
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek (at your option) any later version.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek systemd is distributed in the hope that it will be useful, but
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek WITHOUT ANY WARRANTY; without even the implied warranty of
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek Lesser General Public License for more details.
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek You should have received a copy of the GNU Lesser General Public License
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek along with systemd; If not, see <http://www.gnu.org/licenses/>.
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmekint drop_in_file(const char *dir, const char *unit, unsigned level,
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek const char *name, char **_p, char **_q) {
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmek char prefix[DECIMAL_STR_MAX(unsigned)];
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek p = strjoin(dir, "/", unit, ".d", NULL);
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmek q = strjoin(p, "/", prefix, "-", b, ".conf", NULL);
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmekint write_drop_in(const char *dir, const char *unit, unsigned level,
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek const char *name, const char *data) {
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek _cleanup_free_ char *p = NULL, *q = NULL;
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmek r = drop_in_file(dir, unit, level, name, &p, &q);
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek return write_string_file_atomic_label(q, data);
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmekint write_drop_in_format(const char *dir, const char *unit, unsigned level,
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek const char *name, const char *format, ...) {
8eea868708923a092ee85d6146ba4c04b7baea06Zbigniew Jędrzejewski-Szmek return write_drop_in(dir, unit, level, name, p);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek _cleanup_closedir_ DIR *d = NULL;
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek /* The config directories are special, since the order of the
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek * drop-ins matters */
45519fd6304aae453d95c6cf11bfc8539c38494cLennart Poettering return log_error_errno(errno, "Failed to open directory %s: %m", path);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek return log_error_errno(errno, "Failed to read directory %s: %m", path);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek f = strjoin(path, "/", de->d_name, NULL);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek r = consumer(dependency, de->d_name, f, arg);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek _cleanup_free_ char *path = NULL;
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek path = strjoin(unit_path, "/", name, suffix, NULL);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek if (!unit_path_cache || set_get(unit_path_cache, path))
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering (void) iterate_dir(path, dependency, consumer, arg, strv);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (unit_name_is_valid(name, UNIT_NAME_INSTANCE)) {
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek _cleanup_free_ char *template = NULL, *p = NULL;
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek /* Also try the template dir */
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to generate template from unit name: %m");
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek p = strjoin(unit_path, "/", template, suffix, NULL);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek if (!unit_path_cache || set_get(unit_path_cache, p))
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering (void) iterate_dir(p, dependency, consumer, arg, strv);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek _cleanup_strv_free_ char **strv = NULL, **ans = NULL;
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek unit_file_process_dir(unit_path_cache, *p, t, ".d", _UNIT_DEPENDENCY_INVALID, NULL, NULL, &strv);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek r = conf_files_list_strv(&ans, ".conf", NULL, (const char**) strv);
1a7f1b385cd9de8a0da934fadc379860f914ef33Zbigniew Jędrzejewski-Szmek return log_warning_errno(r, "Failed to get list of configuration files: %m");