-/* $OpenBSD: addrmatch.c,v 1.2 2008/06/10 05:22:45 djm Exp $ */
+/* $OpenBSD: addrmatch.c,v 1.4 2008/12/10 03:55:20 stevesk Exp $ */
/*
* Copyright (c) 2004-2008 Damien Miller <djm@mindrot.org>
#include "match.h"
#include "log.h"
+#include "xmalloc.h"
struct xaddr {
sa_family_t af;
return -1;
xa->af = AF_INET6;
memcpy(&xa->v6, &in6->sin6_addr, sizeof(xa->v6));
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
xa->scope_id = in6->sin6_scope_id;
+#endif
break;
default:
return -1;
*
* Returns 1 on match found (never returned when addr == NULL).
* Returns 0 on if no match found, or no errors found when addr == NULL.
- * Returns -1 on invalid list entry.
+ * Returns -1 on negated match found (never returned when addr == NULL).
+ * Returns -2 on invalid list entry.
*/
int
addr_match_list(const char *addr, const char *_list)
if (neg)
cp++;
if (*cp == '\0') {
- ret = -1;
+ ret = -2;
break;
}
/* Prefer CIDR address matching */
if (r == -2) {
error("Inconsistent mask length for "
"network \"%.100s\"", cp);
- ret = -1;
+ ret = -2;
break;
} else if (r == 0) {
if (addr != NULL && addr_netmatch(&try_addr,
&match_addr, masklen) == 0) {
foundit:
if (neg) {
- ret = 0;
+ ret = -1;
break;
}
ret = 1;
goto foundit;
}
}
- free(o);
+ xfree(o);
return ret;
}