Changeset 1535 for zzuf


Ignore:
Timestamp:
Jan 2, 2007, 2:13:05 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Use a separate file descriptor for debugging messages, so that the -q flag does not remove debug messages.
  • Slightly improved fd handling code.
Location:
zzuf/trunk/src
Files:
4 edited

Legend:

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

    r1534 r1535  
    3333
    3434#include "debug.h"
     35#include "libzzuf.h"
    3536
    3637extern int _zz_hasdebug;
     
    5455#endif
    5556    va_list args;
    56     int saved_errno, fd = 2;
     57    int saved_errno, fd = DEBUG_FILENO;
    5758
    5859    if(!_zz_hasdebug)
  • zzuf/trunk/src/libzzuf.h

    r1532 r1535  
    1717 */
    1818
     19/* We use file descriptor 17 as the debug channel */
     20#define DEBUG_FILENO 17
     21
    1922/* We arbitrarily split files into 1024-byte chunks. Each chunk has an
    2023 * associated seed that can be computed from the zzuf seed, the chunk
     
    3033
    3134/* Internal variables */
    32 extern int       _zz_ready;
    33 extern int       _zz_hasdebug;
    34 extern float     _zz_ratio;
    35 extern int       _zz_seed;
    36 extern int       _zz_signal;
     35extern int   _zz_ready;
     36extern int   _zz_hasdebug;
     37extern float _zz_ratio;
     38extern int   _zz_seed;
     39extern int   _zz_signal;
    3740
    3841/* Library initialisation shit */
  • zzuf/trunk/src/load-fd.c

    r1527 r1535  
    160160    if(!_zz_ready)
    161161        LOADSYM(close);
     162
     163    /* Hey, it’s our debug channel! Silently pretend we closed it. */
     164    if(fd == DEBUG_FILENO)
     165        return 0;
     166
    162167    ret = close_orig(fd);
    163168    if(!_zz_ready || !_zz_iswatched(fd))
  • zzuf/trunk/src/zzuf.c

    r1532 r1535  
    3939
    4040#include "random.h"
     41#include "libzzuf.h"
    4142
    4243static void spawn_child(char **);
     
    6162
    6263    pid_t pid;
    63     int outfd, errfd;
     64    int fd[3]; /* 0 is debug, 1 is stderr, 2 is stdout */
    6465    int bytes, seed;
    6566    time_t date;
     
    304305                        child_list[i].seed, WTERMSIG(status));
    305306
    306             if(child_list[i].outfd >= 0)
    307                 close(child_list[i].outfd);
    308 
    309             if(child_list[i].errfd >= 0)
    310                 close(child_list[i].errfd);
     307            for(j = 0; j < 3; j++)
     308                if(child_list[i].fd[j] >= 0)
     309                    close(child_list[i].fd[j]);
    311310
    312311            child_list[i].status = STATUS_FREE;
     
    321320                continue;
    322321
    323             ZZUF_FD_SET(child_list[i].outfd, &fdset, maxfd);
    324             ZZUF_FD_SET(child_list[i].errfd, &fdset, maxfd);
     322            for(j = 0; j < 3; j++)
     323                ZZUF_FD_SET(child_list[i].fd[j], &fdset, maxfd);
    325324        }
    326325        tv.tv_sec = 0;
     
    333332            continue;
    334333
    335         for(i = 0, j = 0; i < parallel; i += j, j = (j + 1) & 1)
     334        /* XXX: cute (i, j) iterating hack */
     335        for(i = 0, j = 0; i < parallel; i += (j == 2), j = (j + 1) % 3)
    336336        {
    337337            char buf[BUFSIZ];
    338             int fd;
    339338
    340339            if(child_list[i].status != STATUS_RUNNING)
    341340                continue;
    342341
    343             fd = j ? child_list[i].outfd : child_list[i].errfd;
    344 
    345             if(!ZZUF_FD_ISSET(fd, &fdset))
     342            if(!ZZUF_FD_ISSET(child_list[i].fd[j], &fdset))
    346343                continue;
    347344
    348             ret = read(fd, buf, BUFSIZ - 1);
     345            ret = read(child_list[i].fd[j], buf, BUFSIZ - 1);
    349346            if(ret > 0)
    350347            {
    351348                /* We got data */
    352349                child_list[i].bytes += ret;
    353                 if(!quiet)
    354                     fwrite(buf, ret, 1, j ? stdout : stderr);
     350                if(!quiet || j == 0)
     351                    write((j < 2) ? STDERR_FILENO : STDIN_FILENO, buf, ret);
    355352            }
    356353            else if(ret == 0)
    357354            {
    358355                /* End of file reached */
    359                 close(fd);
    360                 if(j)
    361                     child_list[i].outfd = -1;
    362                 else
    363                     child_list[i].errfd = -1;
    364 
    365                 if(child_list[i].outfd == -1 && child_list[i].errfd == -1)
     356                close(child_list[i].fd[j]);
     357                child_list[i].fd[j] = -1;
     358
     359                if(child_list[i].fd[0] == -1 && child_list[i].fd[1] == -1
     360                   && child_list[i].fd[2] == -1)
    366361                    child_list[i].status = STATUS_EOF;
    367362            }
     
    422417static void spawn_child(char **argv)
    423418{
     419    static int const files[] = { DEBUG_FILENO, STDERR_FILENO, STDOUT_FILENO };
    424420    char buf[BUFSIZ];
    425     int outfd[2], errfd[2];
     421    int fd[3][2];
    426422    pid_t pid;
    427     int i;
     423    int i, j;
    428424
    429425    /* Find an empty slot */
     
    433429
    434430    /* Prepare communication pipe */
    435     if(pipe(outfd) == -1 || pipe(errfd) == -1)
    436     {
    437         perror("pipe");
    438         return;
    439     }
     431    for(j = 0; j < 3; j++)
     432        if(pipe(fd[j]) == -1)
     433        {
     434            perror("pipe");
     435            return;
     436        }
    440437
    441438    /* Fork and launch child */
     
    448445        case 0:
    449446            /* We’re the child */
    450             close(outfd[0]);
    451             close(errfd[0]);
    452             dup2(outfd[1], STDOUT_FILENO);
    453             dup2(errfd[1], STDERR_FILENO);
    454             close(outfd[1]);
    455             close(errfd[1]);
     447            for(j = 0; j < 3; j++)
     448            {
     449                close(fd[j][0]);
     450                dup2(fd[j][1], files[j]);
     451                close(fd[j][1]);
     452            }
    456453
    457454            /* Set environment variables */
     
    468465        default:
    469466            /* We’re the parent, acknowledge spawn */
    470             close(outfd[1]);
    471             close(errfd[1]);
    472467            child_list[i].date = time(NULL);
    473468            child_list[i].pid = pid;
    474             child_list[i].outfd = outfd[0];
    475             child_list[i].errfd = errfd[0];
     469            for(j = 0; j < 3; j++)
     470            {
     471                close(fd[j][1]);
     472                child_list[i].fd[j] = fd[j][0];
     473            }
    476474            child_list[i].bytes = 0;
    477475            child_list[i].seed = seed;
Note: See TracChangeset for help on using the changeset viewer.