extern int d2dbs_d2ladder_init(void) { d2ladder_change_count=0; d2ladder_maxtype=0; d2ladder_ladder_file=(char*)xmalloc(std::strlen(d2dbs_prefs_get_ladder_dir())+1+ std::strlen(LADDER_FILE_PREFIX)+1+std::strlen(CLIENTTAG_DIABLO2DV)+1+10); d2ladder_backup_file=(char*)xmalloc(std::strlen(d2dbs_prefs_get_ladder_dir())+1+ std::strlen(LADDER_BACKUP_PREFIX)+1+std::strlen(CLIENTTAG_DIABLO2DV)+1+10); std::sprintf(d2ladder_ladder_file,"%s/%s.%s",d2dbs_prefs_get_ladder_dir(),\ LADDER_FILE_PREFIX,CLIENTTAG_DIABLO2DV); std::sprintf(d2ladder_backup_file,"%s/%s.%s",d2dbs_prefs_get_ladder_dir(),\ LADDER_BACKUP_PREFIX,CLIENTTAG_DIABLO2DV); if (d2ladderlist_init()<0) { return -1; } if(d2ladder_check()<0) { eventlog(eventlog_level_error,__FUNCTION__,"ladder file checking error"); return -1; } if (d2ladder_readladder()<0) { return -1; } if (d2ladder_need_rebuild) d2ladder_rebuild(); d2ladder_saveladder(); return 0; }
extern int d2dbs_d2ladder_destroy(void) { unsigned int i; t_d2ladder * d2ladder; d2ladder_saveladder(); for (i=0;i<d2ladder_maxtype;i++) { d2ladder=d2ladderlist_find_type(i); if(d2ladder) { if(d2ladder->info) xfree(d2ladder->info); d2ladder->info=NULL; d2ladder->len=0; } } d2ladderlist_destroy(); if (d2ladder_ladder_file) { xfree(d2ladder_ladder_file); d2ladder_ladder_file=NULL; } if (d2ladder_backup_file) { xfree(d2ladder_backup_file); d2ladder_backup_file=NULL; } return 0; }
static int dbs_handle_timed_events(void) { static time_t prev_ladder_save_time=0; static time_t prev_keepalive_save_time=0; static time_t prev_timeout_checktime=0; time_t now; now=time(NULL); if (now-prev_ladder_save_time>(signed)prefs_get_laddersave_interval()) { d2ladder_saveladder(); prev_ladder_save_time=now; } if (now-prev_keepalive_save_time>(signed)prefs_get_keepalive_interval()) { dbs_keepalive(); prev_keepalive_save_time=now; } if (now-prev_timeout_checktime>(signed)d2dbs_prefs_get_timeout_checkinterval()) { dbs_check_timeout(); prev_timeout_checktime=now; } return 0; }
extern int d2dbs_handle_signal(void) { std::time_t now; char const * levels; char * temp; char const * tok; if (signal_data.cancel_quit) { signal_data.cancel_quit = 0; if (!signal_data.exit_time) { eventlog(eventlog_level_info, __FUNCTION__, "there is no previous shutdown to be canceled"); } else { signal_data.exit_time = 0; eventlog(eventlog_level_info, __FUNCTION__, "shutdown was canceled due to std::signal"); } } if (signal_data.do_quit) { signal_data.do_quit = 0; now = std::time(NULL); if (!signal_data.exit_time) { signal_data.exit_time = now + d2dbs_prefs_get_shutdown_delay(); } else { signal_data.exit_time -= d2dbs_prefs_get_shutdown_decr(); } eventlog(eventlog_level_info, __FUNCTION__, "the server is going to shutdown in %lu minutes", (signal_data.exit_time - now) / 60); } if (signal_data.exit_time) { now = std::time(NULL); if (now >= (signed)signal_data.exit_time) { signal_data.exit_time = 0; eventlog(eventlog_level_info, __FUNCTION__, "shutdown server due to std::signal"); return -1; } } if (signal_data.reload_config) { signal_data.reload_config = 0; eventlog(eventlog_level_info, __FUNCTION__, "reloading configuartion file due to std::signal"); if (d2dbs_prefs_reload(cmdline_get_preffile()) < 0) { eventlog(eventlog_level_error, __FUNCTION__, "error reload configuration file,exitting"); return -1; } eventlog_clear_level(); if ((levels = d2dbs_prefs_get_loglevels())) { temp = xstrdup(levels); tok = std::strtok(temp, ","); /* std::strtok modifies the string it is passed */ while (tok) { if (eventlog_add_level(tok) < 0) eventlog(eventlog_level_error, __FUNCTION__, "could not add std::log level \"%s\"", tok); tok = std::strtok(NULL, ","); } xfree(temp); } #ifdef DO_DAEMONIZE if (!cmdline_get_foreground()) #endif eventlog_open(d2dbs_prefs_get_logfile()); } if (signal_data.save_ladder) { signal_data.save_ladder = 0; eventlog(eventlog_level_info, __FUNCTION__, "save ladder data due to std::signal"); d2ladder_saveladder(); } return 0; }
extern int handle_signal(void) { time_t now; char const * levels; char * temp; char const * tok; if (signal_data.cancel_quit) { signal_data.cancel_quit=0; if (!signal_data.exit_time) { log_info("there is no previous shutdown to be canceled"); } else { signal_data.exit_time=0; log_info("shutdown was canceled due to signal"); } } if (signal_data.do_quit) { signal_data.do_quit=0; now=time(NULL); if (!signal_data.exit_time) { signal_data.exit_time=now+prefs_get_shutdown_delay(); } else { signal_data.exit_time-=prefs_get_shutdown_decr(); } if (now >= signal_data.exit_time) { log_info("shutdown server due to signal"); return -1; } log_info("the server is going to shutdown in %lu minutes",(signal_data.exit_time-now)/60); } if (signal_data.reload_config) { signal_data.reload_config=0; log_info("reloading configuartion file due to signal"); if (prefs_reload(cmdline_get_prefs_file())<0) { log_error("error reload configuration file,exitting"); return -1; } eventlog_clear_level(); if ((levels = prefs_get_loglevels())) { if (!(temp = strdup(levels))) { eventlog(eventlog_level_fatal,"handle_signal","could not allocate memory for temp (exiting)"); return -1; } tok = strtok(temp,","); /* strtok modifies the string it is passed */ while (tok) { if (eventlog_add_level(tok)<0) eventlog(eventlog_level_error,"handle_signal","could not add log level \"%s\"",tok); tok = strtok(NULL,","); } free(temp); } if (!cmdline_get_logstderr()) eventlog_open(prefs_get_logfile()); } if (signal_data.save_ladder) { signal_data.save_ladder=0; log_info("save ladder data due to signal"); d2ladder_saveladder(); } return 0; }