95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen/***
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen This file is part of systemd.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Copyright 2014 Thomas H.P. Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Copyright 2010 Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Copyright 2011 Michal Schmidt
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is free software; you can redistribute it and/or modify it
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen under the terms of the GNU Lesser General Public License as published by
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen the Free Software Foundation; either version 2.1 of the License, or
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (at your option) any later version.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen systemd is distributed in the hope that it will be useful, but
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen WITHOUT ANY WARRANTY; without even the implied warranty of
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Lesser General Public License for more details.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen You should have received a copy of the GNU Lesser General Public License
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen***/
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#include <errno.h>
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#include <stdio.h>
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#include <unistd.h>
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "alloc-util.h"
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering#include "dirent-util.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "fd-util.h"
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering#include "fileio.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "hashmap.h"
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering#include "hexdecoct.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "install.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "log.h"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#include "mkdir.h"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen#include "path-lookup.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "path-util.h"
f2341e0a87cab1558c84c933956e9181d5fb6c52Lennart Poettering#include "set.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "special.h"
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering#include "stat-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "string-util.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "strv.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "unit-name.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "util.h"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersentypedef enum RunlevelType {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen RUNLEVEL_UP,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen RUNLEVEL_DOWN
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen} RunlevelType;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic const struct {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen const char *path;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen const char *target;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen const RunlevelType type;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen} rcnd_table[] = {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Standard SysV runlevels for start-up */
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering { "rc1.d", SPECIAL_RESCUE_TARGET, RUNLEVEL_UP },
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering { "rc2.d", SPECIAL_MULTI_USER_TARGET, RUNLEVEL_UP },
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering { "rc3.d", SPECIAL_MULTI_USER_TARGET, RUNLEVEL_UP },
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering { "rc4.d", SPECIAL_MULTI_USER_TARGET, RUNLEVEL_UP },
d5d8429a12c4b1ef0dcd226c0904f00f4fa4898aLennart Poettering { "rc5.d", SPECIAL_GRAPHICAL_TARGET, RUNLEVEL_UP },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Standard SysV runlevels for shutdown */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "rc0.d", SPECIAL_POWEROFF_TARGET, RUNLEVEL_DOWN },
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen { "rc6.d", SPECIAL_REBOOT_TARGET, RUNLEVEL_DOWN }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Note that the order here matters, as we read the
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen directories in this order, and we want to make sure that
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen sysv_start_priority is known when we first load the
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen unit. And that value we only know from S links. Hence
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen UP must be read before DOWN */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen};
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmekconst char *arg_dest = "/tmp";
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersentypedef struct SysvStub {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *name;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *path;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *description;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int sysv_start_priority;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *pid_file;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char **before;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char **after;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char **wants;
260ad50f5b4a9795032e3119c64f838a2d03370dThomas Hindoe Paaboel Andersen char **wanted_by;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char **conflicts;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen bool has_lsb;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen bool reload;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering bool loaded;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen} SysvStub;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmekstatic void free_sysvstub(SysvStub *s) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!s)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free(s->name);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free(s->path);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free(s->description);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free(s->pid_file);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek strv_free(s->before);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek strv_free(s->after);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek strv_free(s->wants);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek strv_free(s->wanted_by);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek strv_free(s->conflicts);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free(s);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek}
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-SzmekDEFINE_TRIVIAL_CLEANUP_FUNC(SysvStub*, free_sysvstub);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmekstatic void free_sysvstub_hashmapp(Hashmap **h) {
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek SysvStub *stub;
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek while ((stub = hashmap_steal_first(*h)))
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek free_sysvstub(stub);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek hashmap_free(*h);
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int add_symlink(const char *service, const char *where) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *from, *to;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert(service);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert(where);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering from = strjoina(arg_dest, "/", service);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering to = strjoina(arg_dest, "/", where, ".wants/", service);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen mkdir_parents_label(to, 0755);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = symlink(from, to);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (r < 0) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (errno == EEXIST)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return -errno;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 1;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
b7e7184634d573fb73143210962acce205f37f61Michael Bieblstatic int add_alias(const char *service, const char *alias) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *link;
b7e7184634d573fb73143210962acce205f37f61Michael Biebl int r;
b7e7184634d573fb73143210962acce205f37f61Michael Biebl
b7e7184634d573fb73143210962acce205f37f61Michael Biebl assert(service);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl assert(alias);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering link = strjoina(arg_dest, "/", alias);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl
b7e7184634d573fb73143210962acce205f37f61Michael Biebl r = symlink(service, link);
b7e7184634d573fb73143210962acce205f37f61Michael Biebl if (r < 0) {
b7e7184634d573fb73143210962acce205f37f61Michael Biebl if (errno == EEXIST)
b7e7184634d573fb73143210962acce205f37f61Michael Biebl return 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
b7e7184634d573fb73143210962acce205f37f61Michael Biebl return -errno;
b7e7184634d573fb73143210962acce205f37f61Michael Biebl }
b7e7184634d573fb73143210962acce205f37f61Michael Biebl
b7e7184634d573fb73143210962acce205f37f61Michael Biebl return 1;
b7e7184634d573fb73143210962acce205f37f61Michael Biebl}
b7e7184634d573fb73143210962acce205f37f61Michael Biebl
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int generate_unit_file(SysvStub *s) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_fclose_ FILE *f = NULL;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *unit;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering char **p;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(s);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!s->loaded)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering unit = strjoina(arg_dest, "/", s->name);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt /* We might already have a symlink with the same name from a Provides:,
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt * or from backup files like /etc/init.d/foo.bak. Real scripts always win,
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt * so remove an existing link */
4e5589836c9e143796c3f3d81e67ab7a9209e2b0Martin Pitt if (is_symlink(unit) > 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_warning("Overwriting existing symlink %s with real service.", unit);
9993ef2e9817b35b1d467707bef12b2a140b62dcLennart Poettering (void) unlink(unit);
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt }
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen f = fopen(unit, "wxe");
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (!f)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to create unit file %s: %m", unit);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fprintf(f,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "# Automatically generated by systemd-sysv-generator\n\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "[Unit]\n"
aad0a2c80097926757d4385e5f5492082d47f006Zbigniew Jędrzejewski-Szmek "Documentation=man:systemd-sysv-generator(8)\n"
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering "SourcePath=%s\n",
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering s->path);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (s->description)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering fprintf(f, "Description=%s\n", s->description);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn STRV_FOREACH(p, s->before)
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn fprintf(f, "Before=%s\n", *p);
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn STRV_FOREACH(p, s->after)
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn fprintf(f, "After=%s\n", *p);
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn STRV_FOREACH(p, s->wants)
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn fprintf(f, "Wants=%s\n", *p);
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn STRV_FOREACH(p, s->conflicts)
c584ffc0b75d4b9e9229bf1d8edb7d89562be3c1Lukas Nykryn fprintf(f, "Conflicts=%s\n", *p);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fprintf(f,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "\n[Service]\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "Type=forking\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "Restart=no\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "TimeoutSec=5min\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "IgnoreSIGPIPE=no\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "KillMode=process\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "GuessMainPID=no\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "RemainAfterExit=%s\n",
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen yes_no(!s->pid_file));
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (s->pid_file)
d171ed1c50ba64928b7fb30ee2ae729fdfe0826bThomas Hindoe Paaboel Andersen fprintf(f, "PIDFile=%s\n", s->pid_file);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fprintf(f,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "ExecStart=%s start\n"
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "ExecStop=%s stop\n",
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen s->path, s->path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (s->reload)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fprintf(f, "ExecReload=%s reload\n", s->path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = fflush_and_check(f);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(r, "Failed to write unit %s: %m", unit);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
260ad50f5b4a9795032e3119c64f838a2d03370dThomas Hindoe Paaboel Andersen STRV_FOREACH(p, s->wanted_by) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = add_symlink(s->name, *p);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_warning_errno(r, "Failed to create 'Wants' symlink to %s, ignoring: %m", *p);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return 1;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic bool usage_contains_reload(const char *line) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return (strcasestr(line, "{reload|") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen strcasestr(line, "{reload}") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen strcasestr(line, "{reload\"") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen strcasestr(line, "|reload|") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen strcasestr(line, "|reload}") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen strcasestr(line, "|reload\""));
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic char *sysv_translate_name(const char *name) {
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann _cleanup_free_ char *c = NULL;
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann char *res;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
264581a2f1599a27de577549dc75fccefef6a579Felipe Sateler c = strdup(name);
264581a2f1599a27de577549dc75fccefef6a579Felipe Sateler if (!c)
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann return NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann res = endswith(c, ".sh");
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann if (res)
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann *res = 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann if (unit_name_mangle(c, UNIT_NAME_NOGLOB, &res) < 0)
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann return NULL;
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann
0b2ec8a3bfdd6118b3b4958d236ee203ad420f28David Herrmann return res;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poetteringstatic int sysv_translate_facility(const char *name, const char *filename, char **ret) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* We silently ignore the $ prefix here. According to the LSB
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * spec it simply indicates whether something is a
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * standardized name or a distribution-specific one. Since we
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * just follow what already exists and do not introduce new
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * uses or names we don't care who introduced a new name. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen static const char * const table[] = {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* LSB defined facilities */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "local_fs", NULL,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "network", SPECIAL_NETWORK_ONLINE_TARGET,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "named", SPECIAL_NSS_LOOKUP_TARGET,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "portmap", SPECIAL_RPCBIND_TARGET,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "remote_fs", SPECIAL_REMOTE_FS_TARGET,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "syslog", NULL,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen "time", SPECIAL_TIME_SYNC_TARGET,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen };
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering char *filename_no_sh, *e, *m;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen const char *n;
4e4885553447f6f4c014bfa3e5b5837a76a0e612Lennart Poettering unsigned i;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert(name);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(filename);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(ret);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen n = *name == '$' ? name + 1 : name;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen for (i = 0; i < ELEMENTSOF(table); i += 2) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!streq(table[i], n))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!table[i+1])
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering m = strdup(table[i+1]);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!m)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering *ret = m;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return 1;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering /* If we don't know this name, fallback heuristics to figure
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering * out whether something is a target or a service alias. */
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering /* Facilities starting with $ are most likely targets */
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (*name == '$') {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = unit_name_build(n, NULL, ".target", ret);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(r, "Failed to build name: %m");
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering /* Strip ".sh" suffix from file name for comparison */
4e4885553447f6f4c014bfa3e5b5837a76a0e612Lennart Poettering filename_no_sh = strdupa(filename);
40780877c19ef408da8ab21f4156cfc153f94b5cMartin Pitt e = endswith(filename_no_sh, ".sh");
3315f085178f46155fda345d9526c09083b45946Lennart Poettering if (e) {
4e4885553447f6f4c014bfa3e5b5837a76a0e612Lennart Poettering *e = '\0';
3315f085178f46155fda345d9526c09083b45946Lennart Poettering filename = filename_no_sh;
3315f085178f46155fda345d9526c09083b45946Lennart Poettering }
29e0e6d8c1f7f648b7c998880d034eaa3e58c53aMartin Pitt
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering /* Names equaling the file name of the services are redundant */
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (streq_ptr(n, filename))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering /* Everything else we assume to be normal service names */
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering m = sysv_translate_name(n);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!m)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering *ret = m;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 1;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmekstatic int handle_provides(SysvStub *s, unsigned line, const char *full_text, const char *text) {
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek int r;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(s);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(full_text);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(text);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering for (;;) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_free_ char *word = NULL, *m = NULL;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = extract_first_word(&text, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(r, "Failed to parse word from provides string: %m");
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r == 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering break;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = sysv_translate_facility(word, basename(s->path), &m);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r <= 0) /* continue on error */
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek continue;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering switch (unit_name_to_type(m)) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering case UNIT_SERVICE:
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek log_debug("Adding Provides: alias '%s' for '%s'", m, s->name);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = add_alias(s->name, m);
e987f2a809c6bab7e7bae4ca8f598ea5bafd5225Zbigniew Jędrzejewski-Szmek if (r < 0)
f2341e0a87cab1558c84c933956e9181d5fb6c52Lennart Poettering log_warning_errno(r, "[%s:%u] Failed to add LSB Provides name %s, ignoring: %m", s->path, line, m);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering break;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering case UNIT_TARGET:
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek /* NB: SysV targets which are provided by a
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek * service are pulled in by the services, as
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek * an indication that the generic service is
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek * now available. This is strictly one-way.
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek * The targets do NOT pull in SysV services! */
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(&s->before, m);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(&s->wants, m);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET)) {
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(&s->before, SPECIAL_NETWORK_TARGET);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return log_oom();
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek }
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering break;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering case _UNIT_TYPE_INVALID:
2c09a745eba5f463e12b498a2f62a5036253c55cFelipe Sateler log_warning("Unit name '%s' is invalid", m);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering break;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering default:
2c09a745eba5f463e12b498a2f62a5036253c55cFelipe Sateler log_warning("Unknown unit type for unit '%s'", m);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek }
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return 0;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek}
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmekstatic int handle_dependencies(SysvStub *s, unsigned line, const char *full_text, const char *text) {
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek int r;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(s);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(full_text);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(text);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering for (;;) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_free_ char *word = NULL, *m = NULL;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering bool is_before;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = extract_first_word(&text, &word, NULL, EXTRACT_QUOTES|EXTRACT_RELAX);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(r, "Failed to parse word from provides string: %m");
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r == 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering break;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = sysv_translate_facility(word, basename(s->path), &m);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r <= 0) /* continue on error */
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek continue;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek is_before = startswith_no_case(full_text, "X-Start-Before:");
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (streq(m, SPECIAL_NETWORK_ONLINE_TARGET) && !is_before) {
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek /* the network-online target is special, as it needs to be actively pulled in */
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(&s->after, m);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(&s->wants, m);
e987f2a809c6bab7e7bae4ca8f598ea5bafd5225Zbigniew Jędrzejewski-Szmek } else
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = strv_extend(is_before ? &s->before : &s->after, m);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
e987f2a809c6bab7e7bae4ca8f598ea5bafd5225Zbigniew Jędrzejewski-Szmek return log_oom();
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek }
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return 0;
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek}
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int load_sysv(SysvStub *s) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_fclose_ FILE *f;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen unsigned line = 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen enum {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen NORMAL,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen DESCRIPTION,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen LSB,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen LSB_DESCRIPTION,
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen USAGE_CONTINUATION
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *short_description = NULL, *long_description = NULL, *chkconfig_description = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *description;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen bool supports_reload = false;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering char l[LINE_MAX];
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert(s);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen f = fopen(s->path, "re");
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!f) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (errno == ENOENT)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(errno, "Failed to open %s: %m", s->path);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
77354c7e6f096a447245a8781c1eaa4acbe67089Martin Pitt
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_debug("Loading SysV script %s", s->path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering FOREACH_LINE(l, f, goto fail) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering char *t;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen line++;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen t = strstrip(l);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (*t != '#') {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Try to figure out whether this init script supports
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * the reload operation. This heuristic looks for
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * "Usage" lines which include the reload option. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if ( state == USAGE_CONTINUATION ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (state == NORMAL && strcasestr(t, "usage"))) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (usage_contains_reload(t)) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen supports_reload = true;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (t[strlen(t)-1] == '\\')
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = USAGE_CONTINUATION;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (state == NORMAL && streq(t, "### BEGIN INIT INFO")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen s->has_lsb = true;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if ((state == LSB_DESCRIPTION || state == LSB) && streq(t, "### END INIT INFO")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen t++;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen t += strspn(t, WHITESPACE);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (state == NORMAL) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Try to parse Red Hat style description */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (startswith_no_case(t, "description:")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering size_t k;
859fdd1eeab7f403c761dde79e168805f43fcf89Thomas Hindoe Paaboel Andersen const char *j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering k = strlen(t);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (k > 0 && t[k-1] == '\\') {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = DESCRIPTION;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen t[k-1] = 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strstrip(t+12);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (isempty(j))
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering j = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = free_and_strdup(&chkconfig_description, j);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (startswith_no_case(t, "pidfile:")) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *fn;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fn = strstrip(t+8);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!path_is_absolute(fn)) {
f2341e0a87cab1558c84c933956e9181d5fb6c52Lennart Poettering log_error("[%s:%u] PID file not absolute. Ignoring.", s->path, line);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = free_and_strdup(&s->pid_file, fn);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (state == DESCRIPTION) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* Try to parse Red Hat style description
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * continuation */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering size_t k;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering k = strlen(t);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (k > 0 && t[k-1] == '\\')
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen t[k-1] = 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = NORMAL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strstrip(t);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!isempty(j)) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *d = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (chkconfig_description)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = strjoin(chkconfig_description, " ", j, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = strdup(j);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!d)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen free(chkconfig_description);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen chkconfig_description = d;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (state == LSB || state == LSB_DESCRIPTION) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (startswith_no_case(t, "Provides:")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = handle_provides(s, line, t, t + 9);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return r;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (startswith_no_case(t, "Required-Start:") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen startswith_no_case(t, "Should-Start:") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen startswith_no_case(t, "X-Start-Before:") ||
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen startswith_no_case(t, "X-Start-After:")) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek r = handle_dependencies(s, line, t, strchr(t, ':') + 1);
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek if (r < 0)
1e2fee5f757c0bb3a6fea216b1e10ee7b3c0e12eZbigniew Jędrzejewski-Szmek return r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (startswith_no_case(t, "Description:")) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB_DESCRIPTION;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strstrip(t+12);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (isempty(j))
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering j = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = free_and_strdup(&long_description, j);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (startswith_no_case(t, "Short-Description:")) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strstrip(t+18);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (isempty(j))
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering j = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = free_and_strdup(&short_description, j);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (state == LSB_DESCRIPTION) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (startswith(l, "#\t") || startswith(l, "# ")) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering const char *j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen j = strstrip(t);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!isempty(j)) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *d = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (long_description)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = strjoin(long_description, " ", t, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = strdup(j);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!d)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen free(long_description);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen long_description = d;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen state = LSB;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen s->reload = supports_reload;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* We use the long description only if
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * no short description is set. */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (short_description)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen description = short_description;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else if (chkconfig_description)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen description = chkconfig_description;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else if (long_description)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen description = long_description;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen description = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (description) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char *d;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = strappend(s->has_lsb ? "LSB: " : "SYSV: ", description);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!d)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen s->description = d;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering s->loaded = true;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poetteringfail:
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_error_errno(errno, "Failed to read configuration file '%s': %m", s->path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenstatic int fix_order(SysvStub *s, Hashmap *all_services) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen SysvStub *other;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Iterator j;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen assert(s);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!s->loaded)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (s->sysv_start_priority < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen HASHMAP_FOREACH(other, all_services, j) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (s == other)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!other->loaded)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering continue;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (other->sysv_start_priority < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* If both units have modern headers we don't care
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen * about the priorities */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (s->has_lsb && other->has_lsb)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (other->sysv_start_priority < s->sysv_start_priority) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = strv_extend(&s->after, other->name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (r < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering } else if (other->sysv_start_priority > s->sysv_start_priority) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = strv_extend(&s->before, other->name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (r < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering } else
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen /* FIXME: Maybe we should compare the name here lexicographically? */
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
a8ffe6fbcbfdba39aef8dce8b298b3e0cb377c0eZbigniew Jędrzejewski-Szmekstatic int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen char **path;
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(lp);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(all_services);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
a8ffe6fbcbfdba39aef8dce8b298b3e0cb377c0eZbigniew Jędrzejewski-Szmek STRV_FOREACH(path, lp->sysvinit_path) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_closedir_ DIR *d = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen struct dirent *de;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = opendir(*path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!d) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (errno != ENOENT)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_warning_errno(errno, "Opening %s failed, ignoring: %m", *path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering FOREACH_DIRENT(de, d, log_error_errno(errno, "Failed to enumerate directory %s, ignoring: %m", *path)) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_free_ char *fpath = NULL, *name = NULL;
8fba1c8d4e3d05d2af2848b6570bdc09e725d06eZbigniew Jędrzejewski-Szmek _cleanup_(free_sysvstubp) SysvStub *service = NULL;
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering struct stat st;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
7b729f8686a83b24f3d9a891cde1c35a6aa37cf9Lukas Nykryn if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_warning_errno(errno, "stat() failed on %s/%s, ignoring: %m", *path, de->d_name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!(st.st_mode & S_IXUSR))
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering if (!S_ISREG(st.st_mode))
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering continue;
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen name = sysv_translate_name(de->d_name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!name)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
a986501b9059b72e8deced262554fbdd1ab9da17Lennart Poettering if (hashmap_contains(all_services, name))
a986501b9059b72e8deced262554fbdd1ab9da17Lennart Poettering continue;
a986501b9059b72e8deced262554fbdd1ab9da17Lennart Poettering
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering r = unit_file_lookup_state(UNIT_FILE_SYSTEM, NULL, lp, name, NULL);
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering if (r < 0 && r != -ENOENT) {
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering log_debug_errno(r, "Failed to detect whether %s exists, skipping: %m", name);
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering continue;
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering } else if (r >= 0) {
0ec0deaa30d0e68430f03fa6f32affa576481d18Lennart Poettering log_debug("Native unit for %s already exists, skipping.", name);
f4f01ec146d91cb6943828851d98eee6a1ad4dd9Martin Pitt continue;
f4f01ec146d91cb6943828851d98eee6a1ad4dd9Martin Pitt }
f4f01ec146d91cb6943828851d98eee6a1ad4dd9Martin Pitt
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering fpath = strjoin(*path, "/", de->d_name, NULL);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!fpath)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen service = new0(SysvStub, 1);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!service)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen service->sysv_start_priority = -1;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen service->name = name;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen service->path = fpath;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering name = fpath = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = hashmap_put(all_services, service->name, service);
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering if (r < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
805e5dda0a01c99d231824e1a9c4a208418bf342Lennart Poettering service = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
a8ffe6fbcbfdba39aef8dce8b298b3e0cb377c0eZbigniew Jędrzejewski-Szmekstatic int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_services) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Set *runlevel_services[ELEMENTSOF(rcnd_table)] = {};
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen _cleanup_set_free_ Set *shutdown_services = NULL;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering SysvStub *service;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering unsigned i;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering Iterator j;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering char **p;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering assert(lp);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering STRV_FOREACH(p, lp->sysvrcnd_path) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen for (i = 0; i < ELEMENTSOF(rcnd_table); i ++) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_closedir_ DIR *d = NULL;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_free_ char *path = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen struct dirent *de;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen path = strjoin(*p, "/", rcnd_table[i].path, NULL);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (!path) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen d = opendir(path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!d) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (errno != ENOENT)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_warning_errno(errno, "Opening %s failed, ignoring: %m", path);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering FOREACH_DIRENT(de, d, log_error_errno(errno, "Failed to enumerate directory %s, ignoring: %m", path)) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_free_ char *name = NULL, *fpath = NULL;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen int a, b;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (de->d_name[0] != 'S' && de->d_name[0] != 'K')
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (strlen(de->d_name) < 4)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen a = undecchar(de->d_name[1]);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen b = undecchar(de->d_name[2]);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (a < 0 || b < 0)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen fpath = strjoin(*p, "/", de->d_name, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!fpath) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen name = sysv_translate_name(de->d_name + 3);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!name) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
8c84621c25c563c7428f3d355136fc542389aab8Thomas Hindoe Paaboel Andersen service = hashmap_get(all_services, name);
8c84621c25c563c7428f3d355136fc542389aab8Thomas Hindoe Paaboel Andersen if (!service){
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_debug("Ignoring %s symlink in %s, not generating %s.", de->d_name, rcnd_table[i].path, name);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen continue;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (de->d_name[0] == 'S') {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (rcnd_table[i].type == RUNLEVEL_UP)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering service->sysv_start_priority = MAX(a*10 + b, service->sysv_start_priority);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt r = set_ensure_allocated(&runlevel_services[i], NULL);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = set_put(runlevel_services[i], service);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen } else if (de->d_name[0] == 'K' &&
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen (rcnd_table[i].type == RUNLEVEL_DOWN)) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt r = set_ensure_allocated(&shutdown_services, NULL);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = set_put(shutdown_services, service);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen for (i = 0; i < ELEMENTSOF(rcnd_table); i ++)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen SET_FOREACH(service, runlevel_services[i], j) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = strv_extend(&service->before, rcnd_table[i].target);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
260ad50f5b4a9795032e3119c64f838a2d03370dThomas Hindoe Paaboel Andersen r = strv_extend(&service->wanted_by, rcnd_table[i].target);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen SET_FOREACH(service, shutdown_services, j) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = strv_extend(&service->before, SPECIAL_SHUTDOWN_TARGET);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = strv_extend(&service->conflicts, SPECIAL_SHUTDOWN_TARGET);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen r = 0;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenfinish:
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen for (i = 0; i < ELEMENTSOF(rcnd_table); i++)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen set_free(runlevel_services[i]);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersenint main(int argc, char *argv[]) {
5921fc3cc36df4baa5e16060e7675ace9eda2befThomas Hindoe Paaboel Andersen _cleanup_(free_sysvstub_hashmapp) Hashmap *all_services = NULL;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering _cleanup_lookup_paths_free_ LookupPaths lp = {};
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen SysvStub *service;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen Iterator j;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering int r;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (argc > 1 && argc != 4) {
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen log_error("This program takes three or no arguments.");
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen return EXIT_FAILURE;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (argc > 1)
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen arg_dest = argv[3];
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen log_set_target(LOG_TARGET_SAFE);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen log_parse_environment();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen log_open();
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen umask(0022);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
b2c23da8cea1987a1a329f5a964d3299b7ca7890Lennart Poettering r = lookup_paths_init(&lp, MANAGER_SYSTEM, true, NULL, NULL, NULL, NULL);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (r < 0) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering log_error_errno(r, "Failed to find lookup paths: %m");
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
d5099efc47d4e6ac60816b5381a5f607ab03f06eMichal Schmidt all_services = hashmap_new(&string_hash_ops);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen if (!all_services) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = log_oom();
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
a8ffe6fbcbfdba39aef8dce8b298b3e0cb377c0eZbigniew Jędrzejewski-Szmek r = enumerate_sysv(&lp, all_services);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
a8ffe6fbcbfdba39aef8dce8b298b3e0cb377c0eZbigniew Jędrzejewski-Szmek r = set_dependencies_from_rcnd(&lp, all_services);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering if (r < 0)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering goto finish;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering HASHMAP_FOREACH(service, all_services, j)
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering (void) load_sysv(service);
b3fae863ef548add2d01c3956ce7720f4eeeca7eLennart Poettering
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen HASHMAP_FOREACH(service, all_services, j) {
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering (void) fix_order(service, all_services);
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering (void) generate_unit_file(service);
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen }
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering r = 0;
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poetteringfinish:
c279613f861636c816f2f7df051b02c2f55a5134Lennart Poettering return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
95ed3294c632f5606327149f10cef1eb34422862Thomas Hindoe Paaboel Andersen}