RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   15-Jun-2017 09:16:18
  Branch: rpm-5_4                          Handle: 2017061507161800

  Added files:              (Branch: rpm-5_4)
    rpm/rpmio               teio.c
  Modified files:           (Branch: rpm-5_4)
    rpm/rpmio               Makefile.am librpmio.vers rpmeio.c rpmeio.h tmq.c

  Log:
    - WIP: refactor RV+EIO into its own nest program.

  Summary:
    Revision    Changes     Path
    1.293.2.92  +8  -5      rpm/rpmio/Makefile.am
    2.199.2.92  +3  -1      rpm/rpmio/librpmio.vers
    1.1.2.2     +514 -8     rpm/rpmio/rpmeio.c
    1.1.2.2     +3  -0      rpm/rpmio/rpmeio.h
    1.1.2.1     +308 -0     rpm/rpmio/teio.c
    1.1.2.23    +1  -433    rpm/rpmio/tmq.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.293.2.91 -r1.293.2.92 Makefile.am
  --- rpm/rpmio/Makefile.am     13 Jun 2017 22:25:23 -0000      1.293.2.91
  +++ rpm/rpmio/Makefile.am     15 Jun 2017 07:16:18 -0000      1.293.2.92
  @@ -18,10 +18,10 @@
        getdate.y html-parse.c html-parse.h libsqlio.c \
        rpmcpio.c rpmcpio.h rpmgenbasedir.c rpmgenpkglist.c rpmgensrclist.c \
        rpmjsio.msg rpmtar.c rpmtar.h \
  -     tdir.c tfts.c tget.c tgfs.c tgit.c tglob.c thkp.c thtml.c tinv.c \
  -     tkey.c tmire.c tmq.c tmqtt.c todbc.c tput.c tpython.c trpmio.c tsexp.c \
  -     tsvn.c tsw.c lookup3.c duktape.c tjsmn.c tjson.c yajl.c testit.sh \
  -     xxhash.h xxhash.c \
  +     tdir.c teio.c tfts.c tget.c tgfs.c tgit.c tglob.c thkp.c thtml.c \
  +     tinv.c tkey.c tmire.c tmq.c tmqtt.c todbc.c tput.c tpython.c trpmio.c \
  +     tsexp.c tsvn.c tsw.c lookup3.c duktape.c tjsmn.c tjson.c yajl.c \
  +     testit.sh xxhash.h xxhash.c \
        microjson.c mongoc-counters.defs
   
   EXTRA_PROGRAMS = rpmcpio rpmdpkg rpmtar rpmz
  @@ -31,7 +31,7 @@
   EXTRA_PROGRAMS += bsdiff bspatch fanotify pcrsed rpmborg rpmcurl \
        rpmgenbasedir rpmgenpkglist rpmgensrclist rpmgpg \
        rpmpbzip2 rpmpigz rpmzstd \
  -     tasn tbf tcap tder tdir tfts tget tglob thkp tmagic tmire \
  +     tasn tbf tcap tder tdir teio tfts tget tglob thkp tmagic tmire \
        tmount todbc toid tperl tpython tput trpmio tsexp tsvn tsw ttcl \
        dumpasn1 lookup3 trel twitter github tmicrojson
   
  @@ -597,6 +597,9 @@
   tdir_SOURCES = tdir.c
   tdir_LDADD = $(RPMIO_LDADD_COMMON)
   
  +teio_SOURCES = teio.c
  +teio_LDADD = $(RPMIO_LDADD_COMMON)
  +
   tfts_SOURCES = tfts.c
   tfts_LDADD = $(RPMIO_LDADD_COMMON)
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.199.2.91 -r2.199.2.92 librpmio.vers
  --- rpm/rpmio/librpmio.vers   13 Jun 2017 22:25:23 -0000      2.199.2.91
  +++ rpm/rpmio/librpmio.vers   15 Jun 2017 07:16:18 -0000      2.199.2.92
  @@ -474,14 +474,16 @@
       rpmMCExpand;
       rpmMCExpandNumeric;
       _rpmeio_debug;
  +    rpmeioCancel;
       rpmeioDumpREQ;
  +    rpmeioLoop;
       rpmeioNew;
       rpmeioReqType;
       rpmeioPipe;
       rpmeioPollWant;
       rpmeioPollDone;
       rpmeioStart;
  -    rpmeioLoop;
  +    rpmeioSubmit;
       rpmeioCB;
       rpmeioCB_readdir;
       rpmeioCB_stat;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmeio.c
  ============================================================================
  $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmeio.c
  --- rpm/rpmio/rpmeio.c        13 Jun 2017 22:25:23 -0000      1.1.2.1
  +++ rpm/rpmio/rpmeio.c        15 Jun 2017 07:16:18 -0000      1.1.2.2
  @@ -13,6 +13,8 @@
       if (_rpmeio_debug || _rpmio_debug) \
        fprintf(stderr, _fmt, __VA_ARGS__)
   
  +#define REQ_ERRNO(req)               ((req)->errorno)
  +
   /*==============================================================*/
   const char * rpmeioReqType(int reqtype)
   {
  @@ -110,7 +112,7 @@
        PRINT(d, errorno);
   #else
        if (req->errorno)
  -         fprintf(fp, "%25s: %d %s\n", "errorno", req->errorno, 
strerror(req->errorno));
  +         fprintf(fp, "%25s: %d %s\n", "errorno", REQ_ERRNO(req), 
strerror(REQ_ERRNO(req)));
   #endif
   
   #ifdef       DYING
  @@ -145,6 +147,48 @@
   }
   
   /*==============================================================*/
  +#ifdef       REF
  +static struct ev_loop *loop;
  +static ev_idle repeat_watcher;
  +static ev_async ready_watcher;
  +
  +/* idle watcher callback, only used when eio_poll */
  +/* didn't handle all results in one call */
  +static void
  +repeat (EV_P_ ev_idle *w, int revents)
  +{
  +    if (eio_poll () != -1)
  +     ev_idle_stop (EV_A_ w);
  +}
  +
  +/* eio has some results, process them */
  +static void
  +ready (EV_P_ ev_async *w, int revents)
  +{
  +    if (eio_poll () == -1)
  +     ev_idle_start (EV_A_ &repeat_watcher);
  +}
  +
  +/* wake up the event loop */
  +static void
  +want_poll (void)
  +{
  +    ev_async_send (loop, &ready_watcher)
  +}
  +
  +void
  +my_init_eio ()
  +{
  +    loop = EV_DEFAULT;
  +
  +    ev_idle_init (&repeat_watcher, repeat);
  +    ev_async_init (&ready_watcher, ready);
  +    ev_async_start (loop, &watcher);
  +
  +    eio_init (want_poll, 0);
  +}
  +#endif       /* REF */
  +
   int rpmeioPipe[2];
   
   void rpmeioPollWant(void)
  @@ -161,6 +205,32 @@
   SPEW("<-- %s() nr %zd\n)\n", __FUNCTION__, nr);
   }
   
  +#ifdef       TODO
  +
  +    eio_set_max_poll_time(eio_tstamp nseconds);
  +    eio_set_max_poll_reqs(unsigned int nreqs);
  +    eio_set_min_parallel(unsigned int nthreads);
  +    eio_set_max_parallel(unsigned int nthreads);
  +    eio_set_max_idle(unsigned int nthreads);
  +    eio_set_idle_timeout (unsigned int seconds);
  +
  +unsigned nreqs = eio_nreqs();
  +unsigned nready = eio_nready();
  +unsigned nthreads = eio_nthreads();
  +unsigned npending = eio_npending();
  +
  +#define      EIO_STACKSIZE   4096    /* default? */
  +
  +eio _req *grp = eio_grp(eio_cb cb, void *data);
  +    eio_grp_feed(eio_req *grp, void (*feed)(eio_req *req), int limit);
  +    eio_grp_limit(eio_req *grp, int limit);
  +    eio_grp_add(eio_req *grp, eio_req *req);
  +    eio_grp_cancel(eio_req *grp);
  +
  +    eio_ssize_t eio_sendfile_sync (int ofd, int ifd, off_t offset, size_t 
count);
  +
  +#endif       /* TODO */
  +
   int rpmeioStart(void)
   {
       int rc = pipe(rpmeioPipe);
  @@ -189,23 +259,38 @@
   SPEW("<== %s() polled %d\n", __FUNCTION__, polled);
   }
   
  +void rpmeioSubmot(eio_req * req)
  +{
  +SPEW("--> %s(%p)\n", __FUNCTION__, req);
  +    eio_submit(req);
  +}
  +
  +void rpmeioCancel(eio_req * req)
  +{
  +SPEW("--> %s(%p)\n", __FUNCTION__, req);
  +    eio_cancel(req);
  +}
  +
  +/*==============================================================*/
   int rpmeioCB(eio_req * req)
   {
  -rpmeioDumpREQ(__FUNCTION__, req, NULL);
   SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), 
EIO_RESULT(req));
  +rpmeioDumpREQ(__FUNCTION__, req, NULL);
   
  -    if (req->result < 0)
  -     abort();
  +    if (EIO_RESULT(req) < 0) {
  +     errno = REQ_ERRNO(req);
  +     perror(REQ_TYPE(req));
  +    }
   
       return 0;
   }
   
   int rpmeioCB_readdir(eio_req * req)
   {
  -rpmeioDumpREQ(__FUNCTION__, req, NULL);
       char *buf = (char *) EIO_BUF(req);
   
   SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), 
EIO_RESULT(req));
  +rpmeioDumpREQ(__FUNCTION__, req, NULL);
   
       if (EIO_RESULT(req) < 0)
        return 0;
  @@ -220,10 +305,10 @@
   
   int rpmeioCB_stat(eio_req * req)
   {
  -rpmeioDumpREQ(__FUNCTION__, req, NULL);
       struct stat *buf = EIO_STAT_BUF(req);
   
   SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), 
EIO_RESULT(req));
  +rpmeioDumpREQ(__FUNCTION__, req, NULL);
       if (req->type == EIO_FSTAT) {
        SPEW("\tfstat = %ld\n", EIO_RESULT(req));
       } else {
  @@ -239,12 +324,12 @@
   
   int rpmeioCB_read(eio_req * req)
   {
  -rpmeioDumpREQ(__FUNCTION__, req, NULL);
       unsigned char *buf = (unsigned char *) EIO_BUF(req);
   
   SPEW("--> %s(%s|%p) res %ld (%02x%02x%02x%02x %02x%02x%02x%02x)\n",
                __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req),
                buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
  +rpmeioDumpREQ(__FUNCTION__, req, NULL);
   
       return 0;
   }
  @@ -253,8 +338,8 @@
   
   int rpmeioCB_open(eio_req * req)
   {
  -rpmeioDumpREQ(__FUNCTION__, req, NULL);
   SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), 
EIO_RESULT(req));
  +rpmeioDumpREQ(__FUNCTION__, req, NULL);
   
       rpmeioLastFdno = EIO_RESULT(req);
   
  @@ -262,6 +347,427 @@
   }
   
   /*==============================================================*/
  +static eio_req * rpmeioReq(int reqtype, ...)
  +{
  +    eio_req * req = NULL;
  +
  +    const char * path = NULL;
  +    const char * npath = NULL;
  +    void (*execute) (eio_req *req);
  +    int fdno = -1;
  +    int fdno2 = -1;
  +    off_t offset = 0;
  +    int whence = 0;
  +    void *buf = NULL;
  +    size_t length = 0;
  +    eio_tstamp atime = 0.0;
  +    eio_tstamp mtime = 0.0;
  +    uid_t uid = -1;
  +    gid_t gid = -1;
  +    mode_t mode = 0;
  +    void *addr = NULL;
  +    int flags = 0;
  +    eio_tstamp delay = 0.0;
  +    dev_t dev = 0;
  +    
  +    int pri = 0;
  +    eio_cb cb = rpmeioCB;
  +    void * data = NULL;
  +
  +    const char * fmt = NULL;
  +(void *)fmt;
  +    va_list ap;
  +
  +    if (reqtype >= EIO_REQ_TYPE_NUM)
  +     goto exit;
  +
  +    va_start(ap, reqtype);
  +
  +    switch (reqtype) {
  +    case EIO_CUSTOM:
  +     execute = va_arg(ap, void (*) (eio_req *));
  +     cb = rpmeioCB;          /* XXX */
  +     data = "custom";
  +     req = eio_custom(execute, pri, cb, data);
  +     break;
  +#ifdef       NOTYET
  +    case EIO_WD_OPEN:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "wd_open";
  +     req = eio_wd_open(path, pri, cb, data);
  +     break;
  +    case EIO_WD_CLOSE:
  +     cb = rpmeioCB;          /* XXX */
  +     data = "wd_close";
  +     fmt = "%p | %d, %p, %p";
  +     req = eio_wd_close(wd, pri, cb, data);
  +     break;
  +#endif       /* NOTYET */
  +    case EIO_CLOSE:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;
  +     data = "close";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_close(fdno, pri, cb, data);
  +     break;
  +    case EIO_DUP2:
  +     fdno = va_arg(ap, int);
  +     fdno2 = va_arg(ap, int);
  +     cb = rpmeioCB;
  +     data = "dup2";
  +     fmt = "%d, %d | %d, %p, %p";
  +     req = eio_dup2(fdno, fdno2, pri, cb, data);
  +     break;
  +    case EIO_SEEK:
  +     fdno = va_arg(ap, int);
  +     offset = va_arg(ap, off_t);
  +     whence = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "seek";
  +     fmt = "%d, %ld, %d | %d, %p, %p";
  +     req = eio_seek(fdno, offset, whence, pri, cb, data);
  +     break;
  +    case EIO_READ:
  +     fdno = va_arg(ap, int);
  +     buf = va_arg(ap, void *);
  +     length = va_arg(ap, size_t);
  +     offset = va_arg(ap, off_t);
  +     cb = rpmeioCB_read;
  +     data = "read";
  +     fmt = "%d, %p, %zu | %d, %p, %p";
  +     req = eio_read(fdno, buf, length, offset, pri, cb, data);
  +     break;
  +    case EIO_WRITE:
  +     fdno = va_arg(ap, int);
  +     buf = va_arg(ap, void *);
  +     length = va_arg(ap, size_t);
  +     offset = va_arg(ap, off_t);
  +     cb = rpmeioCB;
  +     data = "write";
  +     fmt = "%d, %p, %zu | %d, %p, %p";
  +     req = eio_write(fdno, buf, length, offset, pri, cb, data);
  +     break;
  +    case EIO_READAHEAD:
  +     fdno = va_arg(ap, int);
  +     offset = va_arg(ap, off_t);
  +     length = va_arg(ap, size_t);
  +     cb = rpmeioCB;
  +     data = "readahead";
  +     fmt = "%d, %lld, %zu | %d, %p, %p";
  +     req = eio_readahead(fdno, offset, length, pri, cb, data);
  +     break;
  +    case EIO_SENDFILE:
  +     fdno2 = va_arg(ap, int);
  +     fdno = va_arg(ap, int);
  +     offset = va_arg(ap, off_t);
  +     length = va_arg(ap, size_t);
  +     cb = rpmeioCB;
  +     data = "sendfile";
  +     fmt = "%d, %d, %p, %zu | %d, %p, %p";
  +     req = eio_sendfile(fdno2, fdno, offset, length, pri, cb, data);
  +     break;
  +    case EIO_FSTAT:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB_stat;
  +     data = "fstat";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_fstat(fdno, pri, cb, data);
  +     break;
  +    case EIO_FSTATVFS:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "statvfs";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_fstatvfs(fdno, pri, cb, data);
  +     break;
  +    case EIO_FTRUNCATE:
  +     fdno = va_arg(ap, int);
  +     offset = va_arg(ap, off_t);
  +     cb = rpmeioCB;
  +     data = "ftruncate";
  +     fmt = "%d, %ld | %d, %p, %p";
  +     req = eio_ftruncate(fdno, offset, pri, cb, data);
  +     break;
  +    case EIO_FUTIME:
  +     fdno = va_arg(ap, int);
  +     atime = va_arg(ap, eio_tstamp);
  +     mtime = va_arg(ap, eio_tstamp);
  +     cb = rpmeioCB;
  +     data = "futime";
  +     fmt = "%d, %f, %f | %d, %p, %p";
  +     req = eio_futime(fdno, atime, mtime, pri, cb, data);
  +     break;
  +    case EIO_FCHMOD:
  +     fdno = va_arg(ap, int);
  +     mode = va_arg(ap, mode_t);
  +     cb = rpmeioCB;
  +     data = "fchmod";
  +     fmt = "%d, %hd | %d, %p, %p";
  +     req = eio_fchmod(fdno, mode, pri, cb, data);
  +     break;
  +    case EIO_FCHOWN:
  +     fdno = va_arg(ap, int);
  +     uid = va_arg(ap, uid_t);
  +     gid = va_arg(ap, gid_t);
  +     cb = rpmeioCB;
  +     data = "fchown";
  +     fmt = "%d, %d, %d | %d, %p, %p";
  +     req = eio_fchown(fdno, uid, gid, pri, cb, data);
  +     break;
  +    case EIO_SYNC:
  +     cb = rpmeioCB;
  +     data = "sync";
  +     fmt = "| %d, %p, %p";
  +     req = eio_sync(pri, cb, data);
  +     break;
  +    case EIO_FSYNC:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;
  +     data = "fsync";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_fsync(fdno, pri, cb, data);
  +     break;
  +    case EIO_FDATASYNC:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;
  +     data = "fdatasync";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_fdatasync(fdno, pri, cb, data);
  +     break;
  +    case EIO_SYNCFS:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "syncfs";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_syncfs(fdno, pri, cb, data);
  +     break;
  +    case EIO_MSYNC:
  +     addr = va_arg(ap, void *);
  +     length = va_arg(ap, size_t);
  +     flags = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "msync";
  +     fmt = "%p, %zu, %d | %d, %p, %p";
  +     req = eio_msync(addr, length, flags, pri, cb, data);
  +     break;
  +    case EIO_MTOUCH:
  +     addr = va_arg(ap, void *);
  +     length = va_arg(ap, size_t);
  +     flags = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "mtouch";
  +     fmt = "%p, %zu, %d | %d, %p, %p";
  +     req = eio_mtouch(addr, length, flags, pri, cb, data);
  +     break;
  +    case EIO_SYNC_FILE_RANGE:
  +     fdno = va_arg(ap, int);
  +     offset = va_arg(ap, off_t);
  +     length = va_arg(ap, size_t);
  +     flags = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "sync_file_range";
  +     fmt = "%p, %lld, %lld, %u | %d, %p, %p";
  +     req = eio_sync_file_range(fdno, offset, length, flags, pri, cb, data);
  +     break;
  +    case EIO_FALLOCATE:
  +     fdno = va_arg(ap, int);
  +     mode = va_arg(ap, mode_t);
  +     offset = va_arg(ap, off_t);
  +     length = va_arg(ap, size_t);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "fallocate";
  +     fmt = "%p, %d, %ld, %ld | %d, %p, %p";
  +     req = eio_fallocate (fdno, mode, offset, length, pri, cb, data);
  +     break;
  +    case EIO_MLOCK:
  +     addr = va_arg(ap, void *);
  +     length = va_arg(ap, size_t);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "mlock";
  +     fmt = "%p, %zu | %d, %p, %p";
  +     req = eio_mlock(addr, length, pri, cb, data);
  +     break;
  +    case EIO_MLOCKALL:
  +     fdno = va_arg(ap, int);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "mlockall";
  +     fmt = "%d | %d, %p, %p";
  +     req = eio_mlockall(flags, pri, cb, data);
  +     break;
  +    case EIO_GROUP:
  +     cb = rpmeioCB;          /* XXX */
  +     data = "group";
  +     pri = EIO_PRI_MAX;      /* XXX */
  +     fmt = "| %p, %p";
  +     req = eio_grp(cb, data);
  +     break;
  +    case EIO_NOP:
  +     cb = rpmeioCB;
  +     data = "nop";
  +     fmt = "| %d, %p, %p";
  +     req = eio_nop(pri,cb, data);
  +     break;
  +    case EIO_BUSY:
  +     delay = va_arg(ap, eio_tstamp);
  +     cb = rpmeioCB;
  +     data = "busy";
  +     fmt = "%f | %d, %p, %p";
  +     req = eio_busy(delay, pri, cb, data);
  +     break;
  +    case EIO_REALPATH:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "realpath";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_realpath(path, pri, cb, data);
  +     break;
  +    case EIO_READDIR:
  +     path = va_arg(ap, const char *);
  +     flags = va_arg(ap, int);
  +     cb = rpmeioCB_open;
  +     data = "readdir";
  +     fmt = "%s, %d | %d, %p, %p";
  +     req = eio_readdir(path, flags, pri, cb, data);
  +     break;
  +    case EIO_OPEN:
  +     path = va_arg(ap, const char *);
  +     flags = va_arg(ap, int);
  +     mode = va_arg(ap, mode_t);
  +     cb = rpmeioCB_open;
  +     data = "open";
  +     fmt = "%s, %d, %d | %d, %p, %p";
  +     req = eio_open(path, flags, mode, pri, cb, data);
  +     break;
  +    case EIO_STAT:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB_stat;
  +     data = "stat";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_stat(path, pri, cb, data);
  +     break;
  +    case EIO_LSTAT:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB_stat;
  +     data = "lstat";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_lstat(path, pri, cb, data);
  +     break;
  +    case EIO_STATVFS:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "statvfs";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_statvfs(path, pri, cb, data);
  +     break;
  +    case EIO_TRUNCATE:
  +     path = va_arg(ap, const char *);
  +     offset = va_arg(ap, off_t);
  +     cb = rpmeioCB;
  +     data = "truncate";
  +     fmt = "%s, %ld | %d, %p, %p";
  +     req = eio_truncate(path, offset, pri, cb, data);
  +     break;
  +    case EIO_UTIME:
  +     path = va_arg(ap, const char *);
  +     atime = va_arg(ap, eio_tstamp);
  +     mtime = va_arg(ap, eio_tstamp);
  +     cb = rpmeioCB;
  +     data = "utime";
  +     fmt = "%s, %p, %p | %d, %p, %p";
  +     req = eio_utime(path, atime, mtime, pri, cb, data);
  +     break;
  +    case EIO_CHMOD:
  +     path = va_arg(ap, const char *);
  +     mode = va_arg(ap, mode_t);
  +     cb = rpmeioCB;          /* XXX */
  +     data = "chmod";
  +     fmt = "%s, %d | %d, %p, %p";
  +     req = eio_chmod(path, mode, pri, cb, data);
  +     break;
  +    case EIO_CHOWN:
  +     path = va_arg(ap, const char *);
  +     uid = va_arg(ap, uid_t);
  +     gid = va_arg(ap, gid_t);
  +     cb = rpmeioCB;
  +     data = "chown";
  +     fmt = "%s, %d, %d | %d, %p, %p";
  +     req = eio_chown(path, uid, gid, pri, cb, data);
  +     break;
  +    case EIO_UNLINK:
  +     cb = rpmeioCB;
  +     path = va_arg(ap, const char *);
  +     data = "unlink";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_unlink(path, pri, cb, data);
  +     break;
  +    case EIO_RMDIR:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "rmdir";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_rmdir(path, pri, cb, data);
  +     break;
  +    case EIO_MKDIR:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "mkdir";
  +     fmt = "%s, %d | %d, %p, %p";
  +     req = eio_mkdir(path, mode, pri, cb, data);
  +     break;
  +    case EIO_RENAME:
  +     path = va_arg(ap, const char *);
  +     npath = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "rename";
  +     fmt = "%s, %s | %d, %p, %p";
  +     req = eio_rename(path, npath, pri, cb, data);
  +     break;
  +    case EIO_MKNOD:
  +     path = va_arg(ap, const char *);
  +     mode = va_arg(ap, mode_t);
  +     dev = va_arg(ap, dev_t);
  +     cb = rpmeioCB;
  +     data = "mknod";
  +     fmt = "%s, %d, %ld | %d, %p, %p";
  +     req = eio_mknod(path, mode, dev, pri, cb, data);
  +     break;
  +    case EIO_LINK:
  +     path = va_arg(ap, const char *);
  +     npath = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "link";
  +     fmt = "%s, %s | %d, %p, %p";
  +     req = eio_link(path, npath, pri, cb, data);
  +     break;
  +    case EIO_SYMLINK:
  +     path = va_arg(ap, const char *);
  +     npath = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "symlink";
  +     fmt = "%s, %s | %d, %p, %p";
  +     req = eio_symlink(path, npath, pri, cb, data);
  +     break;
  +    case EIO_READLINK:
  +     path = va_arg(ap, const char *);
  +     cb = rpmeioCB;
  +     data = "readlink";
  +     fmt = "%s | %d, %p, %p";
  +     req = eio_readlink(path, pri, cb, data);
  +     break;
  +    default:
  +assert(0);
  +     break;
  +    }
  +
  +    va_end(ap);
  +
  +exit:
  +    return req;
  +}
  +
  +
  +/*==============================================================*/
   eio_req *Eio_wd_open   (const char *path, int pri, eio_cb cb, void *data)
   {
       eio_req * req = eio_wd_open(path, pri, cb, data);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmeio.h
  ============================================================================
  $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmeio.h
  --- rpm/rpmio/rpmeio.h        13 Jun 2017 22:25:23 -0000      1.1.2.1
  +++ rpm/rpmio/rpmeio.h        15 Jun 2017 07:16:18 -0000      1.1.2.2
  @@ -104,6 +104,9 @@
   
   void rpmeioLoop(void);
   
  +void rpmeioCancel(eio_req * req);
  +void rpmeioCancel(eio_req * req);
  +
   int rpmeioCB(eio_req * req);
   int rpmeioCB_readdir(eio_req * req);
   int rpmeioCB_stat(eio_req * req);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/teio.c
  ============================================================================
  $ cvs diff -u -r0 -r1.1.2.1 teio.c
  --- /dev/null 2017-06-15 09:15:35.000000000 +0200
  +++ teio.c    2017-06-15 09:16:18.669474225 +0200
  @@ -0,0 +1,308 @@
  +
  +/**
  + * \file rpmio/tmq.c
  + */
  +
  +#include "system.h"
  +
  +#include <rpmio_internal.h>
  +#include <rpmlog.h>
  +#include <rpmmacro.h>
  +#include <poptIO.h>
  +#include <argv.h>
  +
  +# define _RPMEIO_INTERNAL
  +# include <rpmeio.h>
  +
  +#if defined(HAVE_EV_H)
  +# include <ev.h>
  +#endif
  +
  +#define      _RPMEV_INTERNAL
  +#include <rpmev.h>
  +
  +#include "debug.h"
  +
  +static int _debug = -1;
  +
  +#define SPEW(_fmt, ...) \
  +    if (_debug || _rpmeio_debug || _rpmio_debug) \
  +     fprintf(stderr, _fmt, ##__VA_ARGS__)
  +
  +#define Z(_rc)       assert((_rc) == 0)
  +
  +/*==============================================================*/
  +static int doEV(ARGV_t av, int ac)
  +{
  +    int rc = 0;
  +
  +SPEW("    version: %u.%u\n", ev_version_major(), ev_version_minor());
  +
  +char *rstr = NULL;
  +unsigned mask = 0;
  +mask = ev_supported_backends();
  +rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  +SPEW("  supported: %s\n", rstr);
  +rstr = _free(rstr);
  +
  +mask = ev_recommended_backends();
  +rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  +SPEW("recommended: %s\n", rstr);
  +rstr = _free(rstr);
  +
  +mask = ev_embeddable_backends();
  +rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  +SPEW(" embeddable: %s\n", rstr);
  +rstr = _free(rstr);
  +
  +SPEW("       time: %f\n", ev_time());
  +
  +    /* use the default event loop unless you have special needs */
  +    struct ev_loop *loop = ev_default_loop(EVFLAG_AUTO);
  +    rpmev ev = NULL;
  +
  +    /* initialise an io watcher, then start it */
  +    /* this one will watch for stdin to become readable */
  +    ev = rpmevNew(RPMEV_TYPE_IO,     NULL, STDIN_FILENO, EV_READ);
  +#ifdef       DYING
  +    {        ev_io * w = &ev->evw.io;
  +     w->fd = STDIN_FILENO;
  +     w->events = EV_READ;
  +     ev_io_start(loop, w);
  +    }
  +#endif
  +
  +    /* initialise a timer watcher, then start it */
  +    /* simple non-repeating 5.5 second timeout */
  +    ev = rpmevNew(RPMEV_TYPE_TIMER,  NULL, 0,0, 5.5);
  +#ifdef       DYING
  +    {        ev_timer * w = &ev->evw.timer;
  +     w->at = 0.0;
  +     w->repeat = 5.5;
  +     ev_timer_start(loop, w);
  +    }
  +#endif
  +
  +    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NULL, 0.0, 11.0, NULL );
  +#ifdef       DYING
  +    {        ev_periodic * w = &ev->evw.periodic;
  +     w->offset = 0.0;
  +     w->interval = 11.0;
  +     w->reschedule_cb = NULL;
  +     ev_periodic_start(loop, w);
  +    }
  +#endif
  +
  +    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NULL, SIGUSR1);
  +#ifdef       DYING
  +    {        ev_signal * w = &ev->evw.signal;
  +     w->signum = SIGUSR1;
  +     ev_signal_start(loop, w);
  +    }
  +#endif
  +
  +#ifdef       DYING
  +    ev = rpmevNew(RPMEV_TYPE_CHILD,  NULL, 0, 0);
  +    {        ev_child * w = &ev->evw.child;
  +     w->pid = 0;
  +     w->flags = 0;   /** XXX 0=terminate, 1=stop/continue */
  +    }
  +#endif
  +
  +    const char * _path = "/X/src/wdj54/rpmio/tmq";
  +    ev = rpmevNew(RPMEV_TYPE_STAT,   NULL, _path, 0.0);
  +#ifdef       DYING
  +    {        ev_stat * w = &ev->evw.stat;
  +     w->path = _free(w->path);
  +     w->path = xstrdup(_path);
  +     w->interval = 0;        /* XXX 0=recommended ~5s, must be >0.1 */
  +     w->wd = -2;
  +     ev_stat_start(loop, w);
  +    }
  +#endif
  +
  +    ev = rpmevNew(RPMEV_TYPE_IDLE,   NULL);
  +#ifdef       DYING
  +    {        ev_idle * w = &ev->evw.idle;
  +     ev_idle_start(loop, w);
  +    }
  +#endif
  +
  +#ifdef       NOTYET
  +    ev = rpmevNew(RPMEV_TYPE_PREPARE,        NULL);
  +    ev = rpmevNew(RPMEV_TYPE_CHECK,  NULL);
  +    ev = rpmevNew(RPMEV_TYPE_FORK,   NULL);
  +    ev = rpmevNew(RPMEV_TYPE_CLEANUP,        NULL);
  +    ev = rpmevNew(RPMEV_TYPE_EMBED,  NULL, NULL);
  +    ev = rpmevNew(RPMEV_TYPE_ASYNC,  NULL);
  +#endif
  +
  +    /* now wait for events to arrive */
  +    ev_run(loop, 0);
  +
  +    /* unloop was called, so exit */
  +
  +    /* Deallocate all events. */
  +    while ((ev = rpmevqGetHead()) != NULL)
  +     ev = rpmevFree(ev);
  +
  +    ev_loop_destroy(loop);
  +
  +    return rc;
  +}
  +
  +/*==============================================================*/
  +static int doEIO(ARGV_t av, int ac)
  +{
  +    int rc = 0;
  +
  +    rc = rpmeioStart();
  +    if (rc)
  +     goto exit;
  +
  +    do {
  +     /* avoid relative paths yourself(!) */
  +     Eio_mkdir("eio-test-dir", 0777, 0, rpmeioCB, "mkdir");
  +     Eio_nop(0, rpmeioCB, "nop");
  +     rpmeioLoop();
  +
  +     Eio_stat("eio-test-dir", 0, rpmeioCB_stat, "stat");
  +     Eio_lstat("eio-test-dir", 0, rpmeioCB_stat, "stat");
  +     Eio_open("eio-test-dir/eio-test-file", O_RDWR | O_CREAT, 0777, 0,
  +              rpmeioCB_open, "open");
  +     Eio_symlink("test", "eio-test-dir/eio-symlink", 0, rpmeioCB,
  +                 "symlink");
  +     Eio_mknod("eio-test-dir/eio-fifo", S_IFIFO, 0, 0, rpmeioCB, "mknod");
  +     rpmeioLoop();
  +
  +     Eio_utime("eio-test-dir", 12345.678, 23456.789, 0, rpmeioCB,
  +               "utime");
  +     Eio_futime(rpmeioLastFdno, 92345.678, 93456.789, 0, rpmeioCB, "futime");
  +     Eio_chown("eio-test-dir", getuid(), getgid(), 0, rpmeioCB, "chown");
  +     Eio_fchown(rpmeioLastFdno, getuid(), getgid(), 0, rpmeioCB, "fchown");
  +     Eio_fchmod(rpmeioLastFdno, 0723, 0, rpmeioCB, "fchmod");
  +     Eio_readdir("eio-test-dir", 0, 0, rpmeioCB_readdir, "readdir");
  +     Eio_readdir("/nonexistant", 0, 0, rpmeioCB_readdir, "readdir");
  +     Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat");
  +     Eio_write(rpmeioLastFdno, "test\nfail\n", 10, 4, 0, rpmeioCB, "write");
  +     rpmeioLoop();
  +
  +     Eio_read(rpmeioLastFdno, 0, 8, 0, EIO_PRI_DEFAULT, rpmeioCB_read, 
"read");
  +     Eio_readlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "readlink");
  +     rpmeioLoop();
  +
  +     Eio_dup2(1, 2, EIO_PRI_DEFAULT, rpmeioCB, "dup");       // dup stdout 
to stderr
  +     Eio_chmod("eio-test-dir", 0765, 0, rpmeioCB, "chmod");
  +     Eio_ftruncate(rpmeioLastFdno, 9, 0, rpmeioCB, "ftruncate");
  +     Eio_fdatasync(rpmeioLastFdno, 0, rpmeioCB, "fdatasync");
  +     Eio_fsync(rpmeioLastFdno, 0, rpmeioCB, "fsync");
  +     Eio_sync(0, rpmeioCB, "sync");
  +     Eio_busy(0.5, 0, rpmeioCB, "busy");
  +     rpmeioLoop();
  +
  +     Eio_sendfile(1, rpmeioLastFdno, 4, 5, 0, rpmeioCB, "sendfile"); // 
write "test\n" to stdout
  +     Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat");
  +     rpmeioLoop();
  +
  +     Eio_truncate("eio-test-dir/eio-test-file", 6, 0, rpmeioCB,
  +                  "truncate");
  +     Eio_readahead(rpmeioLastFdno, 0, 64, 0, rpmeioCB, "readahead");
  +     rpmeioLoop();
  +
  +     Eio_close(rpmeioLastFdno, 0, rpmeioCB, "close");
  +     Eio_link("eio-test-dir/eio-test-file",
  +              "eio-test-dir/eio-test-file-2", 0, rpmeioCB, "link");
  +     rpmeioLoop();
  +
  +     Eio_rename("eio-test-dir/eio-test-file",
  +                "eio-test-dir/eio-test-file-renamed", 0, rpmeioCB,
  +                "rename");
  +     rpmeioLoop();
  +
  +     Eio_unlink("eio-test-dir/eio-fifo", 0, rpmeioCB, "unlink");
  +     Eio_unlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "unlink");
  +     Eio_unlink("eio-test-dir/eio-test-file-2", 0, rpmeioCB, "unlink");
  +     Eio_unlink("eio-test-dir/eio-test-file-renamed", 0, rpmeioCB,
  +                "unlink");
  +     rpmeioLoop();
  +
  +     Eio_rmdir("eio-test-dir", 0, rpmeioCB, "rmdir");
  +     rpmeioLoop();
  +
  +    } while (0);
  +
  +    rc = 0;  /* XXX */
  +
  +exit:
  +    return rc;
  +}
  +
  +/*==============================================================*/
  +#if !defined(POPT_BIT_XOR)
  +#define      POPT_BIT_XOR    (POPT_ARG_VAL|POPT_ARGFLAG_XOR)
  +#endif
  +
  +static struct poptOption rpmmqOptionsTable[] = {
  + { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,       &_debug, 1,
  +     NULL, NULL },
  +
  +#ifdef       DYING
  +#define      _MSQBIT(_v)     (RPMMSQ_FLAGS_##_v)
  + { "qname", 'Q', POPT_ARG_STRING,                &qname, 0,
  +     N_("Use message queue QNAME"), N_("QNAME") },
  + { "posix", 'P', POPT_BIT_SET,                      &flags, _MSQBIT(POSIX),
  +     N_("Use POSIX message queues"), NULL },
  + { "sysv", 'S', POPT_BIT_SET,                       &flags, _MSQBIT(SYSV),
  +     N_("Use SysV message queues"), NULL },
  +
  + { "reset", 'R', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE,  &flags, _MSQBIT(RESET),
  +     N_("Remove queue before opening"), NULL },
  + { "info", 'I', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE,   &flags, _MSQBIT(INFO),
  +     N_("Display queue info on close"), NULL },
  + { "delete", 'D', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &flags, _MSQBIT(DELETE),
  +     N_("Remove queue after closing"), NULL },
  +
  + { "count", 'c', POPT_ARG_INT,                           &count, 0,
  +     N_("Send COUNT messages"), N_("COUNT") },
  + { "priority", 'p', POPT_ARG_LONG,               &priority, 0,
  +     N_("Send message PRIORITY"), N_("PRIORITY") },
  +#undef       _MSQBIT
  +#endif       /* DYING */
  +
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioOpenFlagsTable, 0,
  +     N_("Open(2) flags:"), NULL },
  +
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0,
  +     N_("Common options for all rpmio executables:"), NULL },
  +
  +  POPT_AUTOALIAS
  +  POPT_AUTOHELP
  +  POPT_TABLEEND
  +};
  +
  +int
  +main(int argc, char *argv[])
  +{
  +    poptContext con = rpmioInit(argc, argv, rpmmqOptionsTable);
  +    ARGV_t av = poptGetArgs(con);
  +    int ac = argvCount(av);;
  +    int ec = 0;
  +
  +#ifdef       DYING
  +    _rpmmsqOFlags = rpmioOpenFlags;
  +    if (qname == NULL)
  +     qname = xstrdup("rpm");
  +#endif
  +
  +    switch (6) {
  +    case 5:  ec = doEV(av, ac);      break;
  +    case 6:  ec = doEIO(av, ac);     break;
  +    }
  +
  +#ifdef       DYING
  +    qname = _free(qname);
  +#endif
  +    con = rpmioFini(con);
  +
  +    return ec;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tmq.c
  ============================================================================
  $ cvs diff -u -r1.1.2.22 -r1.1.2.23 tmq.c
  --- rpm/rpmio/tmq.c   13 Jun 2017 22:25:23 -0000      1.1.2.22
  +++ rpm/rpmio/tmq.c   15 Jun 2017 07:16:18 -0000      1.1.2.23
  @@ -76,16 +76,6 @@
   
   #include <rpmmsq.h>
   
  -# define _RPMEIO_INTERNAL
  -# include <rpmeio.h>
  -
  -#if defined(HAVE_EV_H)
  -# include <ev.h>
  -#endif
  -
  -#define      _RPMEV_INTERNAL
  -#include <rpmev.h>
  -
   #include "debug.h"
   
   static int _debug = -1;
  @@ -1143,426 +1133,6 @@
   }
   
   /*==============================================================*/
  -static int doEV(ARGV_t av, int ac)
  -{
  -    int rc = 0;
  -
  -SPEW("    version: %u.%u\n", ev_version_major(), ev_version_minor());
  -
  -char *rstr = NULL;
  -unsigned mask = 0;
  -mask = ev_supported_backends();
  -rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  -SPEW("  supported: %s\n", rstr);
  -rstr = _free(rstr);
  -
  -mask = ev_recommended_backends();
  -rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  -SPEW("recommended: %s\n", rstr);
  -rstr = _free(rstr);
  -
  -mask = ev_embeddable_backends();
  -rstr = rpmioB2N(rpmioEVBACKENDTable, mask);
  -SPEW(" embeddable: %s\n", rstr);
  -rstr = _free(rstr);
  -
  -SPEW("       time: %f\n", ev_time());
  -
  -    /* use the default event loop unless you have special needs */
  -    struct ev_loop *loop = ev_default_loop(EVFLAG_AUTO);
  -    rpmev ev = NULL;
  -
  -    /* initialise an io watcher, then start it */
  -    /* this one will watch for stdin to become readable */
  -    ev = rpmevNew(RPMEV_TYPE_IO,     NULL, STDIN_FILENO, EV_READ);
  -#ifdef       DYING
  -    {        ev_io * w = &ev->evw.io;
  -     w->fd = STDIN_FILENO;
  -     w->events = EV_READ;
  -     ev_io_start(loop, w);
  -    }
  -#endif
  -
  -    /* initialise a timer watcher, then start it */
  -    /* simple non-repeating 5.5 second timeout */
  -    ev = rpmevNew(RPMEV_TYPE_TIMER,  NULL, 0,0, 5.5);
  -#ifdef       DYING
  -    {        ev_timer * w = &ev->evw.timer;
  -     w->at = 0.0;
  -     w->repeat = 5.5;
  -     ev_timer_start(loop, w);
  -    }
  -#endif
  -
  -    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NULL, 0.0, 11.0, NULL );
  -#ifdef       DYING
  -    {        ev_periodic * w = &ev->evw.periodic;
  -     w->offset = 0.0;
  -     w->interval = 11.0;
  -     w->reschedule_cb = NULL;
  -     ev_periodic_start(loop, w);
  -    }
  -#endif
  -
  -    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NULL, SIGUSR1);
  -#ifdef       DYING
  -    {        ev_signal * w = &ev->evw.signal;
  -     w->signum = SIGUSR1;
  -     ev_signal_start(loop, w);
  -    }
  -#endif
  -
  -#ifdef       DYING
  -    ev = rpmevNew(RPMEV_TYPE_CHILD,  NULL, 0, 0);
  -    {        ev_child * w = &ev->evw.child;
  -     w->pid = 0;
  -     w->flags = 0;   /** XXX 0=terminate, 1=stop/continue */
  -    }
  -#endif
  -
  -    const char * _path = "/X/src/wdj54/rpmio/tmq";
  -    ev = rpmevNew(RPMEV_TYPE_STAT,   NULL, _path, 0.0);
  -#ifdef       DYING
  -    {        ev_stat * w = &ev->evw.stat;
  -     w->path = _free(w->path);
  -     w->path = xstrdup(_path);
  -     w->interval = 0;        /* XXX 0=recommended ~5s, must be >0.1 */
  -     w->wd = -2;
  -     ev_stat_start(loop, w);
  -    }
  -#endif
  -
  -    ev = rpmevNew(RPMEV_TYPE_IDLE,   NULL);
  -#ifdef       DYING
  -    {        ev_idle * w = &ev->evw.idle;
  -     ev_idle_start(loop, w);
  -    }
  -#endif
  -
  -#ifdef       NOTYET
  -    ev = rpmevNew(RPMEV_TYPE_PREPARE,        NULL);
  -    ev = rpmevNew(RPMEV_TYPE_CHECK,  NULL);
  -    ev = rpmevNew(RPMEV_TYPE_FORK,   NULL);
  -    ev = rpmevNew(RPMEV_TYPE_CLEANUP,        NULL);
  -    ev = rpmevNew(RPMEV_TYPE_EMBED,  NULL, NULL);
  -    ev = rpmevNew(RPMEV_TYPE_ASYNC,  NULL);
  -#endif
  -
  -    /* now wait for events to arrive */
  -    ev_run(loop, 0);
  -
  -    /* unloop was called, so exit */
  -
  -    /* Deallocate all events. */
  -    while ((ev = rpmevqGetHead()) != NULL)
  -     ev = rpmevFree(ev);
  -
  -    ev_loop_destroy(loop);
  -
  -    return rc;
  -}
  -
  -/*==============================================================*/
  -#ifdef       NOTYET
  -static eio_req * rpmeioRequest(int reqtype, ...)
  -{
  -    eio_req * req = NULL;
  -    const char * fmt = NULL;
  -    va_list ap;
  -
  -    if (reqtype >= EIO_REQ_TYPE_NUM)
  -     goto exit;
  -
  -    va_start(ap, reqtype);
  -
  -    switch (reqtype) {
  -    case EIO_CUSTOM:
  -     req = eio_custom(execute, pri, cb, data);
  -     break;
  -    case EIO_WD_OPEN:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_wd_open(path, pri, cb, data);
  -     break;
  -    case EIO_WD_CLOSE:
  -     fmt = "%p | %d, %p, %p";
  -     req = eio_wd_close(wd, pri, cb, data);
  -     break;
  -    case EIO_CLOSE:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_close(fd, pri, cb, data);
  -     break;
  -    case EIO_DUP2:
  -     fmt = "%d, %d | %d, %p, %p";
  -     req = eio_dup2(fd, fd2, pri, cb, data);
  -     break;
  -    case EIO_SEEK:
  -     fmt = "%d, %ld, %d | %d, %p, %p";
  -     req = eio_seek(fd, offset, whence, pri, cb, data);
  -     break;
  -    case EIO_READ:
  -     fmt = "%d, %p, %zu | %d, %p, %p";
  -     req = eio_read(fd, buf, length, offset, pri, cb, data);
  -     break;
  -    case EIO_WRITE:
  -     fmt = "%d, %p, %zu | %d, %p, %p";
  -     req = eio_write(fd, buf, length, offset, pri, cb, data);
  -     break;
  -    case EIO_READAHEAD:
  -     fmt = "%d, %lld, %zu | %d, %p, %p";
  -     req = eio_readahead(fd, offset, length, pri, cb, data);
  -     break;
  -    case EIO_SENDFILE:
  -     fmt = "%d, %d, %p, %zu | %d, %p, %p";
  -     req = eio_sendfile(out_fd, in_fd, in_offset, length, pri, cb, data);
  -     break;
  -    case EIO_FSTAT:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_fstat(fd, pri, cb, data);
  -     break;
  -    case EIO_FSTATVFS:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_fstatvfs(fd, pri, cb, data);
  -     break;
  -    case EIO_FTRUNCATE:
  -     fmt = "%d, %ld | %d, %p, %p";
  -     req = eio_ftruncate(fd, offset, pri, cb, data);
  -     break;
  -    case EIO_FUTIME:
  -     fmt = "%d, %f, %f | %d, %p, %p";
  -     req = eio_futime(fd, atime, mtime, pri, cb, data);
  -     break;
  -    case EIO_FCHMOD:
  -     fmt = "%d, %hd | %d, %p, %p";
  -     req = eio_fchmod(fd, mode, pri, cb, data);
  -     break;
  -    case EIO_FCHOWN:
  -     fmt = "%d, %d, %d | %d, %p, %p";
  -     req = eio_fchown(fd, uid, gid, pri, cb, data);
  -     break;
  -    case EIO_SYNC:
  -     fmt = "| %d, %p, %p";
  -     req = eio_sync(pri, cb, data);
  -     break;
  -    case EIO_FSYNC:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_fsync(fd, pri, cb, data);
  -     break;
  -    case EIO_FDATASYNC:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_fdatasync(fd, pri, cb, data);
  -     break;
  -    case EIO_SYNCFS:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_syncfs(fd, pri, cb, data);
  -     break;
  -    case EIO_MSYNC:
  -     fmt = "%p, %zu, %d | %d, %p, %p";
  -     req = eio_msync(addr, length, flags, pri, cb, data);
  -     break;
  -    case EIO_MTOUCH:
  -     fmt = "%p, %zu, %d | %d, %p, %p";
  -     req = eio_mtouch(addr, length, flags, pri, cb, data);
  -     break;
  -    case EIO_SYNC_FILE_RANGE:
  -     fmt = "%p, %lld, %lld, %u | %d, %p, %p";
  -     req = eio_sync_file_range(fd, offset, nbytes, flags, pri, cb, data);
  -     break;
  -    case EIO_FALLOCATE:
  -     fmt = "%p, %d, %ld, %ld | %d, %p, %p";
  -     req = eio_fallocate (fd, mode, offset, len, pri, cb, data);
  -     break;
  -    case EIO_MLOCK:
  -     fmt = "%p, %zu | %d, %p, %p";
  -     req = eio_mlock(addr, length, pri, cb, data);
  -     break;
  -    case EIO_MLOCKALL:
  -     fmt = "%d | %d, %p, %p";
  -     req = eio_mlockall(flags, pri, cb, data);
  -     break;
  -    case EIO_GROUP:
  -     const int pri = EIO_PRI_MAX;    /* XXX */
  -     fmt = "| %p, %p";
  -     req = eio_grp(eio_cb cb, void *data)
  -     break;
  -    case EIO_NOP:
  -     fmt = "| %d, %p, %p";
  -     req = eio_nop(pri,cb, data);
  -     break;
  -    case EIO_BUSY:
  -     fmt = "%f | %d, %p, %p";
  -     req = eio_busy(delay, pri, cb, data);
  -     break;
  -    case EIO_REALPATH:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_realpath(path, pri, cb, data);
  -     break;
  -    case EIO_READDIR:
  -     fmt = "%s, %d | %d, %p, %p";
  -     req = eio_readdir(path, flags, pri, cb, data);
  -     break;
  -    case EIO_OPEN:
  -     fmt = "%s, %d, %d | %d, %p, %p";
  -     req = eio_open(path, flags, mode, pri, cb, data);
  -     break;
  -    case EIO_STAT:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_stat(path, pri, cb, data);
  -     break;
  -    case EIO_LSTAT:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_lstat(path, pri, cb, data);
  -     break;
  -    case EIO_STATVFS:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_statvfs(path, pri, cb, data);
  -     break;
  -    case EIO_TRUNCATE:
  -     fmt = "%s, %ld | %d, %p, %p";
  -     req = eio_truncate(path, offset, pri, cb, data);
  -     break;
  -    case EIO_UTIME:
  -     fmt = "%s, %p, %p | %d, %p, %p";
  -     req = eio_utime(path, atime, mtime, pri, cb, data);
  -     break;
  -    case EIO_CHMOD:
  -     fmt = "%s, %d | %d, %p, %p";
  -     req = eio_chmod(path, mode, pri, cb, data);
  -     break;
  -    case EIO_CHOWN:
  -     fmt = "%s, %d, %d | %d, %p, %p";
  -     req = eio_chown(path, uid, gid, pri, cb, data);
  -     break;
  -    case EIO_UNLINK:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_unlink(path, pri, cb, data);
  -     break;
  -    case EIO_RMDIR:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_rmdir(path, pri, cb, data);
  -     break;
  -    case EIO_MKDIR:
  -     fmt = "%s, %d | %d, %p, %p";
  -     req = eio_mkdir(path, mode, pri, cb, data);
  -     break;
  -    case EIO_RENAME:
  -     fmt = "%s, %s | %d, %p, %p";
  -     req = eio_rename(path, new_path, pri, cb, data);
  -     break;
  -    case EIO_MKNOD:
  -     fmt = "%s, %d, %ld | %d, %p, %p";
  -     req = eio_mknod(path, mode, dev, pri, cb, data);
  -     break;
  -    case EIO_LINK:
  -     fmt = "%s, %s | %d, %p, %p";
  -     req = eio_link(path, new_path, pri, cb, data);
  -     break;
  -    case EIO_SYMLINK:
  -     fmt = "%s, %s | %d, %p, %p";
  -     req = eio_symlink(path, new_path, pri, cb, data);
  -     break;
  -    case EIO_READLINK:
  -     fmt = "%s | %d, %p, %p";
  -     req = eio_readlink(path, pri, cb, data);
  -     break;
  -    default:
  -assert(0);
  -     break;
  -    }
  -
  -    va_end(ap);
  -
  -exit:
  -    return req;
  -}
  -#endif       /* NOTYET */
  -
  -/*==============================================================*/
  -static int doEIO(ARGV_t av, int ac)
  -{
  -    int rc = 0;
  -
  -    rc = rpmeioStart();
  -    if (rc)
  -     goto exit;
  -
  -    do {
  -     /* avoid relative paths yourself(!) */
  -     Eio_mkdir("eio-test-dir", 0777, 0, rpmeioCB, "mkdir");
  -     Eio_nop(0, rpmeioCB, "nop");
  -     rpmeioLoop();
  -
  -     Eio_stat("eio-test-dir", 0, rpmeioCB_stat, "stat");
  -     Eio_lstat("eio-test-dir", 0, rpmeioCB_stat, "stat");
  -     Eio_open("eio-test-dir/eio-test-file", O_RDWR | O_CREAT, 0777, 0,
  -              rpmeioCB_open, "open");
  -     Eio_symlink("test", "eio-test-dir/eio-symlink", 0, rpmeioCB,
  -                 "symlink");
  -     Eio_mknod("eio-test-dir/eio-fifo", S_IFIFO, 0, 0, rpmeioCB, "mknod");
  -     rpmeioLoop();
  -
  -     Eio_utime("eio-test-dir", 12345.678, 23456.789, 0, rpmeioCB,
  -               "utime");
  -     Eio_futime(rpmeioLastFdno, 92345.678, 93456.789, 0, rpmeioCB, "futime");
  -     Eio_chown("eio-test-dir", getuid(), getgid(), 0, rpmeioCB, "chown");
  -     Eio_fchown(rpmeioLastFdno, getuid(), getgid(), 0, rpmeioCB, "fchown");
  -     Eio_fchmod(rpmeioLastFdno, 0723, 0, rpmeioCB, "fchmod");
  -     Eio_readdir("eio-test-dir", 0, 0, rpmeioCB_readdir, "readdir");
  -     Eio_readdir("/nonexistant", 0, 0, rpmeioCB_readdir, "readdir");
  -     Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat");
  -     Eio_write(rpmeioLastFdno, "test\nfail\n", 10, 4, 0, rpmeioCB, "write");
  -     rpmeioLoop();
  -
  -     Eio_read(rpmeioLastFdno, 0, 8, 0, EIO_PRI_DEFAULT, rpmeioCB_read, 
"read");
  -     Eio_readlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "readlink");
  -     rpmeioLoop();
  -
  -     Eio_dup2(1, 2, EIO_PRI_DEFAULT, rpmeioCB, "dup");       // dup stdout 
to stderr
  -     Eio_chmod("eio-test-dir", 0765, 0, rpmeioCB, "chmod");
  -     Eio_ftruncate(rpmeioLastFdno, 9, 0, rpmeioCB, "ftruncate");
  -     Eio_fdatasync(rpmeioLastFdno, 0, rpmeioCB, "fdatasync");
  -     Eio_fsync(rpmeioLastFdno, 0, rpmeioCB, "fsync");
  -     Eio_sync(0, rpmeioCB, "sync");
  -     Eio_busy(0.5, 0, rpmeioCB, "busy");
  -     rpmeioLoop();
  -
  -     Eio_sendfile(1, rpmeioLastFdno, 4, 5, 0, rpmeioCB, "sendfile"); // 
write "test\n" to stdout
  -     Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat");
  -     rpmeioLoop();
  -
  -     Eio_truncate("eio-test-dir/eio-test-file", 6, 0, rpmeioCB,
  -                  "truncate");
  -     Eio_readahead(rpmeioLastFdno, 0, 64, 0, rpmeioCB, "readahead");
  -     rpmeioLoop();
  -
  -     Eio_close(rpmeioLastFdno, 0, rpmeioCB, "close");
  -     Eio_link("eio-test-dir/eio-test-file",
  -              "eio-test-dir/eio-test-file-2", 0, rpmeioCB, "link");
  -     rpmeioLoop();
  -
  -     Eio_rename("eio-test-dir/eio-test-file",
  -                "eio-test-dir/eio-test-file-renamed", 0, rpmeioCB,
  -                "rename");
  -     rpmeioLoop();
  -
  -     Eio_unlink("eio-test-dir/eio-fifo", 0, rpmeioCB, "unlink");
  -     Eio_unlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "unlink");
  -     Eio_unlink("eio-test-dir/eio-test-file-2", 0, rpmeioCB, "unlink");
  -     Eio_unlink("eio-test-dir/eio-test-file-renamed", 0, rpmeioCB,
  -                "unlink");
  -     rpmeioLoop();
  -
  -     Eio_rmdir("eio-test-dir", 0, rpmeioCB, "rmdir");
  -     rpmeioLoop();
  -
  -    } while (0);
  -
  -    rc = 0;  /* XXX */
  -
  -exit:
  -    return rc;
  -}
  -
  -/*==============================================================*/
   #if !defined(POPT_BIT_XOR)
   #define      POPT_BIT_XOR    (POPT_ARG_VAL|POPT_ARGFLAG_XOR)
   #endif
  @@ -1615,13 +1185,11 @@
       if (qname == NULL)
        qname = xstrdup("rpm");
   
  -    switch (6) {
  +    switch (4) {
       case 1:  ec = doSHM(av, ac);     break;
       case 2:  ec = doMSQ(av, ac);     break;
       case 3:  ec = doTIMER(av, ac);   break;
       case 4:  ec = doLAIO(av, ac);    break;
  -    case 5:  ec = doEV(av, ac);      break;
  -    case 6:  ec = doEIO(av, ac);     break;
       }
   
       qname = _free(qname);
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to