safe_val4(NULL, action, node, details, uname));
safe_val4("<none>",action,node,details,uname), safe_val4("",action,node,details,id));
log_action(unsigned int log_level, const char *pre_text, action_t *action, gboolean details){ 	if(action == NULL) {		util_log("%s%s: <NULL>",		       pre_text==NULL?"":pre_text,		       pre_text==NULL?"":": ");		return;	}	switch(text2task(action->task)) {		case stonith_node:		case shutdown_crm:			crm_log_maybe(log_level, "%s%s%sAction %d: %s @ %s",				      pre_text==NULL?"":pre_text,				      pre_text==NULL?"":": ",				      action->pseudo?"Pseduo ":action->optional?"Optional ":action->runnable?action->processed?"":"(Provisional) ":"!!Non-Startable!! ",				      action->id, action->task,				      safe_val4(NULL, action, node, details, uname));			break;		default:			crm_log_maybe(log_level, "%s%s%sAction %d: %s %s @ %s",				      pre_text==NULL?"":pre_text,				      pre_text==NULL?"":": ",				      action->optional?"Optional ":action->pseudo?"Pseduo ":action->runnable?action->processed?"":"(Provisional) ":"!!Non-Startable!! ",				      action->id, action->task,				      safe_val3(NULL, action, rsc, id),				      safe_val4(NULL, action, node, details, uname));						break;	}	if(details) {		crm_log_maybe(log_level+1, "\t\t====== Preceeding Actions");		slist_iter(			other, action_wrapper_t, action->actions_before, lpc,			log_action(log_level+1, "\t\t", other->action, FALSE);			);#if 1		crm_log_maybe(log_level+1, "\t\t====== Subsequent Actions");		slist_iter(			other, action_wrapper_t, action->actions_after, lpc,			log_action(log_level+1, "\t\t", other->action, FALSE);			);		#endif		crm_log_maybe(log_level+1, "\t\t====== End");	} else {		crm_log_maybe(log_level, "\t\t(seen=%d, before=%d, after=%d)",			      action->seen_count,			      g_list_length(action->actions_before),			      g_list_length(action->actions_after));	}}