/* * callback called by server-logic when a connection should be closed. * if the authentication process succeed for this connection, call * the real close() callback function. */ static int close_connection_cb(server_generic_client_t *client) { int ret; client->state |= SERVER_GENERIC_CLIENT_STATE_CLOSING; if ( client->state & SERVER_GENERIC_CLIENT_STATE_ACCEPTED && ! (client->state & SERVER_GENERIC_CLIENT_STATE_CLOSED) ) { ret = client->server->close(client); if ( ret < 0 ) return ret; client->state |= SERVER_GENERIC_CLIENT_STATE_CLOSED; } /* * layer above server-generic are permited to set fd to NULL so * that they can take control over the connection FD. */ if ( client->fd ) { ret = do_close_fd(client); if ( ret < 0 ) return -1; prelude_io_destroy(client->fd); server_generic_log_client(client, PRELUDE_LOG_INFO, "closing connection.\n"); } server_generic_remove_client(client->server, client); free(client); return 0; }
static int handle_connection(server_generic_t *server) { int ret, client; server_generic_client_t *cdata; cdata = calloc(1, server->clientlen); if ( ! cdata ) { prelude_log(PRELUDE_LOG_ERR, "memory exhausted.\n"); return -1; } client = accept_connection(server, cdata); if ( client < 0 ) { free(cdata); return -1; } ret = setup_client_socket(server, cdata, client); if ( ret < 0 ) { free(cdata); close(client); return -1; } ret = server_generic_process_requests(server, cdata); if ( ret < 0 ) { prelude_log(PRELUDE_LOG_ERR, "queueing client FD for server logic processing failed.\n"); prelude_io_close(cdata->fd); prelude_io_destroy(cdata->fd); free(cdata); return -1; } return 0; }
void prelude_idmef_debug(idmef_message_t *idmef) { prelude_io_t *pio; prelude_io_new(&pio); prelude_io_set_file_io(pio, stderr); idmef_message_print(idmef, pio); prelude_io_destroy(pio); }
static int wait_connection(prelude_client_profile_t *cp, int sock, struct pollfd *pfd, size_t size, int keepalive, gnutls_x509_privkey_t key, gnutls_x509_crt_t cacrt, gnutls_x509_crt_t crt) { size_t i; prelude_io_t *fd; int ret, active_fd; ret = prelude_io_new(&fd); if ( ret < 0 ) { fprintf(stderr, "%s: error creating a new IO object: %s.\n", prelude_strsource(ret), prelude_strerror(ret)); return -1; } do { active_fd = poll(pfd, size, -1); if ( active_fd < 0 ) { if ( errno != EINTR ) fprintf(stderr, "poll error : %s.\n", strerror(errno)); return -1; } for ( i = 0; i < size && active_fd > 0; i++ ) { if ( pfd[i].revents & POLLIN ) { active_fd--; ret = process_event(cp, pfd[i].fd, fd, key, cacrt, crt); } } } while ( keepalive || ret < 0 ); prelude_io_destroy(fd); return ret; }