returns 0 on match */
| 4297 | #define satosin6(s) ((const struct sockaddr_in6 *)s) |
| 4298 | /* returns 0 on match */ |
| 4299 | int |
| 4300 | key_sockaddrcmp(const struct sockaddr *sa1, const struct sockaddr *sa2, |
| 4301 | int port) |
| 4302 | { |
| 4303 | if (sa1->sa_family != sa2->sa_family || sa1->sa_len != sa2->sa_len) |
| 4304 | return 1; |
| 4305 | |
| 4306 | switch (sa1->sa_family) { |
| 4307 | #ifdef INET |
| 4308 | case AF_INET: |
| 4309 | if (sa1->sa_len != sizeof(struct sockaddr_in)) |
| 4310 | return 1; |
| 4311 | if (satosin(sa1)->sin_addr.s_addr != |
| 4312 | satosin(sa2)->sin_addr.s_addr) { |
| 4313 | return 1; |
| 4314 | } |
| 4315 | if (port && satosin(sa1)->sin_port != satosin(sa2)->sin_port) |
| 4316 | return 1; |
| 4317 | break; |
| 4318 | #endif |
| 4319 | #ifdef INET6 |
| 4320 | case AF_INET6: |
| 4321 | if (sa1->sa_len != sizeof(struct sockaddr_in6)) |
| 4322 | return 1; /*EINVAL*/ |
| 4323 | if (satosin6(sa1)->sin6_scope_id != |
| 4324 | satosin6(sa2)->sin6_scope_id) { |
| 4325 | return 1; |
| 4326 | } |
| 4327 | if (!IN6_ARE_ADDR_EQUAL(&satosin6(sa1)->sin6_addr, |
| 4328 | &satosin6(sa2)->sin6_addr)) { |
| 4329 | return 1; |
| 4330 | } |
| 4331 | if (port && |
| 4332 | satosin6(sa1)->sin6_port != satosin6(sa2)->sin6_port) { |
| 4333 | return 1; |
| 4334 | } |
| 4335 | break; |
| 4336 | #endif |
| 4337 | default: |
| 4338 | if (bcmp(sa1, sa2, sa1->sa_len) != 0) |
| 4339 | return 1; |
| 4340 | break; |
| 4341 | } |
| 4342 | |
| 4343 | return 0; |
| 4344 | } |
| 4345 | |
| 4346 | /* returns 0 on match */ |
| 4347 | int |
no outgoing calls
no test coverage detected