ret_t cherokee_socket_accept_fd (cherokee_socket_t *server_socket, int *new_fd, cherokee_sockaddr_t *sa) { ret_t ret; socklen_t len; int new_socket; /* Get the new connection */ len = sizeof (cherokee_sockaddr_t); do { new_socket = accept (server_socket->socket, &sa->sa, &len); } while ((new_socket == -1) && (errno == EINTR)); if (new_socket < 0) { return ret_error; } /* It'd nice to be able to reuse the address even if the * socket is still in TIME_WAIT statue (2*RTT ~ 120 seg) */ cherokee_fd_set_reuseaddr (new_socket); /* Close-on-exec: Child processes won't inherit this fd */ cherokee_fd_set_closexec (new_socket); /* Enables nonblocking I/O. */ ret = cherokee_fd_set_nonblocking (new_socket, true); if (ret != ret_ok) { LOG_WARNING (CHEROKEE_ERROR_SOCKET_NON_BLOCKING, new_socket); cherokee_fd_close (new_socket); return ret_error; } /* Disable Nagle's algorithm for this connection * so that there is no delay involved when sending data * which don't fill up a full IP datagram. */ ret = cherokee_fd_set_nodelay (new_socket, true); if (ret != ret_ok) { LOG_WARNING_S (CHEROKEE_ERROR_SOCKET_RM_NAGLES); cherokee_fd_close (new_socket); return ret_error; } *new_fd = new_socket; return ret_ok; }
ret_t cherokee_socket_accept_fd (cherokee_socket_t *server_socket, int *new_fd, cherokee_sockaddr_t *sa) { ret_t ret; socklen_t len; int new_socket; /* Get the new connection */ len = sizeof (cherokee_sockaddr_t); do { new_socket = accept (server_socket->socket, &sa->sa, &len); } while ((new_socket == -1) && (errno == EINTR)); if (new_socket < 0) { return ret_error; } #if 0 /* DISABLED */ /* Deal with the FIN_WAIT2 state */ re = 1; re = setsockopt (new_socket, SOL_SOCKET, SO_KEEPALIVE, &re, sizeof(re)); if (re == -1) { LOG_ERRNO (errno, cherokee_err_warning, CHEROKEE_ERROR_SOCKET_SET_KEEPALIVE, new_socket); } linger.l_onoff = 1; linger.l_linger = SECONDS_TO_LINGER; re = setsockopt (new_socket, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)); if (re == -1) { LOG_ERRNO (errno, cherokee_err_warning, CHEROKEE_ERROR_SOCKET_SET_LINGER, new_socket); } #endif /* Close-on-exec: Child processes won't inherit this fd */ cherokee_fd_set_closexec (new_socket); /* Enables nonblocking I/O. */ ret = cherokee_fd_set_nonblocking (new_socket, true); if (ret != ret_ok) { LOG_WARNING (CHEROKEE_ERROR_SOCKET_NON_BLOCKING, new_socket); cherokee_fd_close (new_socket); return ret_error; } /* Disable Nagle's algorithm for this connection * so that there is no delay involved when sending data * which don't fill up a full IP datagram. */ ret = cherokee_fd_set_nodelay (new_socket, true); if (ret != ret_ok) { LOG_WARNING_S (CHEROKEE_ERROR_SOCKET_RM_NAGLES); cherokee_fd_close (new_socket); return ret_error; } *new_fd = new_socket; return ret_ok; }
ret_t http2d_init (void) { if (_initialized) return ret_ok; /* Init OpenSSL */ OPENSSL_config (NULL); SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); /* Ensure PRNG has been seeded with enough data */ if (RAND_status() == 0) { LOG_WARNING_S (HTTP2D_ERROR_SSL_NO_ENTROPY); } /* Init concurrency related stuff */ if ((CRYPTO_get_id_callback() == NULL) && (CRYPTO_get_locking_callback() == NULL)) { cuint_t n; CRYPTO_set_id_callback (__get_thread_id); CRYPTO_set_locking_callback (__lock_thread); locks_num = CRYPTO_num_locks(); locks = malloc (locks_num * sizeof(*locks)); for (n = 0; n < locks_num; n++) { HTTP2D_MUTEX_INIT (&locks[n], NULL); } } /* Engines */ ENGINE_load_builtin_engines(); OpenSSL_add_all_algorithms(); ENGINE *e = ENGINE_by_id("pkcs11"); while (e != NULL) { if(! ENGINE_init(e)) { ENGINE_free (e); LOG_CRITICAL_S (HTTP2D_ERROR_SSL_PKCS11); break; } if(! ENGINE_set_default(e, ENGINE_METHOD_ALL)) { ENGINE_free (e); LOG_CRITICAL_S (HTTP2D_ERROR_SSL_DEFAULTS); break; } ENGINE_finish(e); ENGINE_free(e); break; } return ret_ok; }