10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #include <nxt_main.h> 80Sigor@sysoev.ru 90Sigor@sysoev.ru 100Sigor@sysoev.ru static const nxt_service_t nxt_services[] = { 110Sigor@sysoev.ru 120Sigor@sysoev.ru #if (NXT_HAVE_KQUEUE) 13*12Sigor@sysoev.ru { "engine", "kqueue", &nxt_kqueue_engine }, 140Sigor@sysoev.ru #endif 150Sigor@sysoev.ru 160Sigor@sysoev.ru #if (NXT_HAVE_EPOLL_EDGE) 17*12Sigor@sysoev.ru { "engine", "epoll", &nxt_epoll_edge_engine }, 18*12Sigor@sysoev.ru { "engine", "epoll_edge", &nxt_epoll_edge_engine }, 19*12Sigor@sysoev.ru { "engine", "epoll_level", &nxt_epoll_level_engine }, 200Sigor@sysoev.ru 210Sigor@sysoev.ru #elif (NXT_HAVE_EPOLL) 22*12Sigor@sysoev.ru { "engine", "epoll", &nxt_epoll_level_engine }, 23*12Sigor@sysoev.ru { "engine", "epoll_level", &nxt_epoll_level_engine }, 240Sigor@sysoev.ru #endif 250Sigor@sysoev.ru 260Sigor@sysoev.ru #if (NXT_HAVE_EVENTPORT) 27*12Sigor@sysoev.ru { "engine", "eventport", &nxt_eventport_engine }, 280Sigor@sysoev.ru #endif 290Sigor@sysoev.ru 300Sigor@sysoev.ru #if (NXT_HAVE_DEVPOLL) 31*12Sigor@sysoev.ru { "engine", "devpoll", &nxt_devpoll_engine }, 32*12Sigor@sysoev.ru { "engine", "/dev/poll", &nxt_devpoll_engine }, 330Sigor@sysoev.ru #endif 340Sigor@sysoev.ru 350Sigor@sysoev.ru #if (NXT_HAVE_POLLSET) 36*12Sigor@sysoev.ru { "engine", "pollset", &nxt_pollset_engine }, 370Sigor@sysoev.ru #endif 380Sigor@sysoev.ru 39*12Sigor@sysoev.ru { "engine", "poll", &nxt_poll_engine }, 40*12Sigor@sysoev.ru { "engine", "select", &nxt_select_engine }, 410Sigor@sysoev.ru 420Sigor@sysoev.ru #if (NXT_HAVE_OPENSSL) 430Sigor@sysoev.ru { "SSL/TLS", "OpenSSL", &nxt_openssl_lib }, 440Sigor@sysoev.ru { "SSL/TLS", "openssl", &nxt_openssl_lib }, 450Sigor@sysoev.ru #endif 460Sigor@sysoev.ru 470Sigor@sysoev.ru #if (NXT_HAVE_GNUTLS) 480Sigor@sysoev.ru { "SSL/TLS", "GnuTLS", &nxt_gnutls_lib }, 490Sigor@sysoev.ru { "SSL/TLS", "gnutls", &nxt_gnutls_lib }, 500Sigor@sysoev.ru #endif 510Sigor@sysoev.ru 520Sigor@sysoev.ru #if (NXT_HAVE_CYASSL) 530Sigor@sysoev.ru { "SSL/TLS", "CyaSSL", &nxt_cyassl_lib }, 540Sigor@sysoev.ru { "SSL/TLS", "cyassl", &nxt_cyassl_lib }, 550Sigor@sysoev.ru #endif 560Sigor@sysoev.ru 570Sigor@sysoev.ru }; 580Sigor@sysoev.ru 590Sigor@sysoev.ru 600Sigor@sysoev.ru nxt_array_t * 610Sigor@sysoev.ru nxt_services_init(nxt_mem_pool_t *mp) 620Sigor@sysoev.ru { 630Sigor@sysoev.ru nxt_uint_t n; 640Sigor@sysoev.ru nxt_array_t *services; 650Sigor@sysoev.ru nxt_service_t *s; 660Sigor@sysoev.ru const nxt_service_t *service; 670Sigor@sysoev.ru 680Sigor@sysoev.ru services = nxt_array_create(mp, 32, sizeof(nxt_service_t)); 690Sigor@sysoev.ru 700Sigor@sysoev.ru if (nxt_fast_path(services != NULL)) { 710Sigor@sysoev.ru 720Sigor@sysoev.ru service = nxt_services; 730Sigor@sysoev.ru n = nxt_nitems(nxt_services); 740Sigor@sysoev.ru 750Sigor@sysoev.ru while (n != 0) { 760Sigor@sysoev.ru s = nxt_array_add(services); 770Sigor@sysoev.ru if (nxt_slow_path(s == NULL)) { 780Sigor@sysoev.ru return NULL; 790Sigor@sysoev.ru } 800Sigor@sysoev.ru 810Sigor@sysoev.ru *s = *service; 820Sigor@sysoev.ru 830Sigor@sysoev.ru service++; 840Sigor@sysoev.ru n--; 850Sigor@sysoev.ru } 860Sigor@sysoev.ru } 870Sigor@sysoev.ru 880Sigor@sysoev.ru return services; 890Sigor@sysoev.ru } 900Sigor@sysoev.ru 910Sigor@sysoev.ru 920Sigor@sysoev.ru nxt_int_t 930Sigor@sysoev.ru nxt_service_add(nxt_array_t *services, const nxt_service_t *service) 940Sigor@sysoev.ru { 950Sigor@sysoev.ru nxt_uint_t n; 960Sigor@sysoev.ru nxt_service_t *s; 970Sigor@sysoev.ru 980Sigor@sysoev.ru s = services->elts; 990Sigor@sysoev.ru n = services->nelts; 1000Sigor@sysoev.ru 1010Sigor@sysoev.ru while (n != 0) { 1020Sigor@sysoev.ru if (nxt_strcmp(s->type, service->type) != 0) { 1030Sigor@sysoev.ru goto next; 1040Sigor@sysoev.ru } 1050Sigor@sysoev.ru 1060Sigor@sysoev.ru if (nxt_strcmp(s->name, service->name) != 0) { 1070Sigor@sysoev.ru goto next; 1080Sigor@sysoev.ru } 1090Sigor@sysoev.ru 1100Sigor@sysoev.ru nxt_thread_log_emerg("service \"%s:%s\" is duplicate", 1110Sigor@sysoev.ru service->type, service->name); 1120Sigor@sysoev.ru return NXT_ERROR; 1130Sigor@sysoev.ru 1140Sigor@sysoev.ru next: 1150Sigor@sysoev.ru 1160Sigor@sysoev.ru s++; 1170Sigor@sysoev.ru n--; 1180Sigor@sysoev.ru } 1190Sigor@sysoev.ru 1200Sigor@sysoev.ru s = nxt_array_add(services); 1210Sigor@sysoev.ru if (nxt_fast_path(s != NULL)) { 1220Sigor@sysoev.ru *s = *service; 1230Sigor@sysoev.ru return NXT_OK; 1240Sigor@sysoev.ru } 1250Sigor@sysoev.ru 1260Sigor@sysoev.ru return NXT_ERROR; 1270Sigor@sysoev.ru } 1280Sigor@sysoev.ru 1290Sigor@sysoev.ru 1300Sigor@sysoev.ru const void * 1310Sigor@sysoev.ru nxt_service_get(nxt_array_t *services, const char *type, const char *name) 1320Sigor@sysoev.ru { 1330Sigor@sysoev.ru nxt_uint_t n; 1340Sigor@sysoev.ru const nxt_service_t *s; 1350Sigor@sysoev.ru 1360Sigor@sysoev.ru if (services != NULL) { 1370Sigor@sysoev.ru s = services->elts; 1380Sigor@sysoev.ru n = services->nelts; 1390Sigor@sysoev.ru 1400Sigor@sysoev.ru } else { 1410Sigor@sysoev.ru s = nxt_services; 1420Sigor@sysoev.ru n = nxt_nitems(nxt_services); 1430Sigor@sysoev.ru } 1440Sigor@sysoev.ru 1450Sigor@sysoev.ru while (n != 0) { 1460Sigor@sysoev.ru if (nxt_strcmp(s->type, type) == 0) { 1470Sigor@sysoev.ru 1480Sigor@sysoev.ru if (name == NULL) { 1490Sigor@sysoev.ru return s->service; 1500Sigor@sysoev.ru } 1510Sigor@sysoev.ru 1520Sigor@sysoev.ru if (nxt_strcmp(s->name, name) == 0) { 1530Sigor@sysoev.ru return s->service; 1540Sigor@sysoev.ru } 1550Sigor@sysoev.ru } 1560Sigor@sysoev.ru 1570Sigor@sysoev.ru s++; 1580Sigor@sysoev.ru n--; 1590Sigor@sysoev.ru } 1600Sigor@sysoev.ru 1610Sigor@sysoev.ru nxt_thread_log_emerg("service \"%s%s%s\" not found", 1620Sigor@sysoev.ru type, (name != NULL) ? ":" : "", name); 1630Sigor@sysoev.ru 1640Sigor@sysoev.ru return NULL; 1650Sigor@sysoev.ru } 166