Mercurial > hg > nginx
comparison src/core/ngx_inet.c @ 5263:05ba5bce31e0
Core: extended ngx_sock_ntop() with socklen parameter.
On Linux, sockaddr length is required to process unix socket addresses properly
due to unnamed sockets (which don't have sun_path set at all) and abstract
namespace sockets.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Thu, 11 Jul 2013 16:07:25 +0400 |
parents | c9059bd5445b |
children | ec8594b9bf11 |
comparison
equal
deleted
inserted
replaced
5262:626f288fa5ed | 5263:05ba5bce31e0 |
---|---|
172 | 172 |
173 #endif | 173 #endif |
174 | 174 |
175 | 175 |
176 size_t | 176 size_t |
177 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port) | 177 ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len, |
178 ngx_uint_t port) | |
178 { | 179 { |
179 u_char *p; | 180 u_char *p; |
180 struct sockaddr_in *sin; | 181 struct sockaddr_in *sin; |
181 #if (NGX_HAVE_INET6) | 182 #if (NGX_HAVE_INET6) |
182 size_t n; | 183 size_t n; |
228 #if (NGX_HAVE_UNIX_DOMAIN) | 229 #if (NGX_HAVE_UNIX_DOMAIN) |
229 | 230 |
230 case AF_UNIX: | 231 case AF_UNIX: |
231 saun = (struct sockaddr_un *) sa; | 232 saun = (struct sockaddr_un *) sa; |
232 | 233 |
234 /* on Linux sockaddr might not include sun_path at all */ | |
235 | |
236 if (socklen <= offsetof(struct sockaddr_un, sun_path)) { | |
237 p = ngx_snprintf(text, len, "unix:%Z"); | |
238 | |
239 } else { | |
240 p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path); | |
241 } | |
242 | |
233 /* we do not include trailing zero in address length */ | 243 /* we do not include trailing zero in address length */ |
234 | 244 |
235 return ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path) - text - 1; | 245 return (p - text - 1); |
236 | 246 |
237 #endif | 247 #endif |
238 | 248 |
239 default: | 249 default: |
240 return 0; | 250 return 0; |
1018 p = ngx_pnalloc(pool, len); | 1028 p = ngx_pnalloc(pool, len); |
1019 if (p == NULL) { | 1029 if (p == NULL) { |
1020 goto failed; | 1030 goto failed; |
1021 } | 1031 } |
1022 | 1032 |
1023 len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1); | 1033 len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1); |
1024 | 1034 |
1025 u->addrs[i].name.len = len; | 1035 u->addrs[i].name.len = len; |
1026 u->addrs[i].name.data = p; | 1036 u->addrs[i].name.data = p; |
1027 | 1037 |
1028 i++; | 1038 i++; |
1051 p = ngx_pnalloc(pool, len); | 1061 p = ngx_pnalloc(pool, len); |
1052 if (p == NULL) { | 1062 if (p == NULL) { |
1053 goto failed; | 1063 goto failed; |
1054 } | 1064 } |
1055 | 1065 |
1056 len = ngx_sock_ntop((struct sockaddr *) sin6, p, len, 1); | 1066 len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p, |
1067 len, 1); | |
1057 | 1068 |
1058 u->addrs[i].name.len = len; | 1069 u->addrs[i].name.len = len; |
1059 u->addrs[i].name.data = p; | 1070 u->addrs[i].name.data = p; |
1060 | 1071 |
1061 i++; | 1072 i++; |
1136 p = ngx_pnalloc(pool, len); | 1147 p = ngx_pnalloc(pool, len); |
1137 if (p == NULL) { | 1148 if (p == NULL) { |
1138 return NGX_ERROR; | 1149 return NGX_ERROR; |
1139 } | 1150 } |
1140 | 1151 |
1141 len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1); | 1152 len = ngx_sock_ntop((struct sockaddr *) sin, |
1153 sizeof(struct sockaddr_in), p, len, 1); | |
1142 | 1154 |
1143 u->addrs[i].name.len = len; | 1155 u->addrs[i].name.len = len; |
1144 u->addrs[i].name.data = p; | 1156 u->addrs[i].name.data = p; |
1145 } | 1157 } |
1146 | 1158 |