Exemple #1
0
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 *);
 */
}
Exemple #2
0
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);
}