From: Ethan G. <ega...@us...> - 2005-07-26 05:21:23
|
Update of /cvsroot/nagios/nagios/base In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30517/base Modified Files: broker.c nebmods.c sretention.c Log Message: Two additional callbacks for event broker, change in NEB API to allow for graceful unloading of modules without causing a segfault Index: broker.c =================================================================== RCS file: /cvsroot/nagios/nagios/base/broker.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** broker.c 11 Jun 2005 23:30:38 -0000 1.22 --- broker.c 26 Jul 2005 05:21:14 -0000 1.23 *************** *** 410,414 **** - /* sends program status updates to broker */ void broker_program_status(int type, int flags, int attr, struct timeval *timestamp){ --- 410,413 ---- *************** *** 644,647 **** --- 643,687 ---- + /* brokers aggregated status dumps */ + void broker_aggregated_status_data(int type, int flags, int attr, struct timeval *timestamp){ + nebstruct_aggregated_status_data ds; + + if(!(event_broker_options & BROKER_STATUS_DATA)) + return; + + /* fill struct with relevant data */ + ds.type=type; + ds.flags=flags; + ds.attr=attr; + ds.timestamp=get_broker_timestamp(timestamp); + + /* make callbacks */ + neb_make_callbacks(NEBCALLBACK_AGGREGATED_STATUS_DATA,(void *)&ds); + + return; + } + + + /* brokers retention data */ + void broker_retention_data(int type, int flags, int attr, struct timeval *timestamp){ + nebstruct_retention_data ds; + + if(!(event_broker_options & BROKER_RETENTION_DATA)) + return; + + /* fill struct with relevant data */ + ds.type=type; + ds.flags=flags; + ds.attr=attr; + ds.timestamp=get_broker_timestamp(timestamp); + + /* make callbacks */ + neb_make_callbacks(NEBCALLBACK_RETENTION_DATA,(void *)&ds); + + return; + } + + + /******************************************************************/ Index: nebmods.c =================================================================== RCS file: /cvsroot/nagios/nagios/base/nebmods.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** nebmods.c 25 Mar 2005 00:04:19 -0000 1.7 --- nebmods.c 26 Jul 2005 05:21:14 -0000 1.8 *************** *** 238,242 **** /* run the module's init function */ initfunc=mod->init_func; ! result=(*initfunc)(NEBMODULE_NORMAL_LOAD,mod->args,mod); /* if the init function returned an error, unload the module */ --- 238,242 ---- /* run the module's init function */ initfunc=mod->init_func; ! result=(*initfunc)(NEBMODULE_NORMAL_LOAD,mod->args,mod->module_handle); /* if the init function returned an error, unload the module */ *************** *** 322,325 **** --- 322,328 ---- } + /* deregister all of the module's callbacks */ + neb_deregister_module_callbacks(mod); + /* unload the module */ #ifdef USE_LTDL *************** *** 390,394 **** /* allows a module to register a callback function */ ! int neb_register_callback(int callback_type, int priority, int (*callback_func)(int,void *)){ nebcallback *new_callback; nebcallback *temp_callback; --- 393,398 ---- /* allows a module to register a callback function */ ! int neb_register_callback(int callback_type, void *mod_handle, int priority, int (*callback_func)(int,void *)){ ! nebmodule *temp_module; nebcallback *new_callback; nebcallback *temp_callback; *************** *** 401,408 **** --- 405,423 ---- return NEBERROR_NOCALLBACKLIST; + if(mod_handle==NULL) + return NEBERROR_NOMODULEHANDLE; + /* make sure the callback type is within bounds */ if(callback_type<0 || callback_type>=NEBCALLBACK_NUMITEMS) return NEBERROR_CALLBACKBOUNDS; + /* make sure module handle is valid */ + for(temp_module=neb_module_list;temp_module;temp_module=temp_module->next){ + if((void *)temp_module->module_handle==(void *)mod_handle) + break; + } + if(temp_module==NULL) + return NEBERROR_BADMODULEHANDLE; + /* allocate memory */ new_callback=(nebcallback *)malloc(sizeof(nebcallback)); *************** *** 411,414 **** --- 426,430 ---- new_callback->priority=priority; + new_callback->module_handle=(void *)mod_handle; new_callback->callback_func=(void *)callback_func; *************** *** 440,443 **** --- 456,486 ---- + + /* dregisters all callback functions for a given module */ + int neb_deregister_module_callbacks(nebmodule *mod){ + nebcallback *temp_callback; + nebcallback *next_callback; + int callback_type; + + if(mod==NULL) + return NEBERROR_NOMODULE; + + if(neb_callback_list==NULL) + return OK; + + for(callback_type=0;callback_type<NEBCALLBACK_NUMITEMS;callback_type++){ + for(temp_callback=neb_callback_list[callback_type];temp_callback!=NULL;temp_callback=next_callback){ + printf("TEMP_CALLBACK: %x\n",temp_callback); + next_callback=temp_callback->next; + if((void *)temp_callback->module_handle==(void *)mod->module_handle) + neb_deregister_callback(callback_type,temp_callback->callback_func); + } + + } + + return OK; + } + + /* allows a module to deregister a callback function */ int neb_deregister_callback(int callback_type, int (*callback_func)(int,void *)){ *************** *** 544,548 **** next_callback=temp_callback->next; free(temp_callback); - temp_callback=next_callback; } --- 587,590 ---- Index: sretention.c =================================================================== RCS file: /cvsroot/nagios/nagios/base/sretention.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** sretention.c 27 Aug 2003 04:24:03 -0000 1.10 --- sretention.c 26 Jul 2005 05:21:14 -0000 1.11 *************** *** 32,35 **** --- 32,36 ---- #include "../include/nagios.h" #include "../include/sretention.h" + #include "../include/broker.h" extern int retain_state_information; *************** *** 55,58 **** --- 56,60 ---- int save_state_information(char *main_config_file, int autosave){ char buffer[MAX_INPUT_BUFFER]; + int result=OK; #ifdef DEBUG0 *************** *** 63,72 **** return OK; /********* IMPLEMENTATION-SPECIFIC OUTPUT FUNCTION ********/ #ifdef USE_XRDDEFAULT ! if(xrddefault_save_state_information(main_config_file)==ERROR) ! return ERROR; #endif if(autosave==TRUE){ snprintf(buffer,sizeof(buffer),"Auto-save of retention data completed successfully.\n"); --- 65,86 ---- return OK; + #ifdef USE_EVENT_BROKER + /* send data to event broker */ + broker_retention_data(NEBTYPE_RETENTIONDATA_STARTSAVE,NEBFLAG_NONE,NEBATTR_NONE,NULL); + #endif + /********* IMPLEMENTATION-SPECIFIC OUTPUT FUNCTION ********/ #ifdef USE_XRDDEFAULT ! result=xrddefault_save_state_information(main_config_file); #endif + #ifdef USE_EVENT_BROKER + /* send data to event broker */ + broker_retention_data(NEBTYPE_RETENTIONDATA_ENDSAVE,NEBFLAG_NONE,NEBATTR_NONE,NULL); + #endif + + if(result==ERROR) + return ERROR; + if(autosave==TRUE){ snprintf(buffer,sizeof(buffer),"Auto-save of retention data completed successfully.\n"); *************** *** 87,90 **** --- 101,105 ---- /* reads in initial host and state information */ int read_initial_state_information(char *main_config_file){ + int result=OK; #ifdef DEBUG0 *************** *** 95,104 **** return OK; /********* IMPLEMENTATION-SPECIFIC INPUT FUNCTION ********/ #ifdef USE_XRDDEFAULT ! if(xrddefault_read_state_information(main_config_file)==ERROR) ! return ERROR; #endif #ifdef DEBUG0 printf("read_initial_state_information() end\n"); --- 110,131 ---- return OK; + #ifdef USE_EVENT_BROKER + /* send data to event broker */ + broker_retention_data(NEBTYPE_RETENTIONDATA_STARTLOAD,NEBFLAG_NONE,NEBATTR_NONE,NULL); + #endif + /********* IMPLEMENTATION-SPECIFIC INPUT FUNCTION ********/ #ifdef USE_XRDDEFAULT ! result=xrddefault_read_state_information(main_config_file); #endif + #ifdef USE_EVENT_BROKER + /* send data to event broker */ + broker_retention_data(NEBTYPE_RETENTIONDATA_ENDLOAD,NEBFLAG_NONE,NEBATTR_NONE,NULL); + #endif + + if(result==ERROR) + return ERROR; + #ifdef DEBUG0 printf("read_initial_state_information() end\n"); |