void bridge_rulefile(const char *fname, int d) { FILE *f; char *str, *argv[MAXRULEWORDS], buf[1024]; int ln = 0, argc = 0; f = fopen(fname, "r"); if (f == NULL) err(1, "%s", fname); while (fgets(buf, sizeof(buf), f) != NULL) { ln++; if (buf[0] == '#' || buf[0] == '\n') continue; argc = 0; str = strtok(buf, "\n\t\r "); while (str != NULL && argc < MAXRULEWORDS) { argv[argc++] = str; str = strtok(NULL, "\n\t\r "); } /* Rule is too long if there's more. */ if (str != NULL) { warnx("invalid rule: %d: %s ...", ln, buf); continue; } bridge_rule(argc, argv, ln); } fclose(f); }
int brrule(char *ifname, int ifs, int argc, char **argv) { if (NO_ARG(argv[0])) { printf("%% all rules for a member must be applied in order\n"); printf("%% use flush bridge-rules <bridge> <member>\n"); printf("%% to erase all rules on interface <member>\n"); return(0); } argv++; argc--; if (argc == 0) { printf("%% rule {block | pass} {in | out | in/out} on <member> [{src} mac] [{dst} mac]\n"); return(0); } bridge_rule(ifs, ifname, argc, argv, -1); return(0); }