From 2a8b46d16ea5d0c99831e95b47cab037f220f7af Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Wed, 15 Mar 2017 10:17:41 +0100 Subject: [PATCH] utils-systemd: introduction of systemd interface MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Isolate the interface to systemd. Change-Id: I03ea654da9fab2df0e6eec980b0e5623487d1b73 Signed-off-by: José Bollo --- src/CMakeLists.txt | 1 + src/utils-systemd.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils-systemd.h | 24 +++++++++++++++++ src/wgtpkg-unit.c | 52 +++++++++++------------------------- 4 files changed, 118 insertions(+), 36 deletions(-) create mode 100644 src/utils-systemd.c create mode 100644 src/utils-systemd.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b7c130a..f121a62 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -100,6 +100,7 @@ add_library(utils STATIC utils-dir.c utils-file.c utils-json.c + utils-systemd.c verbose.c ) diff --git a/src/utils-systemd.c b/src/utils-systemd.c new file mode 100644 index 0000000..757a52c --- /dev/null +++ b/src/utils-systemd.c @@ -0,0 +1,77 @@ +/* + Copyright 2017 IoT.bzh + + author: José Bollo + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "utils-systemd.h" + +#if !defined(SYSTEMD_UNITS_ROOT) +# define SYSTEMD_UNITS_ROOT "/usr/local/lib/systemd" +#endif + +int systemd_get_unit_path(char *path, size_t pathlen, int isuser, const char *unit, const char *uext) +{ + int rc = snprintf(path, pathlen, "%s/%s/%s.%s", + SYSTEMD_UNITS_ROOT, + isuser ? "user" : "system", + unit, + uext); + + if (rc >= 0 && (size_t)rc >= pathlen) { + errno = ENAMETOOLONG; + rc = -1; + } + return rc; +} + +int systemd_get_wants_path(char *path, size_t pathlen, int isuser, const char *wanter, const char *unit, const char *uext) +{ + int rc = snprintf(path, pathlen, "%s/%s/%s.wants/%s.%s", + SYSTEMD_UNITS_ROOT, + isuser ? "user" : "system", + wanter, + unit, + uext); + + if (rc >= 0 && (size_t)rc >= pathlen) { + errno = ENAMETOOLONG; + rc = -1; + } + return rc; +} + +int systemd_get_wants_target(char *path, size_t pathlen, const char *unit, const char *uext) +{ + int rc = snprintf(path, pathlen, "../%s.%s", unit, uext); + + if (rc >= 0 && (size_t)rc >= pathlen) { + errno = ENAMETOOLONG; + rc = -1; + } + return rc; +} + diff --git a/src/utils-systemd.h b/src/utils-systemd.h new file mode 100644 index 0000000..d149309 --- /dev/null +++ b/src/utils-systemd.h @@ -0,0 +1,24 @@ +/* + Copyright 2017 IoT.bzh + + author: José Bollo + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#pragma once + +extern int systemd_get_unit_path(char *path, size_t pathlen, int isuser, const char *unit, const char *uext); +extern int systemd_get_wants_path(char *path, size_t pathlen, int isuser, const char *wanter, const char *unit, const char *uext); +extern int systemd_get_wants_target(char *path, size_t pathlen, const char *unit, const char *uext); + diff --git a/src/wgtpkg-unit.c b/src/wgtpkg-unit.c index 9e6a1e2..f141766 100644 --- a/src/wgtpkg-unit.c +++ b/src/wgtpkg-unit.c @@ -35,13 +35,10 @@ #include "wgtpkg-mustach.h" #include "utils-json.h" #include "wgt-json.h" +#include "utils-systemd.h" #include "wgtpkg-unit.h" -#if !defined(SYSTEMD_UNITS_ROOT) -# define SYSTEMD_UNITS_ROOT "/usr/local/lib/systemd" -#endif - #if 0 #include #else @@ -388,54 +385,37 @@ static int check_unit_desc(const struct unitdesc *desc, int tells) static int get_unit_path(char *path, size_t pathlen, const struct unitdesc *desc) { - int rc; + int rc = systemd_get_unit_path( + path, pathlen, desc->scope == unitscope_user, + desc->name, desc->type == unittype_socket ? "socket" : "service"); - rc = snprintf(path, pathlen, "%s/%s/%s.%s", - SYSTEMD_UNITS_ROOT, - desc->scope == unitscope_system ? "system" : "user", - desc->name, - desc->type == unittype_socket ? "socket" : "service"); + if (rc < 0) + ERROR("can't get the unit path for %s", desc->name); - if (rc >= 0 && (size_t)rc >= pathlen) { - ERROR("can't set the unit path"); - errno = EINVAL; - rc = -1; - } return rc; } static int get_wants_path(char *path, size_t pathlen, const struct unitdesc *desc) { - int rc; + int rc = systemd_get_wants_path( + path, pathlen, desc->scope == unitscope_user, desc->wanted_by, + desc->name, desc->type == unittype_socket ? "socket" : "service"); - rc = snprintf(path, pathlen, "%s/%s/%s.wants/%s.%s", - SYSTEMD_UNITS_ROOT, - desc->scope == unitscope_system ? "system" : "user", - desc->wanted_by, - desc->name, - desc->type == unittype_socket ? "socket" : "service"); + if (rc < 0) + ERROR("can't get the wants path for %s and %s", desc->name, desc->wanted_by); - if (rc >= 0 && (size_t)rc >= pathlen) { - ERROR("can't set the wants path"); - errno = EINVAL; - rc = -1; - } return rc; } static int get_wants_target(char *path, size_t pathlen, const struct unitdesc *desc) { - int rc; + int rc = systemd_get_wants_target( + path, pathlen, + desc->name, desc->type == unittype_socket ? "socket" : "service"); - rc = snprintf(path, pathlen, "../%s.%s", - desc->name, - desc->type == unittype_socket ? "socket" : "service"); + if (rc < 0) + ERROR("can't get the wants target for %s", desc->name); - if (rc >= 0 && (size_t)rc >= pathlen) { - ERROR("can't set the wants target"); - errno = EINVAL; - rc = -1; - } return rc; } -- 2.16.6