Ignore:
Timestamp:
Jan 1, 2007, 7:56:13 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Switch to REG_EXTENDED.
  • Implement -c (--cmdline).
  • Updated documentation accordingly.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/zzuf.c

    r1528 r1529  
    4141
    4242static void spawn_child(char **);
     43static char *merge_regex(char *, char *);
     44static char *merge_file(char *, char *);
    4345static void set_ld_preload(char const *);
    4446static void version(void);
     
    8183int main(int argc, char *argv[])
    8284{
    83     regex_t optre;
    8485    char **newargv;
    85     char *parser;
    86     int i, j, quiet = 0, maxbytes = -1;
     86    char *parser, *include = NULL, *exclude = NULL;
     87    int i, j, quiet = 0, maxbytes = -1, cmdline = 0;
    8788    double maxtime = -1.0;
    8889
     
    9899            { "include",   1, NULL, 'I' },
    99100            { "exclude",   1, NULL, 'E' },
     101            { "cmdline",   0, NULL, 'c' },
    100102            { "stdin",     0, NULL, 'i' },
    101103            { "seed",      1, NULL, 's' },
     
    109111            { "version",   0, NULL, 'v' },
    110112        };
    111         int c = getopt_long(argc, argv, "I:E:is:r:F:B:T:qdhv",
     113        int c = getopt_long(argc, argv, "I:E:cis:r:F:B:T:qdhv",
    112114                            long_options, &option_index);
    113115#   else
    114116#       define MOREINFO "Try `%s -h' for more information.\n"
    115         int c = getopt(argc, argv, "I:E:is:r:F:B:T:qdhv");
     117        int c = getopt(argc, argv, "I:E:cis:r:F:B:T:qdhv");
    116118#   endif
    117119        if(c == -1)
     
    121123        {
    122124        case 'I': /* --include */
    123             if(regcomp(&optre, optarg, 0) != 0)
     125            include = merge_regex(include, optarg);
     126            if(!include)
    124127            {
    125128                printf("%s: invalid regex -- `%s'\n", argv[0], optarg);
    126129                return EXIT_FAILURE;
    127130            }
    128             regfree(&optre);
    129             setenv("ZZUF_INCLUDE", optarg, 1);
    130131            break;
    131132        case 'E': /* --exclude */
    132             if(regcomp(&optre, optarg, 0) != 0)
     133            exclude = merge_regex(exclude, optarg);
     134            if(!exclude)
    133135            {
    134136                printf("%s: invalid regex -- `%s'\n", argv[0], optarg);
    135137                return EXIT_FAILURE;
    136138            }
    137             regfree(&optre);
    138             setenv("ZZUF_EXCLUDE", optarg, 1);
     139            break;
     140        case 'c': /* --cmdline */
     141            cmdline = 1;
    139142            break;
    140143        case 'i': /* --stdin */
     
    188191    }
    189192
     193    if(cmdline)
     194    {
     195        int dashdash = 0;
     196
     197        for(i = optind + 1; i < argc; i++)
     198        {
     199            if(dashdash)
     200                include = merge_file(include, argv[i]);
     201            else if(!strcmp("--", argv[i]))
     202                dashdash = 1;
     203            else if(argv[i][0] != '-')
     204                include = merge_file(include, argv[i]);
     205        }
     206    }
     207
     208    if(include)
     209        setenv("ZZUF_INCLUDE", include, 1);
     210    if(exclude)
     211        setenv("ZZUF_EXCLUDE", exclude, 1);
     212
    190213    /* Allocate memory for children handling */
    191214    child_list = malloc(parallel * sizeof(struct child_list));
     
    347370
    348371    return EXIT_SUCCESS;   
     372}
     373
     374static char *merge_file(char *regex, char *file)
     375{
     376    char *newfile = malloc(1 + 2 * strlen(file) + 1 + 1), *tmp = newfile;
     377
     378    *tmp++ = '^';
     379    while(*file)
     380    {
     381        if(strchr("^.[$()|*+?{\\", *file))
     382            *tmp++ = '\\';
     383        *tmp++ = *file++;
     384    }
     385    *tmp++ = '$';
     386    *tmp++ = '\0';
     387
     388    tmp = merge_regex(regex, newfile);
     389    free(newfile);
     390    return tmp;
     391}
     392
     393static char *merge_regex(char *regex, char *string)
     394{
     395    regex_t optre;
     396
     397    if(regex)
     398    {
     399        regex = realloc(regex, strlen(regex) + strlen(string) + 1 + 1);
     400        sprintf(regex + strlen(regex) - 1, "|%s)", string);
     401    }
     402    else
     403    {
     404        regex = malloc(1 + strlen(string) + 1 + 1);
     405        sprintf(regex, "(%s)", string);
     406    }
     407
     408    if(regcomp(&optre, regex, REG_EXTENDED) != 0)
     409    {
     410        free(regex);
     411        return NULL;
     412    }
     413    regfree(&optre);
     414
     415    return regex;
    349416}
    350417
     
    443510static void usage(void)
    444511{
    445     printf("Usage: zzuf [ -vqdhi ] [ -r ratio ] [ -s seed | -s start:stop]\n");
    446     printf("                       [ -F children ] [ -B bytes ] [ -T seconds ]\n");
    447     printf("                       [ -I include ] [ -E exclude ] COMMAND [ARGS]...\n");
     512    printf("Usage: zzuf [ -vqdhic ] [ -r ratio ] [ -s seed | -s start:stop ]\n");
     513    printf("                        [ -F children ] [ -B bytes ] [ -T seconds ]\n");
     514    printf("                        [ -I include ] [ -E exclude ] COMMAND [ARGS]...\n");
    448515    printf("Run COMMAND and randomly fuzz its input.\n");
    449516    printf("\n");
     
    459526    printf("  -i, --stdin              fuzz standard input\n");
    460527    printf("  -I, --include <regex>    only fuzz files matching <regex>\n");
     528    printf("  -c, --cmdline            only fuzz files specified in the command line\n");
    461529    printf("  -E, --exclude <regex>    do not fuzz files matching <regex>\n");
    462530    printf("  -d, --debug              print debug messages\n");
     
    473541    printf("  -i               fuzz standard input\n");
    474542    printf("  -I <regex>       only fuzz files matching <regex>\n");
     543    printf("  -c               only fuzz files specified in the command line\n");
    475544    printf("  -E <regex>       do not fuzz files matching <regex>\n");
    476545    printf("  -d               print debug messages\n");
Note: See TracChangeset for help on using the changeset viewer.