]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/net/pf_ruleset.c
xnu-3789.51.2.tar.gz
[apple/xnu.git] / bsd / net / pf_ruleset.c
index 2ac10962e62291776241c35f25a5817cbb93bb25..f03f3297f852fa8e8d1a308191d206d3d780e3d9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  *
@@ -32,6 +32,7 @@
 /*
  * Copyright (c) 2001 Daniel Hartmeier
  * Copyright (c) 2002,2003 Henning Brauer
+ * NAT64 - Copyright (c) 2010 Viagenie Inc. (http://www.viagenie.ca)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -151,26 +152,27 @@ pf_get_ruleset_number(u_int8_t action)
        case PF_SCRUB:
        case PF_NOSCRUB:
                return (PF_RULESET_SCRUB);
-               break;
        case PF_PASS:
        case PF_DROP:
                return (PF_RULESET_FILTER);
-               break;
        case PF_NAT:
        case PF_NONAT:
                return (PF_RULESET_NAT);
-               break;
        case PF_BINAT:
        case PF_NOBINAT:
                return (PF_RULESET_BINAT);
-               break;
        case PF_RDR:
        case PF_NORDR:
+       case PF_NAT64:
+       case PF_NONAT64:
                return (PF_RULESET_RDR);
-               break;
+#if DUMMYNET
+       case PF_DUMMYNET:
+       case PF_NODUMMYNET:
+               return (PF_RULESET_DUMMYNET);
+#endif /* DUMMYNET */
        default:
                return (PF_RULESET_MAX);
-               break;
        }
 }
 
@@ -217,6 +219,29 @@ pf_find_ruleset(const char *path)
                return (&anchor->ruleset);
 }
 
+struct pf_ruleset *
+pf_find_ruleset_with_owner(const char *path, const char *owner, int is_anchor,
+    int *error)
+{
+       struct pf_anchor        *anchor;
+
+       while (*path == '/')
+               path++;
+       if (!*path)
+               return (&pf_main_ruleset);
+       anchor = pf_find_anchor(path);
+       if (anchor == NULL) {
+               *error = EINVAL;
+               return (NULL);
+       } else {
+               if ((owner && (!strcmp(owner, anchor->owner)))
+                   || (is_anchor && !strcmp(anchor->owner, "")))
+                       return (&anchor->ruleset);
+               *error = EPERM;
+               return NULL;
+       }
+}
+
 struct pf_ruleset *
 pf_find_or_create_ruleset(const char *path)
 {