void tests(void) { TEST_START("match_pattern"); ASSERT_INT_EQ(match_pattern("", ""), 1); ASSERT_INT_EQ(match_pattern("", "aaa"), 0); ASSERT_INT_EQ(match_pattern("aaa", ""), 0); ASSERT_INT_EQ(match_pattern("aaa", "aaaa"), 0); ASSERT_INT_EQ(match_pattern("aaaa", "aaa"), 0); TEST_DONE(); TEST_START("match_pattern wildcard"); ASSERT_INT_EQ(match_pattern("", "*"), 1); ASSERT_INT_EQ(match_pattern("a", "?"), 1); ASSERT_INT_EQ(match_pattern("aa", "a?"), 1); ASSERT_INT_EQ(match_pattern("a", "*"), 1); ASSERT_INT_EQ(match_pattern("aa", "a*"), 1); ASSERT_INT_EQ(match_pattern("aa", "?*"), 1); ASSERT_INT_EQ(match_pattern("aa", "**"), 1); ASSERT_INT_EQ(match_pattern("aa", "?a"), 1); ASSERT_INT_EQ(match_pattern("aa", "*a"), 1); ASSERT_INT_EQ(match_pattern("ba", "a?"), 0); ASSERT_INT_EQ(match_pattern("ba", "a*"), 0); ASSERT_INT_EQ(match_pattern("ab", "?a"), 0); ASSERT_INT_EQ(match_pattern("ab", "*a"), 0); TEST_DONE(); TEST_START("match_pattern_list"); ASSERT_INT_EQ(match_pattern_list("", "", 0), 0); /* no patterns */ ASSERT_INT_EQ(match_pattern_list("", "*", 0), 1); ASSERT_INT_EQ(match_pattern_list("", "!*", 0), -1); ASSERT_INT_EQ(match_pattern_list("", "!a,*", 0), 1); ASSERT_INT_EQ(match_pattern_list("", "*,!a", 0), 1); ASSERT_INT_EQ(match_pattern_list("", "a,!*", 0), -1); ASSERT_INT_EQ(match_pattern_list("", "!*,a", 0), -1); ASSERT_INT_EQ(match_pattern_list("a", "", 0), 0); ASSERT_INT_EQ(match_pattern_list("a", "*", 0), 1); ASSERT_INT_EQ(match_pattern_list("a", "!*", 0), -1); ASSERT_INT_EQ(match_pattern_list("a", "!a", 0), -1); /* XXX negated ASSERT_INT_EQ(match_pattern_list("a", "!b", 0), 1); */ ASSERT_INT_EQ(match_pattern_list("a", "!a,*", 0), -1); ASSERT_INT_EQ(match_pattern_list("b", "!a,*", 0), 1); ASSERT_INT_EQ(match_pattern_list("a", "*,!a", 0), -1); ASSERT_INT_EQ(match_pattern_list("b", "*,!a", 0), 1); ASSERT_INT_EQ(match_pattern_list("a", "a,!*", 0), -1); ASSERT_INT_EQ(match_pattern_list("b", "a,!*", 0), -1); ASSERT_INT_EQ(match_pattern_list("a", "a,!a", 0), -1); /* XXX negated ASSERT_INT_EQ(match_pattern_list("b", "a,!a", 0), 1); */ ASSERT_INT_EQ(match_pattern_list("a", "!*,a", 0), -1); ASSERT_INT_EQ(match_pattern_list("b", "!*,a", 0), -1); TEST_DONE(); TEST_START("match_pattern_list lowercase"); ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 0), 0); ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 0), 0); ASSERT_INT_EQ(match_pattern_list("abc", "ABC", 1), 1); ASSERT_INT_EQ(match_pattern_list("ABC", "abc", 1), 0); TEST_DONE(); TEST_START("addr_match_list"); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1/44"), -2); ASSERT_INT_EQ(addr_match_list(NULL, "127.0.0.1/44"), -2); ASSERT_INT_EQ(addr_match_list("a", "*"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "*"), 1); ASSERT_INT_EQ(addr_match_list(NULL, "*"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.1"), 1); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1"), -1); /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2"), 1); */ ASSERT_INT_EQ(addr_match_list("127.0.0.255", "127.0.0.0/24"), 1); ASSERT_INT_EQ(addr_match_list("127.0.1.1", "127.0.0.0/24"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.0/24"), 1); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.1.0/24"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.0/24"), -1); /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.1.0/24"), 1); */ ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.1"), -1); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.1,10.0.0.1"), -1); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,127.0.0.2"), 0); ASSERT_INT_EQ(addr_match_list("127.0.0.1", "127.0.0.2,10.0.0.1"), 0); /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "10.0.0.1,!127.0.0.2"), 1); */ /* XXX negated ASSERT_INT_EQ(addr_match_list("127.0.0.1", "!127.0.0.2,10.0.0.1"), 1); */ TEST_DONE(); #define CHECK_FILTER(string,filter,expected) \ do { \ char *result = match_filter_list((string), (filter)); \ ASSERT_STRING_EQ(result, expected); \ free(result); \ } while (0) TEST_START("match_filter_list"); CHECK_FILTER("a,b,c", "", "a,b,c"); CHECK_FILTER("a,b,c", "a", "b,c"); CHECK_FILTER("a,b,c", "b", "a,c"); CHECK_FILTER("a,b,c", "c", "a,b"); CHECK_FILTER("a,b,c", "a,b", "c"); CHECK_FILTER("a,b,c", "a,c", "b"); CHECK_FILTER("a,b,c", "b,c", "a"); CHECK_FILTER("a,b,c", "a,b,c", ""); CHECK_FILTER("a,b,c", "b,c", "a"); CHECK_FILTER("", "a,b,c", ""); TEST_DONE(); /* * XXX TODO * int match_host_and_ip(const char *, const char *, const char *); * int match_user(const char *, const char *, const char *, const char *); * char *match_list(const char *, const char *, u_int *); * int addr_match_cidr_list(const char *, const char *); */ }
int Filter_numsI(int argc, char **argv) { char bufS[FILTBUF_SIZE+1], *cPC; int ok,nok,prev_ok,b_line,line,outline,pout,extra; FILTER *filtPO; filtPO = CreateFilterPO(); if(!ParseArgsI(argc, argv, "S -not B -stat B -rg D2 -gt D -lt D -col I -out S\ -seed I -ranf D -ranp D\ -rann I -sc I -flag B -icbn B\ -lrg I2 -wlis S -kc B -wst B -wsub B\ -pln B -A I -B I -qu B -vex B -all B -bof I -blk I\ -brg I2 -bnot B -blis S -maxout I -abs B -pfn B\ -pre S -suf S", filtPO->inname, &filtPO->do_not, &filtPO->do_stat, &filtPO->min,&filtPO->max, &filtPO->min, &filtPO->max, &filtPO->col, filtPO->outname, &filtPO->seed, &filtPO->ranf, &filtPO->ranp, &filtPO->rann, &filtPO->skipc, &filtPO->do_flag, &filtPO->do_icbn, &filtPO->firstl,&filtPO->lastl, filtPO->wlisname, &filtPO->do_kc, &filtPO->do_wst, &filtPO->do_wsub, &filtPO->do_pln, &filtPO->do_A, &filtPO->do_B, &filtPO->do_quiet, &filtPO->do_vex, &filtPO->do_all, &filtPO->l_bof, &filtPO->l_blk, &filtPO->firstb,&filtPO->lastb, &filtPO->do_bm_not, filtPO->blk_mlis, &filtPO->maxout, &filtPO->do_abs, &filtPO->do_pfn, filtPO->do_pre, filtPO->do_suf, (int *)NULL)) { Filter_numsUse(); CHECK_FILTER(filtPO); return(FALSE); } /*** * Check options and set things up */ if(!OpenFilterFilesI(filtPO)) { CHECK_FILTER(filtPO); return(FALSE); } if(!CheckFilterOptionsI(filtPO)) { CHECK_FILTER(filtPO); return(FALSE); } /*** * Process lines */ line = outline = nok = extra = pout = 0; prev_ok = TRUE; while(fgets(bufS,FILTBUF_SIZE,filtPO->in) != NULL) { if( SkipThisLineI(filtPO, bufS) ) { continue; } line++; /*** * If start-of-block, calc and save flag */ b_line = LineInFiltBlockI(filtPO, line); if( b_line == 1 ) { cPC = GetLineStartPC(filtPO, bufS); ok = IsFiltLineOkI(filtPO, line, cPC, TRUE); prev_ok = ok; } /* Before blocks start */ else if ( b_line < 1 ) { ok = FALSE; } /* In block, but not start; Use previous value, and possibly mask if ok */ else { ok = prev_ok; if(ok) { ok = LineInBlockOkI(filtPO, b_line); } } /* Count ok, and set for any -After extra */ if(ok) { nok++; if(filtPO->do_A > 0) { extra = filtPO->do_A + 1; } } /* Not only stats = per-line output */ if( !filtPO->do_stat) { pout = FALSE; if( (filtPO->do_flag) || (ok) || (extra>0) ) { pout++; outline++; } /* If maxout is set, unset print flag if too many lines */ if( (filtPO->maxout > 0) && (outline > filtPO->maxout) ) { pout = FALSE; } if(pout) { /*** * Any line prefixes? */ if(!NO_S(filtPO->do_pre)) { fprintf(filtPO->out,"%s\t",filtPO->do_pre); } if(filtPO->do_pfn) { fprintf(filtPO->out,"%s\t",filtPO->inname); } if(filtPO->do_pln) { fprintf(filtPO->out,"%d\t",line); } if(filtPO->do_flag) { fprintf(filtPO->out,"%d\t",ok); } /*** * Suffix? Need to strip newline first, else just dump */ if(!NO_S(filtPO->do_suf)) { Chomp(bufS); fprintf(filtPO->out,"%s\t%s\n",bufS, filtPO->do_suf); } else { fputs(bufS,filtPO->out); } } } extra--; } ReportFilterStats(filtPO, line, nok); CHECK_FILTER(filtPO); return(TRUE); }