- struct access_info *ai, *tmp;
- list_for_each_entry_safe(ai, tmp, &access_perm_list, node) {
- unsigned mask = ((~0U) >> ai->netmask);
- if ((hc->addr.sin_addr.s_addr & mask) == (ai->addr.s_addr & mask))
- return 1;
+ struct sockaddr_storage ss;
+ socklen_t sslen = sizeof(ss);
+
+ if (getpeername(hc->fd, (struct sockaddr *)&ss, &sslen) < 0) {
+ PARA_ERROR_LOG("can not determine address family: %s\n", strerror(errno));
+ } else if (ss.ss_family == AF_INET) {
+ /* FIXME: access restriction is (currently) only supported for IPv4 */
+ struct access_info *ai, *tmp;
+ struct in_addr client_addr = ((struct sockaddr_in *)&ss)->sin_addr;
+
+ list_for_each_entry_safe(ai, tmp, &access_perm_list, node) {
+ unsigned mask = ((~0U) >> ai->netmask);
+ if ((client_addr.s_addr & mask) == (ai->addr.s_addr & mask))
+ return 1;
+ }