28
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9 #include <ngx_event.h>
|
|
10 #include <ngx_event_connect.h>
|
|
11
|
|
12
|
|
13 /* Solaris has predefined "#define sun 1" */
|
|
14 #undef sun
|
|
15
|
|
16
|
|
17 ngx_peers_t *ngx_unix_upstream_parse(ngx_conf_t *cf,
|
|
18 ngx_unix_domain_upstream_t *u)
|
|
19 {
|
|
20 size_t len;
|
|
21 ngx_uint_t i;
|
|
22 ngx_peers_t *peers;
|
|
23 struct sockaddr_un *sun;
|
|
24
|
|
25 len = u->url.len - 5;
|
|
26
|
|
27 if (u->uri_part) {
|
|
28 for (i = 5; i < u->url.len; i++) {
|
|
29 if (u->url.data[i] == ':') {
|
|
30 len = i - 5;
|
|
31 u->uri.len = u->url.len - 5 - len - 1;
|
|
32 u->uri.data = u->url.data + 5 + len + 1;
|
|
33
|
|
34 break;
|
|
35 }
|
|
36 }
|
|
37
|
|
38 if (u->uri.len == 0) {
|
|
39 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
|
40 "the unix domain upstream \"%V\" has no URI",
|
|
41 &u->name);
|
|
42 return NULL;
|
|
43 }
|
|
44 }
|
|
45
|
|
46 if (len == 0) {
|
|
47 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
|
48 "the unix domain socket \"%V\" has no path",
|
|
49 &u->name);
|
|
50 return NULL;
|
|
51 }
|
|
52
|
|
53 if (len + 1 > sizeof(sun->sun_path)) {
|
|
54 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
|
55 "the unix domain socket path \"%V\" is too long",
|
|
56 &u->name);
|
|
57 return NULL;
|
|
58 }
|
|
59
|
|
60 /* MP: ngx_shared_palloc() */
|
|
61
|
|
62 if (!(peers = ngx_pcalloc(cf->pool, sizeof(ngx_peers_t)))) {
|
|
63 return NULL;
|
|
64 }
|
|
65
|
|
66 if (!(sun = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_un)))) {
|
|
67 return NULL;
|
|
68 }
|
|
69
|
|
70 peers->number = 1;
|
|
71
|
|
72 sun->sun_family = AF_UNIX;
|
|
73 ngx_cpystrn((u_char *) sun->sun_path, u->url.data + 5, len + 1);
|
|
74
|
|
75 peers->peer[0].sockaddr = (struct sockaddr *) sun;
|
|
76 peers->peer[0].socklen = sizeof(struct sockaddr_un);
|
|
77
|
|
78 peers->peer[0].name.len = 5 + len;
|
|
79 peers->peer[0].name.data = u->url.data;
|
|
80
|
|
81 peers->peer[0].uri_separator = ":";
|
|
82
|
|
83 return peers;
|
|
84 }
|