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 }