void noit_console_motd(eventer_t e, acceptor_closure_t *ac, noit_console_closure_t ncct) { int ssl; ssl = eventer_get_eventer_ssl_ctx(e) ? 1 : 0; nc_printf(ncct, "noitd%s: %s\n", ssl ? "(secure)" : "", ac->remote_cn ? ac->remote_cn : "(no auth)"); }
static int noit_listener_accept_ssl(eventer_t e, int mask, void *closure, struct timeval *tv) { int rv; listener_closure_t listener_closure = (listener_closure_t)closure; acceptor_closure_t *ac = NULL; if(!closure) goto socketfail; ac = listener_closure->dispatch_closure; rv = eventer_SSL_accept(e, &mask); if(rv > 0) { eventer_ssl_ctx_t *sslctx; e->callback = listener_closure->dispatch_callback; /* We must make a copy of the acceptor_closure_t for each new * connection. */ if((sslctx = eventer_get_eventer_ssl_ctx(e)) != NULL) { const char *cn, *end; cn = eventer_ssl_get_peer_subject(sslctx); if(cn && (cn = strstr(cn, "CN=")) != NULL) { cn += 3; end = cn; while(*end && *end != '/') end++; ac->remote_cn = malloc(end - cn + 1); memcpy(ac->remote_cn, cn, end - cn); ac->remote_cn[end-cn] = '\0'; } } e->closure = ac; noitL(nldeb, "noit_listener[%s] SSL_accept on fd %d [%s]\n", eventer_name_for_callback_e(e->callback, e), e->fd, ac->remote_cn ? ac->remote_cn : "anonymous"); if(listener_closure) free(listener_closure); return e->callback(e, mask, e->closure, tv); } if(errno == EAGAIN) return mask|EVENTER_EXCEPTION; socketfail: if(listener_closure) free(listener_closure); if(ac) acceptor_closure_free(ac); eventer_remove_fd(e->fd); e->opset->close(e->fd, &mask, e); return 0; }