1515#include "services_private.h"
1616#include "services_dlopen.h"
1717
18- #define PCMK_DLOPEN_DIR "/usr/lib/dlopen" // or "/usr/lib/dlopen/"
18+ // #define DLOPEN_ROOT_DIR "/usr/lib/dlopen" // or "/usr/lib/dlopen/"
1919
2020GList *
2121services__list_dlopen_agents (void )
2222{
23- return services_os_get_directory_list (PCMK_DLOPEN_DIR , TRUE, FALSE);
23+ return services_os_get_directory_list (DLOPEN_ROOT_DIR , TRUE, FALSE);
2424}
2525
2626bool
2727services__dlopen_agent_exists (const char * agent )
2828{
2929 bool rc = FALSE;
3030 struct stat st ;
31- char * path = pcmk__full_path (agent , PCMK_DLOPEN_DIR );
31+ char * path = pcmk__full_path (agent , DLOPEN_ROOT_DIR );
3232
3333 rc = (stat (path , & st ) == 0 );
3434 free (path );
@@ -38,7 +38,7 @@ services__dlopen_agent_exists(const char *agent)
3838int
3939services__dlopen_prepare (svc_action_t * op )
4040{
41- op -> opaque -> exec = pcmk__full_path (op -> agent , PCMK_DLOPEN_DIR );
41+ op -> opaque -> exec = pcmk__full_path (op -> agent , DLOPEN_ROOT_DIR );
4242 op -> opaque -> args [0 ] = strdup (op -> opaque -> exec );
4343 op -> opaque -> args [1 ] = strdup (op -> action );
4444 if ((op -> opaque -> args [0 ] == NULL ) || (op -> opaque -> args [1 ] == NULL )) {
6767services__execute_dlopen_metadata (svc_action_t * op ) {
6868 void * lib ;
6969 char * lib_error ;
70- const char * metadata ;
70+ char * error ;
71+ int (* exec )(char * * );
7172 char dst [200 ] = "/usr/lib/dlopen/" ;
7273 strcat (dst , op -> agent );
74+ g_hash_table_replace (op -> params , strdup ("OCF_RESOURCE_INSTANCE" ), strdup (op -> rsc ));
7375 lib = dlopen (dst , RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE );
7476
7577 if (!lib ) {
7678 return pcmk_rc_error ;
77- }
78-
79- metadata = dlsym (lib , "metadata" );
79+ } else {
80+ exec = dlsym (lib , "metadata" );
8081
81- if ((lib_error = dlerror ()) != NULL ){
82- free (lib_error );
83-
84- return pcmk_rc_error ;
85- }
82+ if ((lib_error = dlerror ()) != NULL ){
83+ free (lib_error );
8684
87- op -> rc = PCMK_OCF_OK ;
88- op -> status = PCMK_EXEC_DONE ;
89- op -> pid = 0 ;
90- op -> stdout_data = strdup (metadata );
91-
92- if (op -> opaque -> callback ) {
93- op -> opaque -> callback (op );
85+ return pcmk_rc_error ;
86+ } else {
87+ op -> rc = exec (& op -> stdout_data );
88+ op -> status = PCMK_EXEC_DONE ;
89+ op -> pid = 0 ;
90+ if (op -> interval_ms != 0 ) {
91+ // Recurring operations must be either cancelled or rescheduled
92+ if (op -> cancel ) {
93+ services__set_cancelled (op );
94+ cancel_recurring_action (op );
95+ } else {
96+ op -> opaque -> repeat_timer = g_timeout_add (op -> interval_ms ,
97+ recurring_action_timer ,
98+ (void * ) op );
99+ }
100+ }
101+
102+ if (op -> opaque -> callback ) {
103+ op -> opaque -> callback (op );
104+ }
105+
106+ crm_info ("Exit code: %d, error: %s" , op -> rc , error );
107+
108+ dlclose (lib );
109+ return pcmk_rc_ok ;
110+ }
94111 }
95-
96- dlclose (lib );
97- return pcmk_rc_ok ;
98112}
99113
100114int
@@ -105,43 +119,42 @@ services__execute_dlopen_action(svc_action_t *op) {
105119 int (* exec )(GHashTable * , char * * );
106120 char dst [200 ] = "/usr/lib/dlopen/" ;
107121 strcat (dst , op -> agent );
108- g_hash_table_replace (op -> params , strdup ("DLOPEN_RESOURCE_INSTANCE " ), strdup (op -> rsc ));
122+ g_hash_table_replace (op -> params , strdup ("OCF_RESOURCE_INSTANCE " ), strdup (op -> rsc ));
109123 lib = dlopen (dst , RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE );
110124
111125 if (!lib ) {
112126 return pcmk_rc_error ;
113- }
114-
115- exec = dlsym (lib , op -> action );
116-
117- if ((lib_error = dlerror ()) != NULL ){
118- free (lib_error );
119-
120- return pcmk_rc_error ;
121- }
127+ } else {
128+ exec = dlsym (lib , op -> action );
122129
123- op -> rc = exec (op -> params , & error );
124- op -> status = PCMK_EXEC_DONE ;
125- op -> pid = 0 ;
130+ if ((lib_error = dlerror ()) != NULL ){
131+ free (lib_error );
126132
127- if (op -> interval_ms != 0 ) {
128- // Recurring operations must be either cancelled or rescheduled
129- if (op -> cancel ) {
130- services__set_cancelled (op );
131- cancel_recurring_action (op );
133+ return pcmk_rc_error ;
132134 } else {
133- op -> opaque -> repeat_timer = g_timeout_add (op -> interval_ms ,
134- recurring_action_timer ,
135- (void * ) op );
135+ op -> rc = exec (op -> params , & error );
136+ op -> status = PCMK_EXEC_DONE ;
137+ op -> pid = 0 ;
138+ if (op -> interval_ms != 0 ) {
139+ // Recurring operations must be either cancelled or rescheduled
140+ if (op -> cancel ) {
141+ services__set_cancelled (op );
142+ cancel_recurring_action (op );
143+ } else {
144+ op -> opaque -> repeat_timer = g_timeout_add (op -> interval_ms ,
145+ recurring_action_timer ,
146+ (void * ) op );
147+ }
148+ }
149+
150+ if (op -> opaque -> callback ) {
151+ op -> opaque -> callback (op );
152+ }
153+
154+ crm_info ("Exit code: %d, error: %s" , op -> rc , error );
155+
156+ dlclose (lib );
157+ return pcmk_rc_ok ;
136158 }
137159 }
138-
139- if (op -> opaque -> callback ) {
140- op -> opaque -> callback (op );
141- }
142-
143- crm_info ("Exit code: %d, error: %s" , op -> rc , error );
144-
145- dlclose (lib );
146- return pcmk_rc_ok ;
147160}
0 commit comments