Fix #100: Adjust path to COND_RECONF /var/run symlink may be missing

On systems with the new /run hierarchy the compat symlink from /var/run
may be missing, or not yet be set up by bootmisc.so.  This patch adds a
layer of safety to the condition layer, both set and get cond ops now
perform an adjustmed of the condition path if needed.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson committed 2018-03-18 11:49:27 +01:00
1 parent 90249e50ef
commit dc7039b8d8
3 files changed
+26 -5

No files matched your search

+6 -2
View File
@@ -31,12 +31,16 @@
#include "pid.h"
#include "service.h"
static int cond_set_gen(const char *path, unsigned int gen)
static int cond_set_gen(const char *file, unsigned int gen)
{
char *ptr, path[256];
FILE *fp;
int ret;
fp = fopen(path, "w");
/* /var/run --> /run symlink may not exist (yet) */
ptr = pid_runpath(file, path, sizeof(path));
fp = fopen(ptr, "w");
if (!fp)
return -1;
+6 -2
View File
@@ -51,13 +51,17 @@ const char *cond_path(const char *name)
return pid_runpath(tmp, file, sizeof(file));
}
unsigned int cond_get_gen(const char *path)
unsigned int cond_get_gen(const char *file)
{
char *ptr, path[256];
unsigned int gen;
FILE *fp;
int ret;
fp = fopen(path, "r");
/* /var/run --> /run symlink may not exist (yet) */
ptr = pid_runpath(file, path, sizeof(path));
fp = fopen(ptr, "r");
if (!fp)
return 0;
+14 -1
View File
@@ -34,7 +34,17 @@ char *pid_file (svc_t *svc);
int pid_file_create (svc_t *svc);
int pid_file_parse (svc_t *svc, char *arg);
static inline char *pid_runpath(char *file, char *path, size_t len)
/**
* pid_runpath - Adjust /var/run --> /run path depending on system
* @file: Path to file in /run/path or /var/run/path
* @path: Pointer to buffer to write correct path
* @len: Length, in bytes, of @path buffer
*
* Returns:
* Always returns a valid pointer, which can be either @path with a /run
* or /var/run prefix to @file, or it may be @file if the prefix is OK.
*/
static inline char *pid_runpath(const char *file, char *path, size_t len)
{
static int unknown = 1;
static char *prefix = "/var/run";
@@ -45,6 +55,9 @@ static inline char *pid_runpath(char *file, char *path, size_t len)
unknown = 0;
}
if (!strncmp(file, prefix, strlen(prefix)))
return (char *)file;
if (!strncmp(file, "/var/run/", 9))
file += 9;
else if (!strncmp(file, "/run/", 5))