Changeset 1659 for zzuf


Ignore:
Timestamp:
Jan 12, 2007, 7:01:27 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Refactored some shit around.
File:
1 edited

Legend:

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

    r1658 r1659  
    4545#include "timer.h"
    4646
    47 static void spawn_child(char **);
     47static void loop_stdin(void);
     48
     49static void spawn_children(void);
    4850static void clean_children(void);
    4951static void read_children(void);
     
    7678static int maxforks = 1, child_count = 0, maxcrashes = 1, crashes = 0;
    7779
     80static char **newargv;
     81static char *protect = NULL, *refuse = NULL;
    7882static int seed = 0;
    7983static int endseed = 1;
     
    8488static int maxmem = -1;
    8589static int64_t maxtime = -1;
     90static int64_t lastlaunch = 0;
    8691
    8792#define ZZUF_FD_SET(fd, p_fdset, maxfd) \
     
    98103int main(int argc, char *argv[])
    99104{
    100     char **newargv;
    101     char *parser, *include, *exclude, *protect, *refuse;
     105    char *parser, *include, *exclude;
    102106    int i, cmdline = 0;
    103107
    104     include = exclude = protect = refuse = NULL;
     108    include = exclude = NULL;
    105109
    106110#if defined(HAVE_GETOPT_H)
     
    239243    if(optind >= argc)
    240244    {
    241         uint8_t md5sum[16];
    242         struct md5 *ctx = NULL;
    243 
    244         if(md5)
    245             ctx = _zz_md5_init();
    246 
    247245        if(endseed != seed + 1)
    248246        {
     
    253251        }
    254252
    255         if(protect)
    256             _zz_protect(protect);
    257         if(refuse)
    258             _zz_refuse(refuse);
    259 
    260         _zz_fd_init();
    261         _zz_register(0);
    262 
    263         for(;;)
    264         {
    265             uint8_t buf[BUFSIZ];
    266             int ret, off = 0, nw = 0;
    267 
    268             ret = read(0, buf, BUFSIZ);
    269             if(ret <= 0)
    270                 break;
    271 
    272             _zz_fuzz(0, buf, ret);
    273             _zz_addpos(0, ret);
    274 
    275             if(md5)
    276                 _zz_md5_add(ctx, buf, ret);
    277             else while(ret)
    278             {
    279                 if((nw = write(1, buf + off, (size_t)ret)) < 0)
    280                     break;
    281                 ret -= nw;
    282                 off += nw;
    283             }
    284         }
    285 
    286         if(md5)
    287         {
    288             _zz_md5_fini(md5sum, ctx);
    289             fprintf(stdout, "zzuf[seed=%i]: %.02x%.02x%.02x%.02x%.02x%.02x"
    290                     "%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x\n",
    291                     seed, md5sum[0], md5sum[1], md5sum[2], md5sum[3],
    292                     md5sum[4], md5sum[5], md5sum[6], md5sum[7],
    293                     md5sum[8], md5sum[9], md5sum[10], md5sum[11],
    294                     md5sum[12], md5sum[13], md5sum[14], md5sum[15]);
    295             fflush(stdout);
    296         }
    297 
    298         _zz_unregister(0);
    299         _zz_fd_fini();
     253        loop_stdin();
    300254
    301255        return EXIT_SUCCESS;
    302256    }
    303257
     258    /* If asked to launch programs */
    304259    if(cmdline)
    305260    {
     
    343298    while(child_count || seed < endseed)
    344299    {
    345         /* Spawn one new child, if necessary */
    346         if(child_count < maxforks && seed < endseed &&
    347                              (maxcrashes && crashes < maxcrashes))
    348             spawn_child(newargv);
     300        /* Spawn new children, if necessary */
     301        spawn_children();
    349302
    350303        /* Cleanup dead or dying children */
     
    365318}
    366319
     320static void loop_stdin(void)
     321{
     322    uint8_t md5sum[16];
     323    struct md5 *ctx = NULL;
     324
     325    if(md5)
     326        ctx = _zz_md5_init();
     327
     328    if(protect)
     329        _zz_protect(protect);
     330    if(refuse)
     331        _zz_refuse(refuse);
     332
     333    _zz_fd_init();
     334    _zz_register(0);
     335
     336    for(;;)
     337    {
     338        uint8_t buf[BUFSIZ];
     339        int ret, off = 0, nw = 0;
     340
     341        ret = read(0, buf, BUFSIZ);
     342        if(ret <= 0)
     343            break;
     344
     345        _zz_fuzz(0, buf, ret);
     346        _zz_addpos(0, ret);
     347
     348        if(md5)
     349            _zz_md5_add(ctx, buf, ret);
     350        else while(ret)
     351        {
     352            if((nw = write(1, buf + off, (size_t)ret)) < 0)
     353                break;
     354            ret -= nw;
     355            off += nw;
     356        }
     357    }
     358
     359    if(md5)
     360    {
     361        _zz_md5_fini(md5sum, ctx);
     362        fprintf(stdout, "zzuf[seed=%i]: %.02x%.02x%.02x%.02x%.02x%.02x"
     363                "%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x%.02x\n",
     364                seed, md5sum[0], md5sum[1], md5sum[2], md5sum[3],
     365                md5sum[4], md5sum[5], md5sum[6], md5sum[7],
     366                md5sum[8], md5sum[9], md5sum[10], md5sum[11],
     367                md5sum[12], md5sum[13], md5sum[14], md5sum[15]);
     368        fflush(stdout);
     369    }
     370
     371    _zz_unregister(0);
     372    _zz_fd_fini();
     373}
     374
    367375static char *merge_file(char *regex, char *file)
    368376{
     
    409417}
    410418
    411 static void spawn_child(char **argv)
     419static void spawn_children(void)
    412420{
    413421    static int const files[] = { DEBUG_FILENO, STDERR_FILENO, STDOUT_FILENO };
     
    416424    pid_t pid;
    417425    int i, j;
     426
     427    if(child_count == maxforks)
     428        return; /* no slot */
     429
     430    if(seed == endseed)
     431        return; /* job finished */
     432
     433    if(maxcrashes && crashes >= maxcrashes)
     434        return; /* all jobs crashed */
    418435
    419436    /* Find the empty slot */
     
    459476
    460477            /* Run our process */
    461             if(execvp(argv[0], argv))
     478            if(execvp(newargv[0], newargv))
    462479            {
    463                 perror(argv[0]);
     480                perror(newargv[0]);
    464481                exit(EXIT_FAILURE);
    465482            }
     
    467484    }
    468485
     486    lastlaunch = _zz_time();
     487
    469488    /* We’re the parent, acknowledge spawn */
    470     child_list[i].date = _zz_time();
     489    child_list[i].date = lastlaunch;
    471490    child_list[i].pid = pid;
    472491    for(j = 0; j < 3; j++)
     
    480499    if(md5)
    481500        child_list[i].ctx = _zz_md5_init();
     501
    482502    child_count++;
    483503    seed++;
Note: See TracChangeset for help on using the changeset viewer.