static int ctdb_log_setup_syslog(TALLOC_CTX *mem_ctx, const char *logging, const char *app_name) { size_t l = strlen(CTDB_LOG_SYSLOG_PREFIX); if (logging[l] != '\0') { /* Handle non-blocking extensions here */ const char *method; if (logging[l] != ':') { return EINVAL; } method = &logging[0] + l + 1; if (strcmp(method, "nonblocking") == 0) { ctdb_log_setup_syslog_un(mem_ctx, app_name); return 0; } if (strcmp(method, "udp") == 0) { ctdb_log_setup_syslog_udp(mem_ctx, app_name, false); return 0; } if (strcmp(method, "udp-rfc5424") == 0) { ctdb_log_setup_syslog_udp(mem_ctx, app_name, true); return 0; } return EINVAL; } debug_set_callback(NULL, ctdb_log_to_syslog); return 0; }
static int ctdb_log_setup_syslog_udp(TALLOC_CTX *mem_ctx, const char *app_name, bool rfc5424) { struct ctdb_syslog_sock_state *state; struct sockaddr_in dest; int ret; state = ctdb_log_setup_syslog_common(mem_ctx, app_name); if (state == NULL) { return ENOMEM; } state->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (state->fd == -1) { int save_errno = errno; talloc_free(state); return save_errno; } dest.sin_family = AF_INET; dest.sin_port = htons(514); dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK); ret = connect(state->fd, (struct sockaddr *)&dest, sizeof(dest)); if (ret == -1) { int save_errno = errno; talloc_free(state); return save_errno; } state->hostname = get_myname(state); if (state->hostname == NULL) { /* Use a fallback instead of failing initialisation */ state->hostname = "localhost"; } if (rfc5424) { state->format = format_rfc5424; } else { state->format = format_rfc3164; } debug_set_callback(state, ctdb_log_to_syslog_sock); return 0; }
static int ctdb_log_setup_syslog_un(TALLOC_CTX *mem_ctx, const char *app_name) { struct ctdb_syslog_sock_state *state; struct sockaddr_un dest; int ret; state = ctdb_log_setup_syslog_common(mem_ctx, app_name); if (state == NULL) { return ENOMEM; } state->fd = socket(AF_UNIX, SOCK_DGRAM, 0); if (state->fd == -1) { int save_errno = errno; talloc_free(state); return save_errno; } dest.sun_family = AF_UNIX; strncpy(dest.sun_path, _PATH_LOG, sizeof(dest.sun_path)-1); ret = connect(state->fd, (struct sockaddr *)&dest, sizeof(dest)); if (ret == -1) { int save_errno = errno; talloc_free(state); return save_errno; } set_blocking(state->fd, false); state->hostname = NULL; /* Make this explicit */ state->format = format_rfc3164; debug_set_callback(state, ctdb_log_to_syslog_sock); return 0; }
/* called to initialise the driver */ _PUBLIC_ isc_result_t dlz_create(const char *dlzname, unsigned int argc, char *argv[], void **dbdata, ...) { struct dlz_bind9_data *state; const char *helper_name; va_list ap; isc_result_t result; struct ldb_dn *dn; NTSTATUS nt_status; state = talloc_zero(NULL, struct dlz_bind9_data); if (state == NULL) { return ISC_R_NOMEMORY; } talloc_set_destructor(state, dlz_state_debug_unregister); /* fill in the helper functions */ va_start(ap, dbdata); while ((helper_name = va_arg(ap, const char *)) != NULL) { b9_add_helper(state, helper_name, va_arg(ap, void*)); } va_end(ap); /* Do not install samba signal handlers */ fault_setup_disable(); /* Start logging (to the bind9 logs) */ debug_set_callback(state, b9_debug); state->ev_ctx = s4_event_context_init(state); if (state->ev_ctx == NULL) { result = ISC_R_NOMEMORY; goto failed; } result = parse_options(state, argc, argv, &state->options); if (result != ISC_R_SUCCESS) { goto failed; } state->lp = loadparm_init_global(true); if (state->lp == NULL) { result = ISC_R_NOMEMORY; goto failed; } if (state->options.debug) { lpcfg_do_global_parameter(state->lp, "log level", state->options.debug); } else { lpcfg_do_global_parameter(state->lp, "log level", "0"); } if (smb_krb5_init_context(state, state->ev_ctx, state->lp, &state->smb_krb5_ctx) != 0) { result = ISC_R_NOMEMORY; goto failed; } nt_status = gensec_init(); if (!NT_STATUS_IS_OK(nt_status)) { result = ISC_R_NOMEMORY; goto failed; } state->auth_context = talloc_zero(state, struct auth4_context); if (state->auth_context == NULL) { result = ISC_R_NOMEMORY; goto failed; } if (state->options.url == NULL) { state->options.url = lpcfg_private_path(state, state->lp, "dns/sam.ldb"); if (state->options.url == NULL) { result = ISC_R_NOMEMORY; goto failed; } } state->samdb = samdb_connect_url(state, state->ev_ctx, state->lp, system_session(state->lp), 0, state->options.url); if (state->samdb == NULL) { state->log(ISC_LOG_ERROR, "samba_dlz: Failed to connect to %s", state->options.url); result = ISC_R_FAILURE; goto failed; } dn = ldb_get_default_basedn(state->samdb); if (dn == NULL) { state->log(ISC_LOG_ERROR, "samba_dlz: Unable to get basedn for %s - %s", state->options.url, ldb_errstring(state->samdb)); result = ISC_R_FAILURE; goto failed; } state->log(ISC_LOG_INFO, "samba_dlz: started for DN %s", ldb_dn_get_linearized(dn)); state->auth_context->event_ctx = state->ev_ctx; state->auth_context->lp_ctx = state->lp; state->auth_context->sam_ctx = state->samdb; state->auth_context->generate_session_info_pac = b9_generate_session_info_pac; *dbdata = state; return ISC_R_SUCCESS; failed: talloc_free(state); return result; }
int dlz_state_debug_unregister(struct dlz_bind9_data *state) { /* Stop logging (to the bind9 logs) */ debug_set_callback(NULL, NULL); }