Mercurial > hg > nginx
comparison src/core/ngx_inet.c @ 5473:d39ef821d03e
Core: externalized ngx_cmp_sockaddr().
It's also extended with the "cmp_port" argument to indicate
whether ports should be compared as well, or only addresses.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 06 Dec 2013 14:30:27 +0400 |
parents | 0300d97c6084 |
children | 550212836c8f |
comparison
equal
deleted
inserted
replaced
5472:ab493c60d9ff | 5473:d39ef821d03e |
---|---|
1194 | 1194 |
1195 return NGX_OK; | 1195 return NGX_OK; |
1196 } | 1196 } |
1197 | 1197 |
1198 #endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */ | 1198 #endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */ |
1199 | |
1200 | |
1201 ngx_int_t | |
1202 ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1, | |
1203 struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port) | |
1204 { | |
1205 struct sockaddr_in *sin1, *sin2; | |
1206 #if (NGX_HAVE_INET6) | |
1207 struct sockaddr_in6 *sin61, *sin62; | |
1208 #endif | |
1209 #if (NGX_HAVE_UNIX_DOMAIN) | |
1210 struct sockaddr_un *saun1, *saun2; | |
1211 #endif | |
1212 | |
1213 if (sa1->sa_family != sa2->sa_family) { | |
1214 return NGX_DECLINED; | |
1215 } | |
1216 | |
1217 switch (sa1->sa_family) { | |
1218 | |
1219 #if (NGX_HAVE_INET6) | |
1220 case AF_INET6: | |
1221 | |
1222 sin61 = (struct sockaddr_in6 *) sa1; | |
1223 sin62 = (struct sockaddr_in6 *) sa2; | |
1224 | |
1225 if (cmp_port && sin61->sin6_port != sin62->sin6_port) { | |
1226 return NGX_DECLINED; | |
1227 } | |
1228 | |
1229 if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) { | |
1230 return NGX_DECLINED; | |
1231 } | |
1232 | |
1233 break; | |
1234 #endif | |
1235 | |
1236 #if (NGX_HAVE_UNIX_DOMAIN) | |
1237 case AF_UNIX: | |
1238 | |
1239 /* TODO length */ | |
1240 | |
1241 saun1 = (struct sockaddr_un *) sa1; | |
1242 saun2 = (struct sockaddr_un *) sa2; | |
1243 | |
1244 if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path, | |
1245 sizeof(saun1->sun_path)) | |
1246 != 0) | |
1247 { | |
1248 return NGX_DECLINED; | |
1249 } | |
1250 | |
1251 break; | |
1252 #endif | |
1253 | |
1254 default: /* AF_INET */ | |
1255 | |
1256 sin1 = (struct sockaddr_in *) sa1; | |
1257 sin2 = (struct sockaddr_in *) sa2; | |
1258 | |
1259 if (cmp_port && sin1->sin_port != sin2->sin_port) { | |
1260 return NGX_DECLINED; | |
1261 } | |
1262 | |
1263 if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) { | |
1264 return NGX_DECLINED; | |
1265 } | |
1266 | |
1267 break; | |
1268 } | |
1269 | |
1270 return NGX_OK; | |
1271 } |