/* * Copyright (C) Igor Sysoev * Copyright (C) NGINX, Inc. */ #include static const nxt_service_t nxt_services[] = { #if (NXT_HAVE_KQUEUE) { "engine", "kqueue", &nxt_kqueue_engine }, #endif #if (NXT_HAVE_EPOLL_EDGE) { "engine", "epoll", &nxt_epoll_edge_engine }, { "engine", "epoll_edge", &nxt_epoll_edge_engine }, { "engine", "epoll_level", &nxt_epoll_level_engine }, #elif (NXT_HAVE_EPOLL) { "engine", "epoll", &nxt_epoll_level_engine }, { "engine", "epoll_level", &nxt_epoll_level_engine }, #endif #if (NXT_HAVE_EVENTPORT) { "engine", "eventport", &nxt_eventport_engine }, #endif #if (NXT_HAVE_DEVPOLL) { "engine", "devpoll", &nxt_devpoll_engine }, { "engine", "/dev/poll", &nxt_devpoll_engine }, #endif #if (NXT_HAVE_POLLSET) { "engine", "pollset", &nxt_pollset_engine }, #endif { "engine", "poll", &nxt_poll_engine }, { "engine", "select", &nxt_select_engine }, #if (NXT_HAVE_OPENSSL) { "SSL/TLS", "OpenSSL", &nxt_openssl_lib }, { "SSL/TLS", "openssl", &nxt_openssl_lib }, #endif #if (NXT_HAVE_GNUTLS) { "SSL/TLS", "GnuTLS", &nxt_gnutls_lib }, { "SSL/TLS", "gnutls", &nxt_gnutls_lib }, #endif #if (NXT_HAVE_CYASSL) { "SSL/TLS", "CyaSSL", &nxt_cyassl_lib }, { "SSL/TLS", "cyassl", &nxt_cyassl_lib }, #endif }; nxt_array_t * nxt_services_init(nxt_mp_t *mp) { nxt_uint_t n; nxt_array_t *services; nxt_service_t *s; const nxt_service_t *service; services = nxt_array_create(mp, 32, sizeof(nxt_service_t)); if (nxt_fast_path(services != NULL)) { service = nxt_services; n = nxt_nitems(nxt_services); while (n != 0) { s = nxt_array_add(services); if (nxt_slow_path(s == NULL)) { return NULL; } *s = *service; service++; n--; } } return services; } nxt_int_t nxt_service_add(nxt_array_t *services, const nxt_service_t *service) { nxt_uint_t n; nxt_service_t *s; s = services->elts; n = services->nelts; while (n != 0) { if (nxt_strcmp(s->type, service->type) != 0) { goto next; } if (nxt_strcmp(s->name, service->name) != 0) { goto next; } nxt_thread_log_alert("service \"%s:%s\" is duplicate", service->type, service->name); return NXT_ERROR; next: s++; n--; } s = nxt_array_add(services); if (nxt_fast_path(s != NULL)) { *s = *service; return NXT_OK; } return NXT_ERROR; } const void * nxt_service_get(nxt_array_t *services, const char *type, const char *name) { nxt_uint_t n; const nxt_service_t *s; if (services != NULL) { s = services->elts; n = services->nelts; } else { s = nxt_services; n = nxt_nitems(nxt_services); } while (n != 0) { if (nxt_strcmp(s->type, type) == 0) { if (name == NULL) { return s->service; } if (nxt_strcmp(s->name, name) == 0) { return s->service; } } s++; n--; } nxt_thread_log_alert("service \"%s%s%s\" not found", type, (name != NULL) ? ":" : "", name); return NULL; }