Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
d615b2d
Doc: build: Explain use of -std=c99 with cov-build
nrwahl2 May 13, 2026
f26fa96
Refactor: libcrmcommon, libpe_status: Drop an unused Coverity annotation
nrwahl2 May 5, 2026
0d6daa0
Refactor: libcrmcommon: Simplify crm_ipc_close()
nrwahl2 May 5, 2026
ba78709
Refactor: libcrmcommon: Simplify crm_ipc_destroy()
nrwahl2 May 5, 2026
4224a3f
Refactor: libcrmcommon: Simplify mainloop_gio_destroy()
nrwahl2 May 5, 2026
f954cd0
Refactor: libcrmcommon: Simplify freeing of client->channel
nrwahl2 May 5, 2026
5da9a6a
Refactor: liblrmd: Make/rename some variables in lrmd_dispatch_internal
nrwahl2 May 5, 2026
a993a6d
Refactor: liblrmd: Unindent in a few more places
nrwahl2 May 5, 2026
26727be
API: libcrmcommon: did_rsc_op_fail() argument is now const
nrwahl2 May 5, 2026
e50ef2a
API: liblrmd: lrmd_copy_event() argument is now const
nrwahl2 May 5, 2026
b19effa
Refactor: various: const lrmd_event_data_t in internal functions
nrwahl2 May 5, 2026
955b900
API: liblrmd: lrmd_event_data_t char * members are now non-const
nrwahl2 May 5, 2026
9d55070
Low: cts-lab: Fix corosync-ignore pattern for CPG API connection failed
nrwahl2 May 5, 2026
fb04a1d
Refactor: liblrmd: Inline lrmd__reset_result()
nrwahl2 May 5, 2026
96aaa23
Refactor: libcrmcommon: Use pcmk__str_update() in pcmk__set_result()
nrwahl2 May 5, 2026
a6ce8ec
Refactor: libcrmservice: Drop services__grab_{stdout,stderr}()
nrwahl2 May 5, 2026
0eeef22
Refactor: fencer: Drop list_to_string() terminate_with_delim argument
nrwahl2 May 5, 2026
8092b2c
Refactor: fencer: Simplify list_to_string() a bit further
nrwahl2 May 5, 2026
391a9eb
Refactor: fencer: Drop some elses in execute_agent_action()
nrwahl2 May 5, 2026
11dc83a
Refactor: fencer: Drop list_to_string()
nrwahl2 May 5, 2026
cff1832
Refactor: libcrmcommon: Drop pcmk__set_result_output()
nrwahl2 May 5, 2026
4c5fa0d
Feature: libcib: Assert on allocation error when creating new cib_t
nrwahl2 May 9, 2026
618ec37
Refactor: libcrmcommon: Make pcmk__dup_alert() static
nrwahl2 May 13, 2026
61858ce
Low: libcrmcommon: Avoid memory leak when creating alert recipient entry
nrwahl2 May 13, 2026
afddef4
Refactor: libpe_status: Change a condition in pe__unpack_bundle()
nrwahl2 May 13, 2026
24c6f4a
Refactor: libpe_status: Use bool in pe__unpack_bundle()
nrwahl2 May 14, 2026
1c2205c
Refactor: libpe_status: Rename GLib iterators to iter and iter2
nrwahl2 May 14, 2026
790e899
Refactor: libpe_status: Drop strdup() within bundle.c
nrwahl2 May 14, 2026
3eca7f8
Refactor: libpe_status: Functionize getting container XML for bundle
nrwahl2 May 14, 2026
547af90
Refactor: libpe_status: New unpack_bundle_container()
nrwahl2 May 14, 2026
cebca57
Refactor: libpe_status: New unpack_bundle_network()
nrwahl2 May 14, 2026
49a7dea
Refactor: libpe_status: New unpack_bundle_storage()
nrwahl2 May 14, 2026
b5a3dc4
Refactor: libpe_status: New unpack_bundle_primitive()
nrwahl2 May 14, 2026
ef733d1
Refactor: libpe_status: Use pcmk__xe_set_{int,bool} in unpack primitive
nrwahl2 May 14, 2026
029fa35
Refactor: libpe_status: Drop data arg from create_replica_resources()
nrwahl2 May 14, 2026
d3bcc63
Refactor: libpe_status: Drop redundant valid_network() call
nrwahl2 May 14, 2026
a25f1c1
Refactor: libpe_status: Clean up valid_network()
nrwahl2 May 14, 2026
91ec42a
Low: libpe_status: Clear unique flag on setting nreplicas_per_host to 1
nrwahl2 May 14, 2026
eee22f9
Refactor: libpe_status: Set globally-unique based on rsc unique flag
nrwahl2 May 14, 2026
06c754f
Refactor: libpe_status: Rename variables in unpack_bundle_primitive()
nrwahl2 May 14, 2026
cfdbb4a
Refactor: libpe_status: New create_child_resource() in bundle.c
nrwahl2 May 14, 2026
0faa275
Refactor: libpe_status: Drop most uses of bundle_data->prefix
nrwahl2 May 14, 2026
bf0ae35
Refactor: libpe_status: Drop agent_type validation for bundles
nrwahl2 May 14, 2026
f952ddd
Refactor: libpe_status: allocate_ip() takes a pcmk_resource_t argument
nrwahl2 May 14, 2026
e334e35
Refactor: libpe_status: Drop pe__bundle_variant_data_t:prefix
nrwahl2 May 14, 2026
809e027
Refactor: libpe_status: New create_simple_replicas()
nrwahl2 May 14, 2026
e2152fb
Medium: libpe_status: Fix double-free in pe__unpack_bundle()
nrwahl2 May 14, 2026
2e18f71
Refactor: libpe_status: Move utilization to create_replica_resources()
nrwahl2 May 14, 2026
092704f
Low: libcrmcommon, tools: Fix NULL dereference in crm_resource.c
nrwahl2 May 14, 2026
57f57d3
Refactor: libcrmcommon: Check controld API reply type
nrwahl2 May 14, 2026
b4c6ade
Low: libpacemaker: Fix list memory leaks in pcmk_agents.c
nrwahl2 May 14, 2026
e1fd5fd
Low: devel: Provide a model of g_clear_pointer() for Coverity
nrwahl2 May 23, 2026
1c6d3b6
Low: libcrmcommon: Suppress INCOMPLETE_DEALLOCATOR false positive
nrwahl2 May 5, 2026
38e1246
Refactor: executor: Drop dead_error_line Coverity suppression
nrwahl2 May 23, 2026
54c773e
Refactor: libcrmcommon: Drop unused Coverity +kill annotations
nrwahl2 May 23, 2026
88485ea
Refactor: libstonithd: Drop result_independent_of_operands suppression
nrwahl2 May 23, 2026
a574602
Refactor: libcrmservice: Drop check_after_deref Coverity suppression
nrwahl2 May 23, 2026
35daf6e
Refactor: libcrmcommon: Drop null_field Coverity suppression
nrwahl2 May 23, 2026
11593f2
Refactor: libcrmcluster: Drop Coverity -alloc function annotation
nrwahl2 May 24, 2026
9d424b0
Refactor: libcrmcommon: Drop echo argument from pcmk__output_t:prompt
nrwahl2 May 24, 2026
89bbda2
Refactor: various: Don't free *dest in pcmk__output_t:prompt
nrwahl2 May 24, 2026
dcee873
Refactor: libcrmcommon: Unindent pcmk__text_prompt()
nrwahl2 May 24, 2026
d31f4c0
Refactor: libcrmcommon: Use getline() in pcmk__text_prompt()
nrwahl2 May 24, 2026
7a413b0
Doc: tools: Add info about scanw() using const
nrwahl2 May 24, 2026
8b0c806
Refactor: build: New PCMK__CURSES_H macro constant
nrwahl2 May 25, 2026
9ac7412
Low: build: Check for NCURSES_CONST macro definition
nrwahl2 May 25, 2026
c51bc0d
Low: build: Ignore curses library unless it's ncurses
nrwahl2 May 25, 2026
c11da84
Refactor: libcrmcommon: Unindent decode_transition_magic()
nrwahl2 May 25, 2026
6d54705
Feature: libcrmcommon: decode_transition_magic() validates more strictly
nrwahl2 May 25, 2026
33de2f4
Refactor: build: Drop HAVE_SSCANF_M
nrwahl2 May 25, 2026
78d32cc
Refactor: libstonithd: Drop null_field Coverity suppression
nrwahl2 May 25, 2026
b9ea858
Refactor: libpe_status: Drop NULL_FIELD coverity suppression
nrwahl2 May 25, 2026
501e749
Refactor: libpe_status: Clarify is_set_recursive() somewhat
nrwahl2 May 27, 2026
991652d
Refactor: libpe_status: New rsc_managed_recursive()
nrwahl2 May 28, 2026
b5b080f
Refactor: libpe_status: Drop pcmk__is_set_recursive() any argument
nrwahl2 May 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 44 additions & 51 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -1221,19 +1221,6 @@ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
[AC_MSG_ERROR([strerror() is not C99-compliant])],
[AC_MSG_ERROR([strerror() is not C99-compliant])])

AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]], [[
const char *s = "some-command-line-arg";
char *name = NULL;
int n = sscanf(s, "%ms", &name);
return n != 1;
]])],
[have_sscanf_m="yes"],
[have_sscanf_m="no"],
[have_sscanf_m="no"])
AS_IF([test x"$have_sscanf_m" = x"yes"],
[AC_DEFINE([HAVE_SSCANF_M], [1],
[Define to 1 if sscanf %m modifier is available])])

AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <time.h>]], [[
char s[200];
time_t t;
Expand Down Expand Up @@ -1292,31 +1279,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <signal.h>]], [[sighandler_t *f;]]
dnl ========================================================================
dnl ncurses
dnl ========================================================================
dnl
dnl A few OSes (e.g. Linux) deliver a default "ncurses" alongside "curses".
dnl Many non-Linux deliver "curses"; sites may add "ncurses".
dnl
dnl However, the source-code recommendation for both is to #include "curses.h"
dnl (i.e. "ncurses" still wants the include to be simple, no-'n', "curses.h").
dnl
dnl ncurses takes precedence.
dnl
AC_CHECK_HEADERS([curses.h curses/curses.h ncurses.h ncurses/ncurses.h])

found_ncurses_header=0

m4_foreach(
[header], [[ncurses.h], [ncurses/ncurses.h]],
[AS_IF(
[test "$found_ncurses_header" -eq 0],
[AC_CHECK_HEADER(
header,
[
found_ncurses_header=1
AC_DEFINE([PCMK__NCURSES_H], [<header>], [Ncurses header file])
]
)]
)]
)

save_LIBS="$LIBS"
found_curses=0
CURSES_LIBS=""
found_ncurses=0
NCURSES_LIBS=""
LIBS=""
AC_SEARCH_LIBS([printw], [ncurses curses],
[test "$ac_cv_search_printw" = "none required" || CURSES_LIBS="$LIBS"
found_curses=1],
[found_curses=0])
AC_SEARCH_LIBS(
[printw], [ncurses],
[
test "$ac_cv_search_printw" = "none required" || NCURSES_LIBS="$LIBS"
found_ncurses=1
],
[found_ncurses=0]
)
LIBS="$save_LIBS"

dnl Check for printw() prototype compatibility
AS_IF([test $found_curses -eq 1 && cc_supports_flag -Wcast-qual], [
AS_IF([test $found_ncurses -eq 1 && cc_supports_flag -Wcast-qual], [
ac_save_LIBS="$LIBS"
LIBS="$CURSES_LIBS"
LIBS="$NCURSES_LIBS"

# avoid broken test because of hardened build environment in Fedora 23+
# - https://fedoraproject.org/wiki/Changes/Harden_All_Packages
Expand All @@ -1325,31 +1322,26 @@ AS_IF([test $found_curses -eq 1 && cc_supports_flag -Wcast-qual], [
[cc_temp_flags "-Wcast-qual $WERROR -fPIC"],
[cc_temp_flags "-Wcast-qual $WERROR"])

AC_MSG_CHECKING([whether curses library is compatible])
AC_MSG_CHECKING([whether ncurses library is compatible])
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([
#if defined(HAVE_NCURSES_H)
# include <ncurses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
# include <ncurses/ncurses.h>
#elif defined(HAVE_CURSES_H)
# include <curses.h>
#elif defined(HAVE_CURSES_CURSES_H)
# include <curses/curses.h>
#endif
],
[printw((const char *)"Test");]
[AC_LANG_PROGRAM(
[
#ifdef PCMK__NCURSES_H
#include PCMK__NCURSES_H
#endif
],
[printw((NCURSES_CONST char *) "Test");]
)],
[AC_MSG_RESULT([yes])
PCMK_FEATURES="$PCMK_FEATURES ncurses"
],
[
found_curses=0
CURSES_LIBS=""
found_ncurses=0
NCURSES_LIBS=""
AC_MSG_RESULT([no])
AC_MSG_WARN(m4_normalize([Disabling curses because the printw()
function of your (n)curses library is old.
If you wish to enable curses, update to a
AC_MSG_WARN(m4_normalize([Disabling ncurses because the printw()
function of your ncurses library is old.
If you wish to enable ncurses, update to a
newer version (ncurses 5.4 or later is
recommended, available from
https://invisible-island.net/ncurses/)
Expand All @@ -1361,8 +1353,9 @@ AS_IF([test $found_curses -eq 1 && cc_supports_flag -Wcast-qual], [
cc_restore_flags
])

AC_DEFINE_UNQUOTED([PCMK__ENABLE_CURSES], [$found_curses], [have ncurses library])
AC_SUBST(CURSES_LIBS)
AC_DEFINE_UNQUOTED([PCMK__ENABLE_CURSES], [$found_ncurses],
[have ncurses library])
AC_SUBST(NCURSES_LIBS)

dnl ========================================================================
dnl Profiling and GProf
Expand Down
2 changes: 1 addition & 1 deletion daemons/controld/controld_alerts.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ crmd_alert_fencing_op(stonith_event_t * e)
}

void
crmd_alert_resource_op(const char *node, lrmd_event_data_t * op)
crmd_alert_resource_op(const char *node, const lrmd_event_data_t *op)
{
lrm_state_t *lrm_state;

Expand Down
4 changes: 2 additions & 2 deletions daemons/controld/controld_alerts.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2015-2024 the Pacemaker project contributors
* Copyright 2015-2026 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
Expand All @@ -19,6 +19,6 @@
void crmd_unpack_alerts(xmlNode *alerts);
void crmd_alert_node_event(pcmk__node_status_t *node);
void crmd_alert_fencing_op(stonith_event_t *e);
void crmd_alert_resource_op(const char *node, lrmd_event_data_t *op);
void crmd_alert_resource_op(const char *node, const lrmd_event_data_t *op);

#endif
6 changes: 3 additions & 3 deletions daemons/controld/controld_cib.c
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ build_parameter_list(const lrmd_event_data_t *op,
}

static void
append_restart_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata,
append_restart_list(const lrmd_event_data_t *op, struct ra_metadata_s *metadata,
xmlNode *update, const char *version)
{
GString *list = NULL;
Expand Down Expand Up @@ -576,7 +576,7 @@ append_restart_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata,
}

static void
append_secure_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata,
append_secure_list(const lrmd_event_data_t *op, struct ra_metadata_s *metadata,
xmlNode *update, const char *version)
{
GString *list = NULL;
Expand Down Expand Up @@ -753,7 +753,7 @@ cib_rsc_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void *use
* until it is active there again after the node comes back up.
*/
static bool
should_preserve_lock(lrmd_event_data_t *op)
should_preserve_lock(const lrmd_event_data_t *op)
{
if (!pcmk__is_set(controld_globals.flags, controld_shutdown_lock_enabled)) {
return false;
Expand Down
11 changes: 7 additions & 4 deletions daemons/controld/controld_execd.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ history_free(void *data)
}

static void
update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_data_t * op)
update_history_cache(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc,
const lrmd_event_data_t *op)
{
int target_rc = 0;
rsc_history_t *entry = NULL;
Expand Down Expand Up @@ -269,7 +270,7 @@ send_task_ok_ack(const lrm_state_t *lrm_state, const ha_msg_input_t *input,
}

static inline const char *
op_node_name(lrmd_event_data_t *op)
op_node_name(const lrmd_event_data_t *op)
{
return pcmk__s(op->remote_nodename,
controld_globals.cluster->priv->node_name);
Expand Down Expand Up @@ -1728,11 +1729,13 @@ controld_ack_event_directly(const char *to_host, const char *to_sys,
pcmk__node_status_t *peer = NULL;

CRM_CHECK(op != NULL, return);

if (op->rsc_id == NULL) {
// op->rsc_id is a (const char *) but lrmd_free_event() frees it
pcmk__assert(rsc_id != NULL);
op->rsc_id = pcmk__str_copy(rsc_id);
}

pcmk__assert(op->rsc_id != NULL);

if (to_sys == NULL) {
to_sys = CRM_SYSTEM_TENGINE;
}
Expand Down
27 changes: 12 additions & 15 deletions daemons/controld/controld_execd_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,31 +55,28 @@ free_recurring_op(void *value)
static gboolean
fail_pending_op(void *key, void *value, void *user_data)
{
lrmd_event_data_t event = { 0, };
lrm_state_t *lrm_state = user_data;
active_op_t *op = value;
lrmd_event_data_t *event = lrmd_new_event(op->rsc_id, op->op_type,
op->interval_ms);

pcmk__trace("Pre-emptively failing " PCMK__OP_FMT " on %s (call=%s, %s)",
op->rsc_id, op->op_type, op->interval_ms,
lrm_state->node_name, (const char *) key, op->user_data);

event.type = lrmd_event_exec_complete;
event.rsc_id = op->rsc_id;
event.op_type = op->op_type;
event.user_data = op->user_data;
event.timeout = 0;
event.interval_ms = op->interval_ms;
lrmd__set_result(&event, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_NOT_CONNECTED,
event->type = lrmd_event_exec_complete;
event->user_data = pcmk__str_copy(op->user_data);
lrmd__set_result(event, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_NOT_CONNECTED,
"Action was pending when executor connection was dropped");
event.t_run = op->start_time;
event.t_rcchange = op->start_time;
event->t_run = op->start_time;
event->t_rcchange = op->start_time;

event.call_id = op->call_id;
event.remote_nodename = lrm_state->node_name;
event.params = op->params;
event->call_id = op->call_id;
event->remote_nodename = pcmk__str_copy(lrm_state->node_name);
event->params = op->params;

process_lrm_event(lrm_state, &event, op, NULL);
lrmd__reset_result(&event);
process_lrm_event(lrm_state, event, op, NULL);
lrmd_free_event(event);
return TRUE;
}

Expand Down
57 changes: 26 additions & 31 deletions daemons/controld/controld_remote_ra.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,26 +399,24 @@ check_remote_node_state(const remote_ra_cmd_t *cmd)
static void
report_remote_ra_result(remote_ra_cmd_t * cmd)
{
lrmd_event_data_t op = { 0, };
lrmd_event_data_t *event = lrmd_new_event(cmd->rsc_id, cmd->action,
cmd->interval_ms);

check_remote_node_state(cmd);

op.type = lrmd_event_exec_complete;
op.rsc_id = cmd->rsc_id;
op.op_type = cmd->action;
op.user_data = cmd->userdata;
op.timeout = cmd->timeout;
op.interval_ms = cmd->interval_ms;
op.t_run = cmd->start_time;
op.t_rcchange = cmd->start_time;
event->type = lrmd_event_exec_complete;
event->user_data = pcmk__str_copy(cmd->userdata);
event->timeout = cmd->timeout;
event->t_run = cmd->start_time;
event->t_rcchange = cmd->start_time;

lrmd__set_result(&op, cmd->result.exit_status, cmd->result.execution_status,
cmd->result.exit_reason);
lrmd__set_result(event, cmd->result.exit_status,
cmd->result.execution_status, cmd->result.exit_reason);

if (pcmk__is_set(cmd->status, cmd_reported_success)
&& !pcmk__result_ok(&(cmd->result))) {

op.t_rcchange = time(NULL);
event->t_rcchange = time(NULL);
/* This edge case will likely never ever occur, but if it does the
* result is that a failure will not be processed correctly. This is only
* remotely possible because we are able to detect a connection resource's tcp
Expand All @@ -428,27 +426,25 @@ report_remote_ra_result(remote_ra_cmd_t * cmd)
* basically, we are not guaranteed that the first successful monitor op and
* a subsequent failed monitor op will not occur in the same timestamp. We have to
* make it look like the operations occurred at separate times though. */
if (op.t_rcchange == op.t_run) {
op.t_rcchange++;
if (event->t_rcchange == event->t_run) {
event->t_rcchange++;
}
}

if (cmd->params) {
lrmd_key_value_t *tmp;

op.params = pcmk__strkey_table(free, free);
event->params = pcmk__strkey_table(free, free);
for (tmp = cmd->params; tmp; tmp = tmp->next) {
pcmk__insert_dup(op.params, tmp->key, tmp->value);
pcmk__insert_dup(event->params, tmp->key, tmp->value);
}

}
op.call_id = cmd->call_id;
op.remote_nodename = cmd->owner;
event->call_id = cmd->call_id;
event->remote_nodename = pcmk__str_copy(cmd->owner);

lrm_op_callback(&op);

g_clear_pointer(&op.params, g_hash_table_destroy);
lrmd__reset_result(&op);
lrm_op_callback(event);
lrmd_free_event(event);
}

/*!
Expand Down Expand Up @@ -562,22 +558,21 @@ monitor_timeout_cb(void *data)
static void
synthesize_lrmd_success(lrm_state_t *lrm_state, const char *rsc_id, const char *op_type)
{
lrmd_event_data_t op = { 0, };
lrmd_event_data_t *event = NULL;

if (lrm_state == NULL) {
/* if lrm_state not given assume local */
lrm_state = controld_get_executor_state(NULL, false);
}
pcmk__assert(lrm_state != NULL);

op.type = lrmd_event_exec_complete;
op.rsc_id = rsc_id;
op.op_type = op_type;
op.t_run = time(NULL);
op.t_rcchange = op.t_run;
op.call_id = generate_callid();
lrmd__set_result(&op, PCMK_OCF_OK, PCMK_EXEC_DONE, NULL);
process_lrm_event(lrm_state, &op, NULL, NULL);
event = lrmd_new_event(rsc_id, op_type, 0);
event->type = lrmd_event_exec_complete;
event->t_run = time(NULL);
event->t_rcchange = event->t_run;
event->call_id = generate_callid();
lrmd__set_result(event, PCMK_OCF_OK, PCMK_EXEC_DONE, NULL);
process_lrm_event(lrm_state, event, NULL, NULL);
}

void
Expand Down
4 changes: 2 additions & 2 deletions daemons/execd/execd_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,8 +1017,8 @@ action_complete(svc_action_t * action)
#endif

finalize:
pcmk__set_result_output(&(cmd->result), services__grab_stdout(action),
services__grab_stderr(action));
cmd->result.action_stdout = pcmk__str_copy(action->stdout_data);
cmd->result.action_stderr = pcmk__str_copy(action->stderr_data);
cmd_finalize(cmd, rsc);
}

Expand Down
Loading