annotate src/os/win32/ngx_errno.c @ 8122:106328a70f4e

Added warning about redefinition of listen socket protocol options. The "listen" directive in the http module can be used multiple times in different server blocks. Originally, it was supposed to be specified once with various socket options, and without any parameters in virtual server blocks. For example: server { listen 80 backlog=1024; server_name foo; ... } server { listen 80; server_name bar; ... } server { listen 80; server_name bazz; ... } The address part of the syntax ("address[:port]" / "port" / "unix:path") uniquely identifies the listening socket, and therefore is enough for name-based virtual servers (to let nginx know that the virtual server accepts requests on the listening socket in question). To ensure that listening options do not conflict between virtual servers, they were allowed only once. For example, the following configuration will be rejected ("duplicate listen options for 0.0.0.0:80 in ..."): server { listen 80 backlog=1024; server_name foo; ... } server { listen 80 backlog=512; server_name bar; ... } At some point it was, however, noticed, that it is sometimes convenient to repeat some options for clarity. In nginx 0.8.51 the "ssl" parameter was allowed to be specified multiple times, e.g.: server { listen 443 ssl backlog=1024; server_name foo; ... } server { listen 443 ssl; server_name bar; ... } server { listen 443 ssl; server_name bazz; ... } This approach makes configuration more readable, since SSL sockets are immediately visible in the configuration. If this is not needed, just the address can still be used. Later, additional protocol-specific options similar to "ssl" were introduced, notably "http2" and "proxy_protocol". With these options, one can write: server { listen 443 ssl backlog=1024; server_name foo; ... } server { listen 443 http2; server_name bar; ... } server { listen 443 proxy_protocol; server_name bazz; ... } The resulting socket will use ssl, http2, and proxy_protocol, but this is not really obvious from the configuration. To emphasize such misleading configurations are discouraged, nginx now warns as long as the "listen" directive is used with options different from the options previously used if this is potentially confusing. In particular, the following configurations are allowed: server { listen 8401 ssl backlog=1024; server_name foo; } server { listen 8401 ssl; server_name bar; } server { listen 8401 ssl; server_name bazz; } server { listen 8402 ssl http2 backlog=1024; server_name foo; } server { listen 8402 ssl; server_name bar; } server { listen 8402 ssl; server_name bazz; } server { listen 8403 ssl; server_name bar; } server { listen 8403 ssl; server_name bazz; } server { listen 8403 ssl http2; server_name foo; } server { listen 8404 ssl http2 backlog=1024; server_name foo; } server { listen 8404 http2; server_name bar; } server { listen 8404 http2; server_name bazz; } server { listen 8405 ssl http2 backlog=1024; server_name foo; } server { listen 8405 ssl http2; server_name bar; } server { listen 8405 ssl http2; server_name bazz; } server { listen 8406 ssl; server_name foo; } server { listen 8406; server_name bar; } server { listen 8406; server_name bazz; } And the following configurations will generate warnings: server { listen 8501 ssl http2 backlog=1024; server_name foo; } server { listen 8501 http2; server_name bar; } server { listen 8501 ssl; server_name bazz; } server { listen 8502 backlog=1024; server_name foo; } server { listen 8502 ssl; server_name bar; } server { listen 8503 ssl; server_name foo; } server { listen 8503 http2; server_name bar; } server { listen 8504 ssl; server_name foo; } server { listen 8504 http2; server_name bar; } server { listen 8504 proxy_protocol; server_name bazz; } server { listen 8505 ssl http2 proxy_protocol; server_name foo; } server { listen 8505 ssl http2; server_name bar; } server { listen 8505 ssl; server_name bazz; } server { listen 8506 ssl http2; server_name foo; } server { listen 8506 ssl; server_name bar; } server { listen 8506; server_name bazz; } server { listen 8507 ssl; server_name bar; } server { listen 8507; server_name bazz; } server { listen 8507 ssl http2; server_name foo; } server { listen 8508 ssl; server_name bar; } server { listen 8508; server_name bazz; } server { listen 8508 ssl backlog=1024; server_name foo; } server { listen 8509; server_name bazz; } server { listen 8509 ssl; server_name bar; } server { listen 8509 ssl backlog=1024; server_name foo; } The basic idea is that at most two sets of protocol options are allowed: the main one (with socket options, if any), and a shorter one, with options being a subset of the main options, repeated for clarity. As long as the shorter set of protocol options is used, all listen directives except the main one should use it.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 28 Jan 2023 01:29:45 +0300
parents 746567d633ac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3787
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 186
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 186
diff changeset
6
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 186
diff changeset
7
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
98
c9b243802a17 nginx-0.0.1-2003-05-30-18:27:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
9 #include <ngx_core.h>
c9b243802a17 nginx-0.0.1-2003-05-30-18:27:59 import
Igor Sysoev <igor@sysoev.ru>
parents: 0
diff changeset
10
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2335
3d8ab5957202 ngx_strerror_r() style and size == 0 bug fix
Igor Sysoev <igor@sysoev.ru>
parents: 473
diff changeset
12 u_char *
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
13 ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
14 {
2770
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
15 u_int len;
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
16 static u_long lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
17
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
18 if (size == 0) {
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
19 return errstr;
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
20 }
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
21
2770
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
22 len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
23 NULL, err, lang, (char *) errstr, size, NULL);
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
24
7585
746567d633ac Win32: improved fallback on FormatMessage() errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4693
diff changeset
25 if (len == 0 && lang) {
2770
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
26
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
27 /*
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
28 * Try to use English messages first and fallback to a language,
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
29 * based on locale: non-English Windows have no English messages
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
30 * at all. This way allows to use English messages at least on
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
31 * Windows with MUI.
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
32 */
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
33
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
34 lang = 0;
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
35
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
36 len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
37 NULL, err, lang, (char *) errstr, size, NULL);
e70ac6e13f31 fallback to neutral language in FormatMessage()
Igor Sysoev <igor@sysoev.ru>
parents: 2766
diff changeset
38 }
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39
103
6dfda4cf5200 nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents: 98
diff changeset
40 if (len == 0) {
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
41 return ngx_snprintf(errstr, size,
2740
e5a4be07c3eb axe incomplete support of Winsock error descriptions on NT
Igor Sysoev <igor@sysoev.ru>
parents: 2739
diff changeset
42 "FormatMessage() error:(%d)", GetLastError());
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 }
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 /* remove ".\r\n\0" */
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 while (errstr[len] == '\0' || errstr[len] == CR
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 || errstr[len] == LF || errstr[len] == '.')
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
48 {
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 --len;
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
50 }
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
51
461
a88a3e4e158f nginx-0.1.5-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
52 return &errstr[++len];
0
4eff17414a43 nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
53 }
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
54
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
55
4693
f1a0de6eb505 Fixed return type of ngx_strerror_init().
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
56 ngx_int_t
3787
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
57 ngx_strerror_init(void)
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
58 {
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
59 return NGX_OK;
e294f37401c0 use copied strerror() messages and autoconfigured sys_nerr value
Igor Sysoev <igor@sysoev.ru>
parents: 2770
diff changeset
60 }