///! Close the auditlog and write to the index file. ib_status_t core_audit_close(ib_engine_t *ib, ib_auditlog_t *log) { ib_core_audit_cfg_t *cfg = (ib_core_audit_cfg_t *)log->cfg_data; ib_core_cfg_t *corecfg; ib_status_t ib_rc = IB_OK; int sys_rc; char *line = NULL; size_t len = 0; line = malloc(LOGFORMAT_MAX_LINE_LENGTH + 2); if (line == NULL) { return IB_EALLOC; } /* Retrieve corecfg to get the AuditLogIndexFormat */ ib_rc = ib_core_context_config(log->ctx, &corecfg); if (ib_rc != IB_OK) { ib_log_alert(log->ib, "Error accessing core module: %s", ib_status_to_string(ib_rc)); goto cleanup; } /* Notify all handlers that the given audit log is about to close. */ ib_rc = ib_core_dispatch_auditlog( log->tx, IB_CORE_AUDITLOG_CLOSED, log); if (ib_rc != IB_OK) { ib_log_error(log->ib, "Failed to dispatch auditlog to handlers."); goto cleanup; } /* Close the audit log. */ if (cfg->fp != NULL) { fclose(cfg->fp); // Rename temp to real sys_rc = rename(cfg->temp_path, cfg->full_path); if (sys_rc != 0) { sys_rc = errno; ib_log_error(log->ib, "Error renaming auditlog %s: %s (%d)", cfg->temp_path, strerror(sys_rc), sys_rc); ib_rc = IB_EOTHER; goto cleanup; } cfg->fp = NULL; } /* Write to the index file if using one. */ if ((cfg->index_fp != NULL) && (cfg->parts_written > 0)) { size_t written; ib_rc = ib_lock_lock(log->ctx->auditlog->index_fp_lock); if (ib_rc != IB_OK) { goto cleanup; } ib_rc = core_audit_get_index_line(ib, log, line, LOGFORMAT_MAX_LINE_LENGTH, &len); line[len + 0] = '\n'; line[len + 1] = '\0'; if ( (ib_rc != IB_ETRUNC) && (ib_rc != IB_OK) ) { ib_lock_unlock(log->ctx->auditlog->index_fp_lock); goto cleanup; } written = fwrite(line, len, 1, cfg->index_fp); if (written == 0) { sys_rc = errno; ib_log_error(log->ib, "Error writing to audit log index: %s (%d)", strerror(sys_rc), sys_rc); /// @todo Should retry (a piped logger may have died) fclose(cfg->index_fp); cfg->index_fp = NULL; log->ctx->auditlog->index_fp = cfg->index_fp; ib_lock_unlock(log->ctx->auditlog->index_fp_lock); goto cleanup; } fflush(cfg->index_fp); ib_lock_unlock(log->ctx->auditlog->index_fp_lock); } cleanup: if (line != NULL) { free(line); } return ib_rc; }
ib_status_t core_audit_close(ib_provider_inst_t *lpi, ib_auditlog_t *log) { IB_FTRACE_INIT(); core_audit_cfg_t *cfg = (core_audit_cfg_t *)log->cfg_data; ib_core_cfg_t *corecfg; ib_status_t ib_rc; int sys_rc; char line[IB_LOGFORMAT_MAXLINELEN + 2]; int line_size = 0; /* Retrieve corecfg to get the AuditLogIndexFormat */ ib_rc = ib_context_module_config(log->ctx, ib_core_module(), &corecfg); if (ib_rc != IB_OK) { ib_log_alert(log->ib, "Failure accessing core module: %s", ib_status_to_string(ib_rc)); IB_FTRACE_RET_STATUS(ib_rc); } /* Close the audit log. */ if (cfg->fp != NULL) { fclose(cfg->fp); //rename temp to real sys_rc = rename(cfg->temp_path, cfg->full_path); if (sys_rc != 0) { sys_rc = errno; ib_log_error(log->ib, "Error renaming auditlog %s: %s (%d)", cfg->temp_path, strerror(sys_rc), sys_rc); IB_FTRACE_RET_STATUS(IB_EOTHER); } ib_log_info(log->ib, "AUDITLOG: %s", cfg->full_path); cfg->fp = NULL; } /* Write to the index file if using one. */ if ((cfg->index_fp != NULL) && (cfg->parts_written > 0)) { ib_lock_lock(&log->ctx->auditlog->index_fp_lock); ib_rc = core_audit_get_index_line(lpi, log, line, &line_size); if (ib_rc != IB_OK) { ib_lock_unlock(&log->ctx->auditlog->index_fp_lock); IB_FTRACE_RET_STATUS(ib_rc); } sys_rc = fwrite(line, line_size, 1, cfg->index_fp); if (sys_rc < 0) { sys_rc = errno; ib_log_error(log->ib, "Could not write to audit log index: %s (%d)", strerror(sys_rc), sys_rc); /// @todo Should retry (a piped logger may have died) fclose(cfg->index_fp); cfg->index_fp = NULL; log->ctx->auditlog->index_fp = cfg->index_fp; ib_lock_unlock(&log->ctx->auditlog->index_fp_lock); IB_FTRACE_RET_STATUS(IB_OK); } fflush(cfg->index_fp); ib_lock_unlock(&log->ctx->auditlog->index_fp_lock); } IB_FTRACE_RET_STATUS(IB_OK); }