From 029c1a9f509b2af60e02d74ef982fda1346d85e0 Mon Sep 17 00:00:00 2001 From: Valentin Bartenev Date: Tue, 9 Oct 2018 17:53:31 +0300 Subject: Renamed "go" application type to "external". There's nothing specific to Go language. This type of application object can be used to run any external application that utilizes libunit API. --- src/nxt_application.c | 8 +-- src/nxt_application.h | 26 +++---- src/nxt_conf_validation.c | 32 ++++----- src/nxt_external.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++ src/nxt_go.c | 175 --------------------------------------------- src/nxt_main_process.c | 42 +++++------ src/nxt_router.c | 2 +- src/nxt_runtime.c | 4 +- 8 files changed, 235 insertions(+), 232 deletions(-) create mode 100644 src/nxt_external.c delete mode 100644 src/nxt_go.c (limited to 'src') diff --git a/src/nxt_application.c b/src/nxt_application.c index 3c62f7d4..acdebe04 100644 --- a/src/nxt_application.c +++ b/src/nxt_application.c @@ -507,15 +507,15 @@ nxt_app_parse_type(u_char *p, size_t length) str.length = length; str.start = p; - if (nxt_str_eq(&str, "python", 6)) { + if (nxt_str_eq(&str, "external", 8) || nxt_str_eq(&str, "go", 2)) { + return NXT_APP_EXTERNAL; + + } else if (nxt_str_eq(&str, "python", 6)) { return NXT_APP_PYTHON; } else if (nxt_str_eq(&str, "php", 3)) { return NXT_APP_PHP; - } else if (nxt_str_eq(&str, "go", 2)) { - return NXT_APP_GO; - } else if (nxt_str_eq(&str, "perl", 4)) { return NXT_APP_PERL; diff --git a/src/nxt_application.h b/src/nxt_application.h index 35346655..10f5a922 100644 --- a/src/nxt_application.h +++ b/src/nxt_application.h @@ -15,9 +15,9 @@ typedef enum { + NXT_APP_EXTERNAL, NXT_APP_PYTHON, NXT_APP_PHP, - NXT_APP_GO, NXT_APP_PERL, NXT_APP_RUBY, @@ -39,6 +39,12 @@ typedef struct { typedef struct nxt_common_app_conf_s nxt_common_app_conf_t; +typedef struct { + char *executable; + nxt_conf_value_t *arguments; +} nxt_external_app_conf_t; + + typedef struct { char *home; nxt_str_t path; @@ -54,12 +60,6 @@ typedef struct { } nxt_php_app_conf_t; -typedef struct { - char *executable; - nxt_conf_value_t *arguments; -} nxt_go_app_conf_t; - - typedef struct { char *script; } nxt_perl_app_conf_t; @@ -80,11 +80,11 @@ struct nxt_common_app_conf_s { nxt_conf_value_t *environment; union { - nxt_python_app_conf_t python; - nxt_php_app_conf_t php; - nxt_go_app_conf_t go; - nxt_perl_app_conf_t perl; - nxt_ruby_app_conf_t ruby; + nxt_external_app_conf_t external; + nxt_python_app_conf_t python; + nxt_php_app_conf_t php; + nxt_perl_app_conf_t perl; + nxt_ruby_app_conf_t ruby; } u; }; @@ -161,7 +161,7 @@ nxt_app_lang_module_t *nxt_app_lang_module(nxt_runtime_t *rt, nxt_str_t *name); nxt_app_type_t nxt_app_parse_type(u_char *p, size_t length); NXT_EXPORT extern nxt_str_t nxt_server; -extern nxt_app_module_t nxt_go_module; +extern nxt_app_module_t nxt_external_module; NXT_EXPORT nxt_int_t nxt_unit_default_init(nxt_task_t *task, nxt_unit_init_t *init); diff --git a/src/nxt_conf_validation.c b/src/nxt_conf_validation.c index ca7107cc..b1e30955 100644 --- a/src/nxt_conf_validation.c +++ b/src/nxt_conf_validation.c @@ -256,6 +256,21 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_common_members[] = { }; +static nxt_conf_vldt_object_t nxt_conf_vldt_external_members[] = { + { nxt_string("executable"), + NXT_CONF_VLDT_STRING, + NULL, + NULL }, + + { nxt_string("arguments"), + NXT_CONF_VLDT_ARRAY, + &nxt_conf_vldt_array_iterator, + (void *) &nxt_conf_vldt_argument }, + + NXT_CONF_VLDT_NEXT(&nxt_conf_vldt_common_members) +}; + + static nxt_conf_vldt_object_t nxt_conf_vldt_python_members[] = { { nxt_string("home"), NXT_CONF_VLDT_STRING, @@ -321,21 +336,6 @@ static nxt_conf_vldt_object_t nxt_conf_vldt_php_members[] = { }; -static nxt_conf_vldt_object_t nxt_conf_vldt_go_members[] = { - { nxt_string("executable"), - NXT_CONF_VLDT_STRING, - NULL, - NULL }, - - { nxt_string("arguments"), - NXT_CONF_VLDT_ARRAY, - &nxt_conf_vldt_array_iterator, - (void *) &nxt_conf_vldt_argument }, - - NXT_CONF_VLDT_NEXT(&nxt_conf_vldt_common_members) -}; - - static nxt_conf_vldt_object_t nxt_conf_vldt_perl_members[] = { { nxt_string("script"), NXT_CONF_VLDT_STRING, @@ -565,9 +565,9 @@ nxt_conf_vldt_app(nxt_conf_validation_t *vldt, nxt_str_t *name, static nxt_str_t type_str = nxt_string("type"); static void *members[] = { + nxt_conf_vldt_external_members, nxt_conf_vldt_python_members, nxt_conf_vldt_php_members, - nxt_conf_vldt_go_members, nxt_conf_vldt_perl_members, nxt_conf_vldt_ruby_members, }; diff --git a/src/nxt_external.c b/src/nxt_external.c new file mode 100644 index 00000000..c7aacffc --- /dev/null +++ b/src/nxt_external.c @@ -0,0 +1,178 @@ + +/* + * Copyright (C) Max Romanov + * Copyright (C) NGINX, Inc. + */ + +#include +#include +#include + + +static nxt_int_t nxt_external_init(nxt_task_t *task, + nxt_common_app_conf_t *conf); + + +nxt_app_module_t nxt_external_module = { + 0, + NULL, + nxt_string("external"), + "*", + nxt_external_init, +}; + + +extern char **environ; + + +nxt_inline nxt_int_t +nxt_external_fd_no_cloexec(nxt_task_t *task, nxt_socket_t fd) +{ + int res, flags; + + if (fd == -1) { + return NXT_OK; + } + + flags = fcntl(fd, F_GETFD); + + if (nxt_slow_path(flags == -1)) { + nxt_alert(task, "fcntl(%d, F_GETFD) failed %E", fd, nxt_errno); + return NXT_ERROR; + } + + flags &= ~FD_CLOEXEC; + + res = fcntl(fd, F_SETFD, flags); + + if (nxt_slow_path(res == -1)) { + nxt_alert(task, "fcntl(%d, F_SETFD) failed %E", fd, nxt_errno); + return NXT_ERROR; + } + + nxt_fd_blocking(task, fd); + + return NXT_OK; +} + + +static nxt_int_t +nxt_external_init(nxt_task_t *task, nxt_common_app_conf_t *conf) +{ + char **argv; + u_char buf[256]; + u_char *p, *end; + uint32_t index; + size_t size; + nxt_str_t str; + nxt_int_t rc; + nxt_uint_t i, argc; + nxt_port_t *my_port, *main_port; + nxt_runtime_t *rt; + nxt_conf_value_t *value; + nxt_external_app_conf_t *c; + + rt = task->thread->runtime; + + main_port = rt->port_by_type[NXT_PROCESS_MAIN]; + my_port = nxt_runtime_port_find(rt, nxt_pid, 0); + + if (nxt_slow_path(main_port == NULL || my_port == NULL)) { + return NXT_ERROR; + } + + rc = nxt_external_fd_no_cloexec(task, main_port->pair[1]); + if (nxt_slow_path(rc != NXT_OK)) { + return NXT_ERROR; + } + + rc = nxt_external_fd_no_cloexec(task, my_port->pair[0]); + if (nxt_slow_path(rc != NXT_OK)) { + return NXT_ERROR; + } + + end = buf + sizeof(buf); + + p = nxt_sprintf(buf, end, + "%s;%uD;" + "%PI,%ud,%d;" + "%PI,%ud,%d;" + "%d,%Z", + NXT_VERSION, my_port->process->init->stream, + main_port->pid, main_port->id, main_port->pair[1], + my_port->pid, my_port->id, my_port->pair[0], + 2); + + if (nxt_slow_path(p == end)) { + nxt_alert(task, "internal error: buffer too small for NXT_UNIT_INIT"); + + return NXT_ERROR; + } + + nxt_debug(task, "update "NXT_UNIT_INIT_ENV"=%s", buf); + + rc = setenv(NXT_UNIT_INIT_ENV, (char *) buf, 1); + if (nxt_slow_path(rc == -1)) { + nxt_alert(task, "setenv("NXT_UNIT_INIT_ENV", %s) failed %E", buf, + nxt_errno); + + return NXT_ERROR; + } + + c = &conf->u.external; + + argc = 2; + size = 0; + + if (c->arguments != NULL) { + + for (index = 0; /* void */ ; index++) { + value = nxt_conf_get_array_element(c->arguments, index); + if (value == NULL) { + break; + } + + nxt_conf_get_string(value, &str); + + size += str.length + 1; + argc++; + } + } + + argv = nxt_malloc(argc * sizeof(argv[0]) + size); + if (nxt_slow_path(argv == NULL)) { + nxt_alert(task, "failed to allocate arguments"); + return NXT_ERROR; + } + + argv[0] = c->executable; + i = 1; + + if (c->arguments != NULL) { + p = (u_char *) &argv[argc]; + + for (index = 0; /* void */ ; index++) { + value = nxt_conf_get_array_element(c->arguments, index); + if (value == NULL) { + break; + } + + argv[i++] = (char *) p; + + nxt_conf_get_string(value, &str); + + p = nxt_cpymem(p, str.start, str.length); + *p++ = '\0'; + } + } + + argv[i] = NULL; + + (void) execve(c->executable, argv, environ); + + nxt_alert(task, "execve(%s) failed %E", c->executable, nxt_errno); + + nxt_free(argv); + + return NXT_ERROR; +} diff --git a/src/nxt_go.c b/src/nxt_go.c deleted file mode 100644 index 4e7d0488..00000000 --- a/src/nxt_go.c +++ /dev/null @@ -1,175 +0,0 @@ - -/* - * Copyright (C) Max Romanov - * Copyright (C) NGINX, Inc. - */ - -#include -#include -#include - - -static nxt_int_t nxt_go_init(nxt_task_t *task, nxt_common_app_conf_t *conf); - -nxt_app_module_t nxt_go_module = { - 0, - NULL, - nxt_string("go"), - "*", - nxt_go_init, -}; - - -extern char **environ; - -nxt_inline nxt_int_t -nxt_go_fd_no_cloexec(nxt_task_t *task, nxt_socket_t fd) -{ - int res, flags; - - if (fd == -1) { - return NXT_OK; - } - - flags = fcntl(fd, F_GETFD); - - if (nxt_slow_path(flags == -1)) { - nxt_alert(task, "fcntl(%d, F_GETFD) failed %E", fd, nxt_errno); - return NXT_ERROR; - } - - flags &= ~FD_CLOEXEC; - - res = fcntl(fd, F_SETFD, flags); - - if (nxt_slow_path(res == -1)) { - nxt_alert(task, "fcntl(%d, F_SETFD) failed %E", fd, nxt_errno); - return NXT_ERROR; - } - - nxt_fd_blocking(task, fd); - - return NXT_OK; -} - - -static nxt_int_t -nxt_go_init(nxt_task_t *task, nxt_common_app_conf_t *conf) -{ - char **argv; - u_char buf[256]; - u_char *p, *end; - uint32_t index; - size_t size; - nxt_str_t str; - nxt_int_t rc; - nxt_uint_t i, argc; - nxt_port_t *my_port, *main_port; - nxt_runtime_t *rt; - nxt_conf_value_t *value; - nxt_go_app_conf_t *c; - - rt = task->thread->runtime; - - main_port = rt->port_by_type[NXT_PROCESS_MAIN]; - my_port = nxt_runtime_port_find(rt, nxt_pid, 0); - - if (nxt_slow_path(main_port == NULL || my_port == NULL)) { - return NXT_ERROR; - } - - rc = nxt_go_fd_no_cloexec(task, main_port->pair[1]); - if (nxt_slow_path(rc != NXT_OK)) { - return NXT_ERROR; - } - - rc = nxt_go_fd_no_cloexec(task, my_port->pair[0]); - if (nxt_slow_path(rc != NXT_OK)) { - return NXT_ERROR; - } - - end = buf + sizeof(buf); - - p = nxt_sprintf(buf, end, - "%s;%uD;" - "%PI,%ud,%d;" - "%PI,%ud,%d;" - "%d,%Z", - NXT_VERSION, my_port->process->init->stream, - main_port->pid, main_port->id, main_port->pair[1], - my_port->pid, my_port->id, my_port->pair[0], - 2); - - if (nxt_slow_path(p == end)) { - nxt_alert(task, "internal error: buffer too small for NXT_UNIT_INIT"); - - return NXT_ERROR; - } - - nxt_debug(task, "update "NXT_UNIT_INIT_ENV"=%s", buf); - - rc = setenv(NXT_UNIT_INIT_ENV, (char *) buf, 1); - if (nxt_slow_path(rc == -1)) { - nxt_alert(task, "setenv("NXT_UNIT_INIT_ENV", %s) failed %E", buf, - nxt_errno); - - return NXT_ERROR; - } - - c = &conf->u.go; - - argc = 2; - size = 0; - - if (c->arguments != NULL) { - - for (index = 0; /* void */ ; index++) { - value = nxt_conf_get_array_element(c->arguments, index); - if (value == NULL) { - break; - } - - nxt_conf_get_string(value, &str); - - size += str.length + 1; - argc++; - } - } - - argv = nxt_malloc(argc * sizeof(argv[0]) + size); - if (nxt_slow_path(argv == NULL)) { - nxt_alert(task, "failed to allocate arguments"); - return NXT_ERROR; - } - - argv[0] = c->executable; - i = 1; - - if (c->arguments != NULL) { - p = (u_char *) &argv[argc]; - - for (index = 0; /* void */ ; index++) { - value = nxt_conf_get_array_element(c->arguments, index); - if (value == NULL) { - break; - } - - argv[i++] = (char *) p; - - nxt_conf_get_string(value, &str); - - p = nxt_cpymem(p, str.start, str.length); - *p++ = '\0'; - } - } - - argv[i] = NULL; - - (void) execve(c->executable, argv, environ); - - nxt_alert(task, "execve(%s) failed %E", c->executable, nxt_errno); - - nxt_free(argv); - - return NXT_ERROR; -} diff --git a/src/nxt_main_process.c b/src/nxt_main_process.c index 491b09f3..819ed44c 100644 --- a/src/nxt_main_process.c +++ b/src/nxt_main_process.c @@ -134,6 +134,22 @@ static nxt_conf_map_t nxt_common_app_conf[] = { }; +static nxt_conf_map_t nxt_external_app_conf[] = { + { + nxt_string("executable"), + NXT_CONF_MAP_CSTRZ, + offsetof(nxt_common_app_conf_t, u.external.executable), + }, + + { + nxt_string("arguments"), + NXT_CONF_MAP_PTR, + offsetof(nxt_common_app_conf_t, u.external.arguments), + }, + +}; + + static nxt_conf_map_t nxt_python_app_conf[] = { { nxt_string("home"), @@ -182,22 +198,6 @@ static nxt_conf_map_t nxt_php_app_conf[] = { }; -static nxt_conf_map_t nxt_go_app_conf[] = { - { - nxt_string("executable"), - NXT_CONF_MAP_CSTRZ, - offsetof(nxt_common_app_conf_t, u.go.executable), - }, - - { - nxt_string("arguments"), - NXT_CONF_MAP_PTR, - offsetof(nxt_common_app_conf_t, u.go.arguments), - }, - -}; - - static nxt_conf_map_t nxt_perl_app_conf[] = { { nxt_string("script"), @@ -217,11 +217,11 @@ static nxt_conf_map_t nxt_ruby_app_conf[] = { static nxt_conf_app_map_t nxt_app_maps[] = { - { nxt_nitems(nxt_python_app_conf), nxt_python_app_conf }, - { nxt_nitems(nxt_php_app_conf), nxt_php_app_conf }, - { nxt_nitems(nxt_go_app_conf), nxt_go_app_conf }, - { nxt_nitems(nxt_perl_app_conf), nxt_perl_app_conf }, - { nxt_nitems(nxt_ruby_app_conf), nxt_ruby_app_conf }, + { nxt_nitems(nxt_external_app_conf), nxt_external_app_conf }, + { nxt_nitems(nxt_python_app_conf), nxt_python_app_conf }, + { nxt_nitems(nxt_php_app_conf), nxt_php_app_conf }, + { nxt_nitems(nxt_perl_app_conf), nxt_perl_app_conf }, + { nxt_nitems(nxt_ruby_app_conf), nxt_ruby_app_conf }, }; diff --git a/src/nxt_router.c b/src/nxt_router.c index 139b2c4c..3a5382e4 100644 --- a/src/nxt_router.c +++ b/src/nxt_router.c @@ -289,9 +289,9 @@ static const nxt_str_t http_prefix = nxt_string("HTTP_"); static const nxt_str_t empty_prefix = nxt_string(""); static const nxt_str_t *nxt_app_msg_prefix[] = { + &empty_prefix, &http_prefix, &http_prefix, - &empty_prefix, &http_prefix, &http_prefix, }; diff --git a/src/nxt_runtime.c b/src/nxt_runtime.c index 311c2c08..8f20e0a0 100644 --- a/src/nxt_runtime.c +++ b/src/nxt_runtime.c @@ -80,10 +80,10 @@ nxt_runtime_create(nxt_task_t *task) /* Should not fail. */ lang = nxt_array_add(rt->languages); - lang->type = NXT_APP_GO; + lang->type = NXT_APP_EXTERNAL; lang->version = (u_char *) ""; lang->file = NULL; - lang->module = &nxt_go_module; + lang->module = &nxt_external_module; listen_sockets = nxt_array_create(mp, 1, sizeof(nxt_listen_socket_t)); if (nxt_slow_path(listen_sockets == NULL)) { -- cgit