execra( const char * rsc_type, const char * op_type,
execra( const char * rsc_type, const char * provider, const char * op_type,
execra( const char * rsc_type, const char * op_type,	GHashTable * cmd_params, GHashTable * env_params ){	char *ra_name_dup, *base_name;	GString * ra_dirname;	uniform_ret_execra_t exit_value;	/* Prepare the call parameter */	if (!cmd_params) {		if (g_hash_table_size(cmd_params) > 0) {			cl_log(LOG_ERR, "OCF RA should have no "\				"command-line parameters.");		}	}	ra_dirname = g_string_new(rsc_type);	ra_name_dup = strndup(rsc_type, RA_MAX_DIRNAME_LENGTH);	base_name = basename(ra_name_dup);	/*	 * If rsc_type only contains basename, then append RA_PATH.	 * If rsc_type is a pathname, then don't deal with it.	 */	if ( strncmp(rsc_type, base_name, RA_MAX_BASENAME_LENGTH) == 0 ) {		g_string_insert(ra_dirname, 0, RA_PATH);	}	free(ra_name_dup);	/* execute the RA */	cl_log(LOG_DEBUG, "Will execute OCF RA : %s %s", ra_dirname->str, op_type);	raexec_setenv(env_params);	execl(ra_dirname->str, ra_dirname->str, op_type, NULL);	switch (errno) {		case ENOENT:   /* No such file or directory */		case EISDIR:   /* Is a directory */			exit_value = EXECRA_NO_RA;			break;		default:			exit_value = EXECRA_EXEC_UNKNOWN_ERROR;	}	cl_log(LOG_ERR, "execl error when to execute RA %s.", rsc_type);	g_string_free(ra_dirname, TRUE);	exit(exit_value);}