The pfctl(8) man page says:

    By default, recursive inline printing of anchors applies only to
    unnamed anchors specified inline in the ruleset.  If the anchor
    name is terminated with a `*' character, the -s flag will
    recursively print all anchors in a brace delimited block.  For
    example the following will print the ``authpf'' ruleset
    recursively:

    # pfctl -a 'authpf/*' -sr

However, that pfctl command will not show any output, whether for
'authpf/*' or any other 'foo/*' anchor, even if they are populated.

I tested this by setting up authpf and logged in as two users (bula and
charlie) so that my 'authpf/*' anchor is populated.  My live PF
ruleset looks like this:

# pfctl -a '*' -sr               
pass all flags S/SA
anchor "authpf/*" all {
  anchor "bula(1874)" all {
    pass in on em0 inet proto tcp from 172.16.0.15 to any port = 9876 flags S/SA
  }
  anchor "charlie(5749)" all {
    pass in quick on em0 inet proto tcp from 172.16.0.22 to any port = 5678 
flags S/SA
  }
}

When I try to print just the 'authpf/*' anchor per the man page, pfctl
does not show any output:

# pfctl -a 'authpf/*' -sr
#

The diff below fixes pfctl so that it will show the 'authpf/*' anchor
as intended:

# pfctl -a 'authpf/*' -sr        
anchor "bula(1874)" all {
  pass in on em0 inet proto tcp from 172.16.0.15 to any port = 9876 flags S/SA
}
anchor "charlie(5749)" all {
  pass in quick on em0 inet proto tcp from 172.16.0.22 to any port = 5678 flags 
S/SA
}

Note that since this diff changes the behavior of
"pfctl -a 'foo/*' -sr", it will also change the pfload* regression
tests since those tests execute this command:
pfctl -o none -a 'regress/*' -gvvsr

If this diff is correct, I would appreciate some guidance from the
developers on how to address the pfload* regression tests.

Comments are welcome.

Thank you,
Lawrence


Index: pfctl.c
===================================================================
RCS file: /cvs/src/sbin/pfctl/pfctl.c,v
retrieving revision 1.310
diff -u -p -r1.310 pfctl.c
--- pfctl.c     18 Apr 2012 14:42:17 -0000      1.310
+++ pfctl.c     26 Apr 2012 03:50:02 -0000
@@ -1937,6 +1937,7 @@ main(int argc, char *argv[])
        int      optimize = PF_OPTIMIZE_BASIC;
        int      level;
        char     anchorname[MAXPATHLEN];
+       int      anchor_wildcard = 0;
        char    *path;
        char    *lfile = NULL, *sfile = NULL;
        const char *errstr;
@@ -2097,9 +2098,10 @@ main(int argc, char *argv[])
                int len = strlen(anchoropt);
 
                if (anchoropt[len - 1] == '*') {
-                       if (len >= 2 && anchoropt[len - 2] == '/')
+                       if (len >= 2 && anchoropt[len - 2] == '/') {
                                anchoropt[len - 2] = '\0';
-                       else
+                               anchor_wildcard = 1;
+                       } else
                                anchoropt[len - 1] = '\0';
                        opts |= PF_OPT_RECURSE;
                }
@@ -2136,7 +2138,7 @@ main(int argc, char *argv[])
                case 'r':
                        pfctl_load_fingerprints(dev, opts);
                        pfctl_show_rules(dev, path, opts, PFCTL_SHOW_RULES,
-                           anchorname, 0, 0, shownr);
+                           anchorname, 0, anchor_wildcard, shownr);
                        break;
                case 'l':
                        pfctl_load_fingerprints(dev, opts);

Reply via email to