annotate src/http/modules/ngx_http_upstream_zone_module.c @ 7653:8409f9df6219

SSL: client certificate validation with OCSP (ticket #1534). OCSP validation for client certificates is enabled by the "ssl_ocsp" directive. OCSP responder can be optionally specified by "ssl_ocsp_responder". When session is reused, peer chain is not available for validation. If the verified chain contains certificates from the peer chain not available at the server, validation will fail.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 22 May 2020 17:30:12 +0300
parents 3b1b81e248bc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2 /*
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 * Copyright (C) Ruslan Ermilov
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
12
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13 static char *ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
14 void *conf);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
15 static ngx_int_t ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 void *data);
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
17 static ngx_http_upstream_rr_peers_t *ngx_http_upstream_zone_copy_peers(
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
18 ngx_slab_pool_t *shpool, ngx_http_upstream_srv_conf_t *uscf);
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
19 static ngx_http_upstream_rr_peer_t *ngx_http_upstream_zone_copy_peer(
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
20 ngx_http_upstream_rr_peers_t *peers, ngx_http_upstream_rr_peer_t *src);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 static ngx_command_t ngx_http_upstream_zone_commands[] = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 { ngx_string("zone"),
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
26 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27 ngx_http_upstream_zone,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30 NULL },
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 ngx_null_command
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 static ngx_http_module_t ngx_http_upstream_zone_module_ctx = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 NULL, /* preconfiguration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38 NULL, /* postconfiguration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40 NULL, /* create main configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 NULL, /* init main configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43 NULL, /* create server configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44 NULL, /* merge server configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 NULL, /* create location configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 NULL /* merge location configuration */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 ngx_module_t ngx_http_upstream_zone_module = {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 NGX_MODULE_V1,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53 &ngx_http_upstream_zone_module_ctx, /* module context */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 ngx_http_upstream_zone_commands, /* module directives */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 NGX_HTTP_MODULE, /* module type */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56 NULL, /* init master */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 NULL, /* init module */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58 NULL, /* init process */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59 NULL, /* init thread */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 NULL, /* exit thread */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 NULL, /* exit process */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62 NULL, /* exit master */
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63 NGX_MODULE_V1_PADDING
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 };
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 static char *
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 ngx_http_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69 {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
70 ssize_t size;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
71 ngx_str_t *value;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
72 ngx_http_upstream_srv_conf_t *uscf;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
73 ngx_http_upstream_main_conf_t *umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
76 umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 value = cf->args->elts;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 if (!value[1].len) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82 "invalid zone name \"%V\"", &value[1]);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83 return NGX_CONF_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
85
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
86 if (cf->args->nelts == 3) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
87 size = ngx_parse_size(&value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
88
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
89 if (size == NGX_ERROR) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
90 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
91 "invalid zone size \"%V\"", &value[2]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
92 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
93 }
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
94
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
95 if (size < (ssize_t) (8 * ngx_pagesize)) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
96 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
97 "zone \"%V\" is too small", &value[1]);
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
98 return NGX_CONF_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
99 }
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
101 } else {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
102 size = 0;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105 uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size,
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 &ngx_http_upstream_module);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
107 if (uscf->shm_zone == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 return NGX_CONF_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
109 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
110
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
111 uscf->shm_zone->init = ngx_http_upstream_init_zone;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
112 uscf->shm_zone->data = umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 uscf->shm_zone->noreuse = 1;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116 return NGX_CONF_OK;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 static ngx_int_t
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121 ngx_http_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data)
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
122 {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
123 size_t len;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
124 ngx_uint_t i;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
125 ngx_slab_pool_t *shpool;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
126 ngx_http_upstream_rr_peers_t *peers, **peersp;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
127 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
128 ngx_http_upstream_main_conf_t *umcf;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
129
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
130 shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
131 umcf = shm_zone->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
132 uscfp = umcf->upstreams.elts;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
133
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
134 if (shm_zone->shm.exists) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
135 peers = shpool->data;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
136
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
137 for (i = 0; i < umcf->upstreams.nelts; i++) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
138 uscf = uscfp[i];
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
139
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
140 if (uscf->shm_zone != shm_zone) {
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
141 continue;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
142 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
143
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
144 uscf->peer.data = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
145 peers = peers->zone_next;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
146 }
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
147
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
148 return NGX_OK;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151 len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 shpool->log_ctx = ngx_slab_alloc(shpool, len);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154 if (shpool->log_ctx == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155 return NGX_ERROR;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
158 ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z",
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
159 &shm_zone->shm.name);
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
160
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
161
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
162 /* copy peers to shared memory */
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
163
6214
341e4303d25b Fixed strict aliasing warnings with old GCC versions.
Ruslan Ermilov <ru@nginx.com>
parents: 6198
diff changeset
164 peersp = (ngx_http_upstream_rr_peers_t **) (void *) &shpool->data;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
165
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
166 for (i = 0; i < umcf->upstreams.nelts; i++) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
167 uscf = uscfp[i];
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
168
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
169 if (uscf->shm_zone != shm_zone) {
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
170 continue;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
171 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
172
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
173 peers = ngx_http_upstream_zone_copy_peers(shpool, uscf);
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
174 if (peers == NULL) {
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
175 return NGX_ERROR;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
176 }
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
177
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
178 *peersp = peers;
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
179 peersp = &peers->zone_next;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
180 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
181
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
182 return NGX_OK;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
183 }
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
184
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
185
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
186 static ngx_http_upstream_rr_peers_t *
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
187 ngx_http_upstream_zone_copy_peers(ngx_slab_pool_t *shpool,
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
188 ngx_http_upstream_srv_conf_t *uscf)
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
189 {
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
190 ngx_str_t *name;
6123
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
191 ngx_http_upstream_rr_peer_t *peer, **peerp;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
192 ngx_http_upstream_rr_peers_t *peers, *backup;
caa103acf180 Upstream: allow multiple upstreams to use the same shared zone.
Ruslan Ermilov <ru@nginx.com>
parents: 6103
diff changeset
193
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194 peers = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
195 if (peers == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
196 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
197 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
198
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
199 ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
200
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
201 name = ngx_slab_alloc(shpool, sizeof(ngx_str_t));
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
202 if (name == NULL) {
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
203 return NULL;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
204 }
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
205
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
206 name->data = ngx_slab_alloc(shpool, peers->name->len);
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
207 if (name->data == NULL) {
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
208 return NULL;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
209 }
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
210
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
211 ngx_memcpy(name->data, peers->name->data, peers->name->len);
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
212 name->len = peers->name->len;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
213
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
214 peers->name = name;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
215
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216 peers->shpool = shpool;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
217
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 for (peerp = &peers->peer; *peerp; peerp = &peer->next) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
219 /* pool is unlocked */
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
220 peer = ngx_http_upstream_zone_copy_peer(peers, *peerp);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
222 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225 *peerp = peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228 if (peers->next == NULL) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229 goto done;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
231
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 backup = ngx_slab_alloc(shpool, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233 if (backup == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
234 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
235 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
236
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
237 ngx_memcpy(backup, peers->next, sizeof(ngx_http_upstream_rr_peers_t));
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
238
7078
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
239 backup->name = name;
1eb753aa8e5e Upstream zone: store peers->name and its data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 6214
diff changeset
240
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241 backup->shpool = shpool;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
242
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243 for (peerp = &backup->peer; *peerp; peerp = &peer->next) {
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
244 /* pool is unlocked */
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
245 peer = ngx_http_upstream_zone_copy_peer(backup, *peerp);
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246 if (peer == NULL) {
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
247 return NULL;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
248 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
249
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
250 *peerp = peer;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
251 }
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
252
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
253 peers->next = backup;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
254
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
255 done:
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
256
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
257 uscf->peer.data = peers;
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
258
6198
311d232ad803 Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents: 6123
diff changeset
259 return peers;
6103
79ddb0bdb273 Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
260 }
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
261
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
262
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
263 static ngx_http_upstream_rr_peer_t *
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
264 ngx_http_upstream_zone_copy_peer(ngx_http_upstream_rr_peers_t *peers,
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
265 ngx_http_upstream_rr_peer_t *src)
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
266 {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
267 ngx_slab_pool_t *pool;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
268 ngx_http_upstream_rr_peer_t *dst;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
269
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
270 pool = peers->shpool;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
271
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
272 dst = ngx_slab_calloc_locked(pool, sizeof(ngx_http_upstream_rr_peer_t));
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
273 if (dst == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
274 return NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
275 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
276
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
277 if (src) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
278 ngx_memcpy(dst, src, sizeof(ngx_http_upstream_rr_peer_t));
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
279 dst->sockaddr = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
280 dst->name.data = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
281 dst->server.data = NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
282 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
283
7110
3b1b81e248bc Do not use the obsolete NGX_SOCKADDRLEN macro.
Ruslan Ermilov <ru@nginx.com>
parents: 7080
diff changeset
284 dst->sockaddr = ngx_slab_calloc_locked(pool, sizeof(ngx_sockaddr_t));
7080
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
285 if (dst->sockaddr == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
286 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
287 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
288
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
289 dst->name.data = ngx_slab_calloc_locked(pool, NGX_SOCKADDR_STRLEN);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
290 if (dst->name.data == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
291 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
292 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
293
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
294 if (src) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
295 ngx_memcpy(dst->sockaddr, src->sockaddr, src->socklen);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
296 ngx_memcpy(dst->name.data, src->name.data, src->name.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
297
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
298 dst->server.data = ngx_slab_alloc_locked(pool, src->server.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
299 if (dst->server.data == NULL) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
300 goto failed;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
301 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
302
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
303 ngx_memcpy(dst->server.data, src->server.data, src->server.len);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
304 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
305
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
306 return dst;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
307
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
308 failed:
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
309
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
310 if (dst->server.data) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
311 ngx_slab_free_locked(pool, dst->server.data);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
312 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
313
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
314 if (dst->name.data) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
315 ngx_slab_free_locked(pool, dst->name.data);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
316 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
317
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
318 if (dst->sockaddr) {
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
319 ngx_slab_free_locked(pool, dst->sockaddr);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
320 }
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
321
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
322 ngx_slab_free_locked(pool, dst);
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
323
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
324 return NULL;
ac120e797d28 Upstream: copy peer data in shared memory.
Ruslan Ermilov <ru@nginx.com>
parents: 7078
diff changeset
325 }