/** * Update zone list. * */ ods_status zonelist_update(zonelist_type* zl, const char* zlfile) { zonelist_type* new_zlist = NULL; allocator_type* tmp_alloc = NULL; time_t st_mtime = 0; ods_status status = ODS_STATUS_OK; char* datestamp = NULL; ods_log_debug("[%s] update zone list", zl_str); if (!zl|| !zl->zones || !zlfile) { return ODS_STATUS_ASSERT_ERR; } /* is the file updated? */ st_mtime = ods_file_lastmodified(zlfile); if (st_mtime <= zl->last_modified) { (void)time_datestamp(zl->last_modified, "%Y-%m-%d %T", &datestamp); ods_log_debug("[%s] zonelist file %s is unchanged since %s", zl_str, zlfile, datestamp?datestamp:"Unknown"); free((void*)datestamp); return ODS_STATUS_UNCHANGED; } /* create new zonelist */ tmp_alloc = allocator_create(malloc, free); if (!tmp_alloc) { return ODS_STATUS_MALLOC_ERR; } new_zlist = zonelist_create(tmp_alloc); if (!new_zlist) { ods_log_error("[%s] unable to update zonelist: zonelist_create() " "failed", zl_str); allocator_cleanup(tmp_alloc); return ODS_STATUS_ERR; } /* read zonelist */ status = zonelist_read(new_zlist, zlfile); if (status == ODS_STATUS_OK) { zl->just_removed = 0; zl->just_added = 0; zl->just_updated = 0; new_zlist->last_modified = st_mtime; zonelist_merge(zl, new_zlist); (void)time_datestamp(zl->last_modified, "%Y-%m-%d %T", &datestamp); ods_log_debug("[%s] file %s is modified since %s", zl_str, zlfile, datestamp?datestamp:"Unknown"); free((void*)datestamp); } else { ods_log_error("[%s] unable to update zonelist: read file %s failed " "(%s)", zl_str, zlfile, ods_status2str(status)); } zonelist_free(new_zlist); allocator_cleanup(tmp_alloc); return status; }
/** * Load signer configuration for zone. * */ ods_status zone_load_signconf(zone_type* zone, signconf_type** new_signconf) { ods_status status = ODS_STATUS_OK; signconf_type* signconf = NULL; char* datestamp = NULL; if (!zone || !zone->name || !zone->signconf) { return ODS_STATUS_ASSERT_ERR; } if (!zone->signconf_filename) { ods_log_warning("[%s] zone %s has no signconf filename, treat as " "insecure?", zone_str, zone->name); return ODS_STATUS_INSECURE; } status = signconf_update(&signconf, zone->signconf_filename, zone->signconf->last_modified); if (status == ODS_STATUS_OK) { if (!signconf) { /* this is unexpected */ ods_log_alert("[%s] unable to load signconf for zone %s: signconf " "status ok but no signconf stored", zone_str, zone->name); return ODS_STATUS_ASSERT_ERR; } (void)time_datestamp(signconf->last_modified, "%Y-%m-%d %T", &datestamp); ods_log_debug("[%s] zone %s signconf file %s is modified since %s", zone_str, zone->name, zone->signconf_filename, datestamp?datestamp:"Unknown"); free((void*)datestamp); *new_signconf = signconf; } else if (status == ODS_STATUS_UNCHANGED) { (void)time_datestamp(zone->signconf->last_modified, "%Y-%m-%d %T", &datestamp); ods_log_verbose("[%s] zone %s signconf file %s is unchanged since " "%s", zone_str, zone->name, zone->signconf_filename, datestamp?datestamp:"Unknown"); free((void*)datestamp); } else { ods_log_error("[%s] unable to load signconf for zone %s: signconf %s " "%s", zone_str, zone->name, zone->signconf_filename, ods_status2str(status)); } return status; }
void log_rotate(void) { uint64_t date; FILE *orig_out, *orig_err; chr_t *log_file = MEMORYBUF(1024); if (magma.output.file && magma.output.path && (date = time_datestamp()) != log_date) { orig_out = stdout; orig_err = stderr; log_date = date; if (snprintf(log_file, 1024, "%s%smagmad.%lu.log", magma.output.path, (*(ns_length_get(magma.output.path) + magma.output.path) == '/') ? "" : "/", date) >= 1024) { log_critical("Log file path exceeded available buffer. { file = %s%smagmad.%lu.log }", magma.output.path, (*(ns_length_get(magma.output.path) + magma.output.path) == '/') ? "" : "/", date); return; } pthread_mutex_lock(&log_mutex); if (!(stdout = freopen64(log_file, "a", stdout))) { stdout = orig_out; log_critical("Unable to rotate the error log. { file = %s }", log_file); pthread_mutex_unlock(&log_mutex); return; } if (!(stderr = freopen64(log_file, "a", stderr))) { fclose(stdout); stdout = orig_out; stderr = orig_err; log_critical("Unable to rotate the error log. { file = %s }", log_file); pthread_mutex_unlock(&log_mutex); return; } pthread_mutex_unlock(&log_mutex); } return; }
bool_t log_start(void) { FILE *file_out, *file_err; chr_t *log_file = MEMORYBUF(1024); // File logging. if (magma.output.file && magma.output.path) { log_date = time_datestamp(); if (snprintf(log_file, 1024, "%s%smagmad.%lu.log", magma.output.path, (*(ns_length_get(magma.output.path) + magma.output.path) == '/') ? "" : "/", log_date) >= 1024) { log_critical("Log file path exceeded available buffer. { file = %s%smagmad.%lu.log }", magma.output.path, (*(ns_length_get(magma.output.path) + magma.output.path) == '/') ? "" : "/", log_date); return false; } if (folder_exists(NULLER(magma.output.path), false)) { log_critical("The path configured to hold the output log files does not exist. { path = %s }", magma.output.path); return false; } if (!(file_out = freopen64(log_file, "a+", stdout))) { log_critical("Unable to open the error log, sticking with standard out. { file = %s }", log_file); return false; } if (!(file_err = freopen64(log_file, "a+", stderr))) { log_critical("Unable to open the error log, sticking with standard error. { file = %s }", log_file); fclose(file_out); return false; } stdout = file_out; stderr = file_err; } fclose(stdin); return true; }