File pacemaker-libcrmservice-find-absolute-paths-when-used-with-service.patch of Package pacemaker.12462
commit f9739f8f57cc64d6d9025f42e5c59ecfe4635817
Author: Ken Gaillot <kgaillot@redhat.com>
Date: Mon May 7 13:17:14 2018 -0500
Fix: libcrmservice: find absolute paths when used with "service:"
Previously, "service:" would work correctly only when specified with a path
relative to the LSB init directory. Now, it also works when the agent type is
an absolute path.
This also refactors the relevant code into new functions in services_lsb.c.
diff --git a/lib/services/services.c b/lib/services/services.c
index 251ea040d..caf6254cc 100644
--- a/lib/services/services.c
+++ b/lib/services/services.c
@@ -12,9 +12,7 @@
#endif
#include <sys/types.h>
-#include <sys/stat.h>
#include <stdio.h>
-
#include <errno.h>
#include <unistd.h>
#include <dirent.h>
@@ -63,18 +61,9 @@ static void handle_blocked_ops(void);
const char *
resources_find_service_class(const char *agent)
{
- char *path = NULL;
-
-#ifdef LSB_ROOT_DIR
- struct stat st;
-
- path = crm_strdup_printf("%s/%s", LSB_ROOT_DIR, agent);
- if (stat(path, &st) == 0) {
- free(path);
+ if (services__lsb_agent_exists(agent)) {
return PCMK_RESOURCE_CLASS_LSB;
}
- free(path);
-#endif
#if SUPPORT_SYSTEMD
if (systemd_unit_exists(agent)) {
@@ -235,7 +224,7 @@ resources_action_create(const char *name, const char *standard,
op->opaque->args[1] = strdup(action);
} else if (strcasecmp(op->standard, PCMK_RESOURCE_CLASS_LSB) == 0) {
- op->opaque->exec = dup_file_path(op->agent, LSB_ROOT_DIR);
+ op->opaque->exec = services__lsb_agent_path(op->agent);
op->opaque->args[0] = strdup(op->opaque->exec);
op->opaque->args[1] = strdup(op->action);
op->opaque->args[2] = NULL;
diff --git a/lib/services/services_lsb.c b/lib/services/services_lsb.c
index 69063e9a8..f0b0d12b6 100644
--- a/lib/services/services_lsb.c
+++ b/lib/services/services_lsb.c
@@ -13,6 +13,7 @@
#include <stdio.h>
#include <errno.h>
+#include <sys/stat.h>
#include <crm/crm.h>
#include <crm/services.h>
@@ -244,6 +245,25 @@ services__list_lsb_agents(void)
return services_os_get_directory_list(LSB_ROOT_DIR, TRUE, TRUE);
}
+char *
+services__lsb_agent_path(const char *agent)
+{
+ return (*agent == '/')? strdup(agent)
+ : crm_strdup_printf("%s/%s", LSB_ROOT_DIR, agent);
+}
+
+bool
+services__lsb_agent_exists(const char *agent)
+{
+ bool rc = FALSE;
+ struct stat st;
+ char *path = services__lsb_agent_path(agent);
+
+ rc = (stat(path, &st) == 0);
+ free(path);
+ return rc;
+}
+
/* The remaining functions below are not used by the Pacemaker code base, and
* are provided for API compatibility only.
*
diff --git a/lib/services/services_lsb.h b/lib/services/services_lsb.h
index 8a0d99d0e..11a07ca86 100644
--- a/lib/services/services_lsb.h
+++ b/lib/services/services_lsb.h
@@ -10,5 +10,7 @@
G_GNUC_INTERNAL int services__get_lsb_metadata(const char *type, char **output);
G_GNUC_INTERNAL GList *services__list_lsb_agents(void);
+G_GNUC_INTERNAL char *services__lsb_agent_path(const char *agent);
+G_GNUC_INTERNAL bool services__lsb_agent_exists(const char *agent);
#endif