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

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   25-May-2017 22:02:13
  Branch: rpm-5_4                          Handle: 2017052520021201

  Modified files:           (Branch: rpm-5_4)
    rpm                     CHANGES
    rpm/rpmio               librpmio.vers msqio.c rpmio.c rpmmsq.h tmq.c
                            xzdio.c

  Log:
    - msqio: add fopencookie wrapper.

  Summary:
    Revision    Changes     Path
    1.3501.2.560+1  -0      rpm/CHANGES
    2.199.2.80  +6  -0      rpm/rpmio/librpmio.vers
    1.1.2.10    +350 -112   rpm/rpmio/msqio.c
    1.230.2.50  +14 -6      rpm/rpmio/rpmio.c
    1.1.2.9     +11 -18     rpm/rpmio/rpmmsq.h
    1.1.2.9     +98 -71     rpm/rpmio/tmq.c
    1.14.4.6    +6  -4      rpm/rpmio/xzdio.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3501.2.559 -r1.3501.2.560 CHANGES
  --- rpm/CHANGES       24 May 2017 06:03:18 -0000      1.3501.2.559
  +++ rpm/CHANGES       25 May 2017 20:02:12 -0000      1.3501.2.560
  @@ -1,4 +1,5 @@
   5.4.17 -> 5.4.18:
  +    - jbj: msqio: add fopencookie wrapper.
       - jbj: msqio: add condvar to get rid of racy timeouts (loopback mode 
only).
       - jbj: msqio: make peace with O_NONBLOCK.
       - jbj: msqio: permit POSIX/SysV message queue coexistence, default is 
POSIX.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.199.2.79 -r2.199.2.80 librpmio.vers
  --- rpm/rpmio/librpmio.vers   22 May 2017 13:30:42 -0000      2.199.2.79
  +++ rpm/rpmio/librpmio.vers   25 May 2017 20:02:13 -0000      2.199.2.80
  @@ -598,6 +598,8 @@
       rpmioMcheckCheckAll;
       rpmioMprobe;
       rpmioNewPool;
  +    rpmioOflags;
  +    rpmioOflagsPoptTable;
       rpmioParse;
       rpmioPFree;
       rpmioPipeOutput;
  @@ -734,10 +736,14 @@
       msqio;
       rpmmsqClose;
       rpmmsqCtl;
  +    rpmmsqDeliver;
       rpmmsqDump;
  +    rpmmsqFdopen;
  +    rpmmsqFlush;
       rpmmsqFree;
       rpmmsqNew;
       rpmmsqNotify;
  +    rpmmsqOpen;
       rpmmsqReader;
       rpmmsqRecv;
       rpmmsqSend;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/msqio.c
  ============================================================================
  $ cvs diff -u -r1.1.2.9 -r1.1.2.10 msqio.c
  --- rpm/rpmio/msqio.c 24 May 2017 06:03:18 -0000      1.1.2.9
  +++ rpm/rpmio/msqio.c 25 May 2017 20:02:13 -0000      1.1.2.10
  @@ -28,6 +28,7 @@
   #include "debug.h"
   
   int _rpmmsq_debug;
  +
   #define F_ISSET(_f, _FLAG) ((_f) & RPMMSQ_FLAGS_##_FLAG)
   #define MSQF_ISSET(_FLAG) F_ISSET(msq->flags, _FLAG)
   
  @@ -50,12 +51,204 @@
   GENfree(rpmmsq)
   #endif       /* __cplusplus */
   
  +/* =============================================================== */
  +#if defined(WITH_MQ)
  +static inline
  +mqd_t __mq_open(const char *name, int oflag, mode_t mode,
  +             struct mq_attr *attr)
  +{
  +    rpmmsq msq = NULL;
  +    mqd_t mqdes = mq_open(name, oflag, mode, attr);
  +SPEW((stderr, "<--\t%s(%s,0x%x,0%o,%p) qid %d\n", "mq_open", name, oflag, 
mode, attr, mqdes));
  +    return mqdes;
  +}
  +
  +static inline
  +int __mq_notify(mqd_t mqdes, const struct sigevent *sevp)
  +{
  +    rpmmsq msq = NULL;
  +    int rc = mq_notify(mqdes, sevp);
  +SPEW((stderr, "<--\t%s(0x%x,%p) rc %d\n", "mq_notify", mqdes, sevp, rc));
  +    return rc;
  +}
  +
  +static inline
  +int __mq_send(mqd_t mqdes, const char *msg_ptr,
  +             size_t msg_len, unsigned int msg_prio)
  +{
  +    rpmmsq msq = NULL;
  +    int ncmax = 32;
  +    int nc = 0;
  +    const char * buf = msg_ptr;
  +    size_t count = msg_len;
  +    unsigned int prio = msg_prio;
  +    int rc;
  +
  +    rc = mq_send(mqdes, msg_ptr, msg_len, msg_prio);
  +    if (rc == 0) {
  +     /* Ensure printable. */
  +     for (nc = 0; nc < ncmax; nc++) {
  +         if (nc < (int)count && isprint(buf[nc]))
  +             continue;
  +         break;
  +     }
  +    }
  +SPEW((stderr, "<--\t%s(0x%x,%p[%lu],%u) rc %d\t\t\t\"%.*s\"\n", "mq_send", 
mqdes, buf, (unsigned long)count, prio, rc, nc, buf));
  +    return rc;
  +}
  +
  +static inline
  +ssize_t __mq_receive(mqd_t mqdes, char *msg_ptr,
  +             size_t msg_len, unsigned int *msg_prio)
  +{
  +    rpmmsq msq = NULL;
  +    int ncmax = 32;
  +    int nc = 0;
  +    char * buf = msg_ptr;
  +    size_t count = msg_len;
  +    unsigned int *priop = msg_prio;
  +    unsigned int prio = *msg_prio;
  +    ssize_t rc;
  +
  +    rc = mq_receive(mqdes, msg_ptr, msg_len, msg_prio);
  +    if (rc >= 0) {
  +     /* Ensure printable. */
  +     for (nc = 0; nc < ncmax; nc++) {
  +         if (nc < rc && isprint(buf[nc]))
  +             continue;
  +         break;
  +     }
  +    }
  +SPEW((stderr, "<--\t%s(0x%x,%p[%lu],%p) rc %ld prio %u\t\"%.*s\"\n", 
"mq_receive", mqdes, buf, (unsigned long)count, priop, (long)rc, prio, nc, 
buf));
  +    return rc;
  +}
  +
  +static inline
  +int __mq_close(mqd_t mqdes)
  +{
  +    rpmmsq msq = NULL;
  +    int rc = mq_close(mqdes);
  +SPEW((stderr, "<--\t%s(0x%x) rc %d\n", "mq_close", mqdes, rc));
  +    return rc;
  +}
  +
  +static inline
  +int __mq_unlink(const char *name)
  +{
  +    rpmmsq msq = NULL;
  +    int rc = mq_unlink(name);
  +SPEW((stderr, "<--\t%s(%s) rc %d\n", "mq_unlink", name, rc));
  +    return rc;
  +}
  +
  +#endif       /* WITH_MQ */
  +
  +/* =============================================================== */
  +#if defined(WITH_MSQ)
  +static inline
  +int __msgget(key_t key, int msgflg)
  +{
  +    rpmmsq msq = NULL;
  +    int rc = msgget(key, msgflg);
  +SPEW((stderr, "<--\t%s(0x%x,0%o) rc %d\n", "msgget", key, msgflg, rc));
  +    return rc;
  +}
  +
  +static inline
  +ssize_t __msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int 
msgflg)
  +{
  +    rpmmsq msq = NULL;
  +    int ncmax = 32;
  +    int nc = 0;
  +    char *buf;
  +    ssize_t rc;
  +
  +    rc = msgrcv(msqid, msgp, msgsz, msgtyp, msgflg);
  +    buf = ((struct msgbuf *)msgp)->mtext;
  +    if (rc >= 0) {
  +     /* Ensure printable. */
  +     for (nc = 0; nc < ncmax; nc++) {
  +         if (nc < rc && isprint(buf[nc]))
  +             continue;
  +         break;
  +     }
  +    }
  +SPEW((stderr, "<--\t%s(0x%x,%p,%lu,%ld,%d) rc %ld\t\"%.*s\"\n", "msqrcv", 
msqid, msgp, (unsigned long)msgsz, msgtyp, msgflg, (long)rc, nc, buf));
  +    return rc;
  +}
  +
  +static inline
  +int __msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
  +{
  +    rpmmsq msq = NULL;
  +    int ncmax = 32;
  +    int nc = 0;
  +    char *buf;
  +    int rc;
  +
  +    rc = msgsnd(msqid, msgp, msgsz, msgflg);
  +    buf = ((struct msgbuf *)msgp)->mtext;
  +    if (rc == 0) {
  +     /* Ensure printable. */
  +     for (nc = 0; nc < ncmax; nc++) {
  +         if (nc < rc && isprint(buf[nc]))
  +             continue;
  +         break;
  +     }
  +    }
  +SPEW((stderr, "<--\t%s(0x%x,%p,%lu,%d) rc %d\t\t\"%.*s\"\n", "msqsnd", 
msqid, msgp, (unsigned long)msgsz, msgflg, rc, nc, buf));
  +    return rc;
  +}
  +
  +static inline
  +int __msgctl(int msqid, int cmd, struct msqid_ds *buf)
  +{
  +    rpmmsq msq = NULL;
  +    int rc = msgctl(msqid, cmd, buf);
  +SPEW((stderr, "<--\t%s(0x%x,%d,%p) rc %d\n", "msqctl", msqid, cmd, buf, rc));
  +    return rc;
  +}
  +#endif       /* WITH_MSQ */
  +
  +/* =============================================================== */
  +static void prtMSQ(const char * msg, rpmmsq msq, int stats)
  +{
  +    FILE *fp = stderr;
  +
  +    if (msg)         fprintf(fp, "==================== %s(%p)\n", msg, msq);
  +    if (msq) {
  +#define PRINT(_fmt, _foo) fprintf(fp, "%19s: %"#_fmt"\n", #_foo, msq->_foo)
  +     PRINT(s, qname);
  +     PRINT(s, fmode);
  +     PRINT(d, fdno);
  +     PRINT(x, flags);
  +     PRINT(x, qid);
  +     PRINT(x, oflags);
  +     PRINT(0o, omode);
  +     PRINT(x, key);
  +     PRINT(ld, mtype);
  +     if (msq->tid) {
  +         PRINT(lx, tid);
  +         PRINT(d, ntimeout);
  +         PRINT(d, nagain);
  +     }
  +     if (stats) {
  +         PRINT(d, nsent);
  +         PRINT(d, nrecv);
  +     }
  +#undef       PRINT
  +    }
  +}
  +
  +/* =============================================================== */
   static void rpmmsqFini(void *_msq)
   {
       rpmmsq msq = (rpmmsq) _msq;
       if (msq) {
        msq->flags = 0;
        msq->qname = _free(msq->qname);
  +     msq->fmode = _free(msq->fmode);
  +     msq->fdno = -1;
        msq->qid = -1;
        msq->oflags = 0;
        msq->omode = 0;
  @@ -66,7 +259,6 @@
        INIT(msq->c, msq->m);
        msq->ntimeout = 0;
        msq->nagain = 0;
  -     msq->nwait = 0;
        msq->nsent = 0;
        msq->nrecv = 0;
       }
  @@ -168,13 +360,27 @@
        break;
       }
   
  +    msq->fmode = xstrdup(fmode);
  +    msq->fdno = fdno;
  +    msq->flags = flags;
  +
  +    msq->qid = -1;
  +    msq->oflags = oflags;
  +    msq->omode = omode & 0777;       /* XXX mask IPC_CREAT | IPC_EXCL */
  +    msq->mtype = getpid();   /* XXX SysV message queues only. */
  +
  +    /* XXX TODO: merge the rpmsqFdopen path. */
  +    if (path == NULL && fdno != -1) {                /* rpmmsqFdopen */
  +     path = "/rpm";  /* XXX */
  +    }
  +
       msq->qname = rpmGetPath("/", path, NULL);
   
       key_t key = 0;
       if (!strcmp(msq->qname, "/private")
        || !strcmp(msq->qname, "/IPC_PRIVATE")) {
        key = IPC_PRIVATE;
  -     flags |= RPMMSQ_FLAGS_DELETE;   /* XXX delete on close. */
  +     msq->flags |= RPMMSQ_FLAGS_DELETE;      /* XXX delete on close. */
       } else
       if (!strcmp(msq->qname, "/program")
        || !strcmp(msq->qname, "/__progname_key")) {
  @@ -195,31 +401,22 @@
       }
       msq->key = key;
   
  -    msq->flags = flags;
  -    msq->qid = -1;
  -    msq->oflags = oflags;
  -    msq->omode = omode & 0777;       /* XXX mask IPC_CREAT | IPC_EXCL */
  -    msq->mtype = getpid();   /* XXX SysV message queues only. */
  -
  -    /* Reset the queue by removing. */
  -    if (MSQF_ISSET(RESET))
  +    /* rpmmsqOpen: Reset the queue by removing. */
  +    if (fdno == -1 && MSQF_ISSET(RESET))
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
  -     int xx = mq_unlink(msq->qname);
  -SPEW((stderr, "<--\t%s(%s) rc %d (%s)\n", "mq_unlink", msq->qname, xx, 
__FUNCTION__));
  +     (void) __mq_unlink(msq->qname);
   #endif       /* WITH_MQ */
       }        break;
       case RPMMSQ_TYPE_SYSV:
       {
   #if defined(WITH_MSQ)
  -     int qid = msgget(msq->key, (omode & 0777));
  +     int qid = __msgget(msq->key, (omode & 0777));
        if (qid != -1) {
  -         int cmd = IPC_RMID;
  -         int xx = msgctl(qid, cmd, NULL);
  -SPEW((stderr, "<--\t%s(0x%x,%d,%p) rc %d (%s)\n", "msqctl", qid, cmd, NULL, 
xx, __FUNCTION__));
  +         (void) __msgctl(qid, IPC_RMID, NULL);
        }
   #endif       /* WITH_MSQ */
       }        break;
  @@ -227,19 +424,23 @@
        break;
       }
   
  +    /* Set the QID. */
  +    if (fdno != -1) {
  +     msq->qid = fdno;
  +    } else
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
  +     /* XXX TODO: configure non-default settings. */
        struct mq_attr _attrs = {
            .mq_flags = (oflags & O_NONBLOCK),
            .mq_maxmsg = 10,    /* /proc/sys/fs/mqueue/msg_default */
            .mq_msgsize = 8192, /* /proc/sys/fs/mqueue/msgsize_default */
            .mq_curmsgs = 0,
        }, *attrs = &_attrs;
  -     msq->qid = mq_open(msq->qname, msq->oflags, msq->omode, attrs);
  -SPEW((stderr, "<--\t%s(%s,0x%x,0%o,%p) qid %d\n", "mq_open", msq->qname, 
msq->oflags, msq->omode, attrs, msq->qid));
  +     msq->qid = __mq_open(msq->qname, msq->oflags, msq->omode, attrs);
   
        /* (loopback mode) Configure the detached reader. */
        msq->tid = 0;
  @@ -263,8 +464,7 @@
       case RPMMSQ_TYPE_SYSV:
       {
   #if defined(WITH_MSQ)
  -     msq->qid = msgget(msq->key, omode);
  -SPEW((stderr, "<--\t%s(0x%x,0%o) qid %d\n", "msqget", msq->key, omode, 
msq->qid));
  +     msq->qid = __msgget(msq->key, omode);
   #endif       /* WITH_MSQ */
       }        break;
       default:
  @@ -276,11 +476,12 @@
       return rpmmsqLink(msq);
   }
   
  -ssize_t rpmmsqRecv(rpmmsq msq, char * buf, size_t count, unsigned short 
*priop)
  +/* =============================================================== */
  +ssize_t rpmmsqRecv(rpmmsq msq, char * buf, size_t count, unsigned long 
*priop)
   {
       ssize_t rc = -1; /* assume failure */
   
  -    if (msq) /* XXX WTF? */
  +    if (msq)
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
  @@ -289,15 +490,13 @@
        if (MSQF_ISSET(LOOP)) return 0; /* XXX EOF with loopback service. */
   
        unsigned int prio = 0;
  -     int nb = 0;
  -     rc = mq_receive(msq->qid, buf, count, &prio);
  +
  +     rc = __mq_receive(msq->qid, buf, count, &prio);
        if (rc >= 0) {
  -         nb = rc;
            msq->nrecv++;
  +         if (priop)
  +             *priop = prio;
        }
  -SPEW((stderr, "<--\t%s(0x%x,%p[%lu],%p) rc %ld prio %u\t\"%.*s\"\n", 
"mq_receive", msq->qid, buf, (unsigned long)count, priop, (long)rc, prio, nb, 
buf));
  -     if (priop)
  -         *priop = prio;
   #endif       /* WITH_MQ */
       }        break;
   
  @@ -307,17 +506,16 @@
        struct msgbuf * msgp = xmalloc(sizeof(*msgp) + count);
        size_t msgsz = count;
        long msgtyp = msq->mtype;
  -     int msgflg = 0;
  -     int nb = 0;
  +     int msgflg = 0; /* IPC_NOWAIT, MSG_COPY, MSG_EXCEPT, MSG_NOERROR */
   
  -     rc = msgrcv(msq->qid, msgp, msgsz, msgtyp, msgflg);
  +     rc = __msgrcv(msq->qid, msgp, msgsz, msgtyp, msgflg);
        if (rc >= 0) {
  +         msq->nrecv++;
  +         if (priop)
  +             *priop = msgp->mtype;
            if (rc > 0)
                memcpy(buf, msgp->mtext, rc);
  -         nb = rc;
  -         msq->nrecv++;
        }
  -SPEW((stderr, "<--\t%s(0x%x,%p,%lu,%ld,%d) rc %ld\t\"%.*s\"\n", "msqrcv", 
msq->qid, msgp, (unsigned long)msgsz, (long)msgtyp, msgflg, (long)rc, nb, buf));
        msgp = _free(msgp);
   #endif       /* WITH_MSQ */
       }        break;
  @@ -325,35 +523,33 @@
        break;
       }
   
  -SPEW((stderr, "<== %s(%p,%p[%lu],%p) qid %d rc %ld *priop %u\n", 
__FUNCTION__, msq, buf, count, priop, (msq ? msq->qid : -1), rc, (priop ? 
*priop : 0)));
  +SPEW((stderr, "<== %s(%p,%p[%lu],%p) qid %d rc %ld *priop %lu\n", 
__FUNCTION__, msq, buf, count, priop, (msq ? msq->qid : -1), rc, (priop ? 
*priop : 0)));
       return rc;
   }
   
  -ssize_t rpmmsqSend(rpmmsq msq, const char * buf, size_t count, unsigned 
short prio)
  +ssize_t rpmmsqSend(rpmmsq msq, const char * buf, size_t count, unsigned long 
prio)
   {
       ssize_t rc = -1; /* assume failure */
   
  -    if (msq) /* XXX WTF? */
  +    if (msq)
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
  +     rc = __mq_send(msq->qid, buf, count, prio);
  +     if (rc == 0) {
  +         msq->nsent++;
   
  -     rc = mq_send(msq->qid, buf, count, prio);
  -     msq->nsent++;
  -
  -     /* (loopback mode) Wait for rpmmsqReader to start up. */
  -     if (MSQF_ISSET(LOOP)) {
  -         LOCK(msq->m);
  -         while (msq->nsent > msq->nrecv)
  -             WAIT(msq->c, msq->m);
  -         UNLOCK(msq->m);
  +         /* (loopback mode) Wait for rpmmsqReader to start up. */
  +         if (MSQF_ISSET(LOOP)) {
  +             LOCK(msq->m);
  +             while (msq->nsent > msq->nrecv)
  +                 WAIT(msq->c, msq->m);
  +             UNLOCK(msq->m);
  +         }
        }
   
  -     int nb = (rc == 0 ? count : 0);
  -SPEW((stderr, "<--\t%s(0x%x,%p[%lu],%u) rc %ld\t\t\t\"%.*s\"\n", "mq_send", 
msq->qid, buf, (unsigned long)count, prio, (long)rc, nb, buf));
  -
        if (rc == 0)    /* XXX remap to write(2) return */
            rc = count;
   #endif       /* WITH_MQ */
  @@ -368,21 +564,21 @@
        msgp->mtype = msq->mtype;
        if (count)
            memcpy(msgp->mtext, buf, count);
  -     rc = msgsnd(msq->qid, msgp, msgsz, msgflg);
  -     int nb = (rc == 0 ? count : 0);
  -SPEW((stderr, "<--\t%s(0x%x,%p,%lu,%d) rc %ld\t\t\"%.*s\"\n", "msqsnd", 
msq->qid, msgp, (unsigned long)msgsz, msgflg, (long)rc, nb, buf));
  -     msgp = _free(msgp);
  -     if (rc == 0) {  /* XXX remap to write(2) return */
  -         rc = count;
  +     rc = __msgsnd(msq->qid, msgp, msgsz, msgflg);
  +     if (rc == 0) {
            msq->nsent++;
        }
  +
  +     msgp = _free(msgp);
  +     if (rc == 0)    /* XXX remap to write(2) return */
  +         rc = count;
   #endif       /* WITH_MSQ */
       }        break;
       default:
        break;
       }
   
  -SPEW((stderr, "<== %s(%p,%p[%lu],%u) qid %d rc %ld\n", __FUNCTION__, msq, 
buf, count, prio, (msq ? msq->qid : -1), rc));
  +SPEW((stderr, "<== %s(%p,%p[%lu],%lu) qid %d rc %ld\n", __FUNCTION__, msq, 
buf, count, prio, (msq ? msq->qid : -1), rc));
       return rc;
   }
   
  @@ -398,40 +594,37 @@
   {
       int rc = -2;     /* assume failure */
   
  -    if (msq) /* XXX WTF? */
  +SPEW((stderr, "==> %s(%p,%d) qid %d\n", __FUNCTION__, msq, delete, (msq ? 
msq->qid : -1)));
  +    if (msq)
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
  -     int prio = RPMMSQ_PRIO_EXIT;
  -
  -     rc = mq_send(msq->qid, __FUNCTION__, sizeof(__FUNCTION__)-1, prio);
  -     msq->nsent++;
   
        /* (loopback mode) Terminate rpmmsqReader. */
  -     if (MSQF_ISSET(LOOP)) {
  +     if (msq->qid != -1 && MSQF_ISSET(LOOP)) {
  +         int prio = RPMMSQ_PRIO_EXIT;
  +         rc = __mq_send(msq->qid, __FUNCTION__, sizeof(__FUNCTION__)-1, 
prio);
  +         msq->nsent++;
            LOCK(msq->m);
            while (msq->nsent > msq->nrecv)
                WAIT(msq->c, msq->m);
            UNLOCK(msq->m);
  +         /* Turn off the sigev detached thread. */
  +         rc = rpmmsqNotify(msq, NULL);
        }
   
  -SPEW((stderr, "<--\t%s(0x%x,\"%s\",%u) rc %ld\n", "mq_send", msq->qid, 
__FUNCTION__, prio, (long)rc));
  -
  -     /* (loopback mode) Turn off the sigev detached thread. */
  -     rc = rpmmsqNotify(msq, NULL);
  -
  -SPEW((stderr, "%s: sent %d recv %d wait %d timeout %d again %d\n", 
__FUNCTION__, msq->nsent, msq->nrecv, msq->nwait, msq->ntimeout, msq->nagain));
  +if (msq->qid != -1)
  +SPEW((stderr, "%s: sent %d recv %d timeout %d again %d\n", __FUNCTION__, 
msq->nsent, msq->nrecv, msq->ntimeout, msq->nagain));
   
  -     if (_rpmmsq_debug || MSQF_ISSET(INFO))
  -         rpmmsqDump(__FUNCTION__, msq, NULL);
  -     rc = mq_close(msq->qid);
  -SPEW((stderr, "<--\t%s(0x%x) rc %d\n", "mq_close", msq->qid, rc));
  -     if (!rc && (delete || MSQF_ISSET(DELETE))) {
  -         rc = mq_unlink(msq->qname);         /* XXX rpmmsqReset? */
  -SPEW((stderr, "<--\t%s(%s) rc %d (%s)\n", "mq_unlink", msq->qname, rc, 
__FUNCTION__));
  +     if (msq->qid != -1) {
  +         if (MSQF_ISSET(INFO) || _rpmmsq_debug)
  +             rpmmsqDump(NULL, msq, NULL);
  +         rc = __mq_close(msq->qid);
        }
  +     if (!rc && (delete || MSQF_ISSET(DELETE)))
  +         rc = __mq_unlink(msq->qname);               /* XXX rpmmsqReset? */
        rpmmsqFini(msq);
        rc = 0; /* XXX */
   #endif       /* WITH_MQ */
  @@ -442,11 +635,8 @@
   #if defined(WITH_MSQ)
        if (_rpmmsq_debug || MSQF_ISSET(INFO))
            rpmmsqDump(__FUNCTION__, msq, NULL);
  -     if (delete || MSQF_ISSET(DELETE)) {
  -         int cmd = IPC_RMID;
  -         rc = msgctl(msq->qid, cmd, NULL);
  -SPEW((stderr, "<--\t%s(0x%x,%d,%p) rc %d (%s)\n", "msqctl", msq->qid, cmd, 
NULL, rc, __FUNCTION__));
  -     }
  +     if (delete || MSQF_ISSET(DELETE))
  +         rc = __msgctl(msq->qid, IPC_RMID, NULL);
        rpmmsqFini(msq);
        rc = 0; /* XXX */
   #endif       /* WITH_MSQ */
  @@ -458,26 +648,28 @@
       return rc;
   }
   
  -static rpmmsq rpmmsqOpen(const char * path, const char * fmode)
  +rpmmsq rpmmsqOpen(const char * path, const char * fmode)
   {
       rpmmsq msq = NULL;
  +if (strchr(fmode, '?') || _rpmmsq_debug || _rpmio_debug)
   fprintf(stderr, "==> %s(%s,%s)\n", __FUNCTION__, path, fmode);
       msq = rpmmsqNew(path, fmode, -1, 0);
   SPEW((stderr, "<== %s(%s,%s) qid %d\n", __FUNCTION__, path, fmode, (msq ? 
msq->qid : -1)));
       return msq;
   }
   
  -static rpmmsq rpmmsqFdopen(void * _fdno, const char * fmode)
  +rpmmsq rpmmsqFdopen(void * _fdno, const char * fmode)
   {
       rpmmsq msq = NULL;
       int fdno = (int)((long)_fdno);   /* XXX hack */
  +if (strchr(fmode, '?') || _rpmmsq_debug || _rpmio_debug)
   fprintf(stderr, "==> %s(%d,%s)\n", __FUNCTION__, fdno, fmode);
       msq = rpmmsqNew(NULL, fmode, fdno, 0);
   SPEW((stderr, "<== %s(%d,%s) qid %d\n", __FUNCTION__, fdno, fmode, (msq ? 
msq->qid : -1)));
       return msq;
   }
   
  -static int rpmmsqFlush(void * _msq)
  +int rpmmsqFlush(void * _msq)
   {
       int rc = -2;     /* assume failure */
       rpmmsq msq = (rpmmsq) _msq;
  @@ -486,12 +678,13 @@
       return rc;
   }
   
  +/* =============================================================== */
   int rpmmsqCtl(void * _msq, int cmd, void *buf)
   {
       rpmmsq msq = (rpmmsq) _msq;
       int rc = -2;     /* assume failure */
   
  -    if (msq) /* XXX WTF? */
  +    if (msq)
       switch (msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
  @@ -521,10 +714,9 @@
        case IPC_STAT:
        case IPC_SET:
        case IPC_RMID:
  -         rc = msgctl(msq->qid, cmd, buf);
  +         rc = __msgctl(msq->qid, cmd, buf);
            break;
        }
  -SPEW((stderr, "<--\t%s(0x%x,%d,%p) rc %d\n", "msqctl", (unsigned)msq->qid, 
cmd, buf, rc));
   #endif       /* WITH_MSQ */
       }        break;
       default:
  @@ -539,14 +731,13 @@
   {
       int rc = -2;     /* assume failure */
   
  -    if (msq) /* XXX WTF? */
  +    if (msq)
       switch(msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
  -     rc = mq_notify(msq->qid, _sevp);
  -SPEW((stderr, "<--\t%s(0x%x,%p) rc %d\n", "mq_notify", msq->qid, _sevp, rc));
  +     rc = __mq_notify(msq->qid, _sevp);
   #endif       /* WITH_MQ */
       }        break;
   
  @@ -561,11 +752,21 @@
       return rc;
   }
   
  +int rpmmsqDeliver(rpmmsq msq, char *b, size_t nb, unsigned long prio)
  +{
  +    int rc = -2;     /* assume failure */
  +
  +    rc = 0;
  +
  +SPEW((stderr, "<== %s(%p,%p[%u],%lu) qid %d rc %d\n", __FUNCTION__, msq, b, 
(unsigned)nb, prio, (msq ? msq->qid : -1), rc));
  +
  +    return rc;
  +}
  +
   void rpmmsqReader(union sigval sv)
   {
   #if defined(WITH_MQ)
       rpmmsq msq = (rpmmsq) sv.sival_ptr;
  -
   assert(msq = rpmmsqLink(msq));
   
   SPEW((stderr, "==> %s(%p) qid %d tid %ld\n", __FUNCTION__, msq, msq->qid, 
msq->tid));
  @@ -574,7 +775,9 @@
       int rc;
   
       while (1) {
  -     unsigned prio = 0;
  +     int ncmax = 32;         /* max chars to print. */
  +     int nc = 0;             /* chars to print */
  +     unsigned int prio = 0;
        int rc;
   
        while (1) {
  @@ -585,10 +788,11 @@
                Z(nanosleep(&ts, NULL));
            }
   
  -         rc = mq_receive(msq->qid, b, nb, &prio);
  +         /* Loop on errors. */
  +         rc = __mq_receive(msq->qid, b, nb, &prio);
            if (rc < 0)
            switch (errno) {
  -         case ETIMEDOUT:
  +         case ETIMEDOUT:     /* XXX mq_timedreceive() */
                msq->ntimeout++;
                continue;
            case EAGAIN:        /* XXX O_NONBLOCK */
  @@ -598,23 +802,27 @@
            break;
        }
   
  +     if (rc >= 0) {
  +         msq->nrecv++;
  +         /* Ensure printable. */
  +         for (nc = 0; nc < ncmax; nc++) {
  +             if (nc < rc && isprint(b[nc]))
  +                 continue;
  +             break;
  +         }
  +     }
  +
        LOCK(msq->m);
  -     msq->nrecv++;
        SIGNAL(msq->c);
        UNLOCK(msq->m);
   
  -     int nr = (rc >= 0 ? rc : 0);
  -SPEW((stderr, "<--\t%s(0x%x,%p[%lu]) rc %d prio %u\t\"%.*s\"\n", 
"mq_receive", msq->qid, b, (unsigned long)nb, rc, prio, nr, b));
  -
  -     /* Exit immediately on error. */
  -     if (rc < 0) {
  -         fprintf(stderr, "*** %s: error exit(%d): %m\n", __FUNCTION__, 
errno);
  -         break;
  -     }
  -
  -     /* Exit on highest priority message. */
  +     /* Exit immediately on highest priority message. */
        if (prio == RPMMSQ_PRIO_EXIT)
            break;
  +
  +     /* Deliver the mssage through a callback. */
  +     int xx = rpmmsqDeliver(msq, b, nb, prio);
  +     (void)xx;
       }
   
   SPEW((stderr, "<== %s(%p) rc %d\n", __FUNCTION__, msq, rc));
  @@ -710,19 +918,23 @@
       if (fp == NULL)  fp = stderr;
       if (msg)         fprintf(fp, "================ %s\n", msg);
   
  -    if (msq) /* XXX WTF? */
  +    if (msq)
       switch(msq->flags & RPMMSQ_TYPE_MASK) {
       case RPMMSQ_TYPE_DEFAULT:
       case RPMMSQ_TYPE_POSIX:
       {
   #if defined(WITH_MQ)
   #if defined(__linux__)
  +     /* XXX DELETE: don't bother if buggy. */
  +     if (!(msq->qid != -1 && msq->qname && *msq->qname))
  +         break;
  +
        const char * lpath = rpmGetPath("/dev/mqueue/", msq->qname, NULL);
        struct stat sb;
   
        rc = Stat(lpath, &sb);
        if (!rc)
  -         rpmmsqDumpST(NULL, &sb, NULL);
  +         rpmmsqDumpST(lpath, &sb, NULL);
   
        /* XXX .fdio avoids select/poll issues on /dev/mqueue with .ufdio. */
        {   FD_t fd = Fopen(lpath, "r.fdio");
  @@ -791,7 +1003,7 @@
   
       if (msq == NULL)
        return NULL;
  -    fd = fdNew("open (msqOpen)");
  +    fd = fdNew(__FUNCTION__);
   #ifdef       NOTYET
       fdPop(fd); fdPush(fd, msqio, msq, fileno(msq->fp));
   #else
  @@ -801,7 +1013,7 @@
   #if defined(WITH_MQ)
       (void) fdSetFdno(fd, msq->qid);
   #endif
  -    return fdLink(fd, "msqOpen");
  +    return fd;
   }
   
   static FD_t msqFdopen(void * cookie, const char * fmode)
  @@ -812,9 +1024,36 @@
   
       if (msq == NULL)
        return NULL;
  -    (void) fdSetFdno(fd, -1);                /* XXX skip the fdio close */
  +
  +    if (msq)
  +    switch(msq->flags & RPMMSQ_TYPE_MASK) {
  +    case RPMMSQ_TYPE_DEFAULT:
  +    case RPMMSQ_TYPE_POSIX:
  +    {
  +#if defined(WITH_MQ)
  +     fdno = -1;
  +     /* XXX dup(msq->qid) ??? */
  +     if (msq->qid != -1) {
  +         fdno = dup(msq->qid);
  +         msq->qid = fdno;
  +     }
  +#endif       /* WITH_MQ */
  +    }        break;
  +
  +    case RPMMSQ_TYPE_SYSV:
  +    {
  +#if defined(WITH_MSQ)
  +     fdno = -1;
  +#endif       /* WITH_MSQ */
  +    }        break;
  +    default:
  +     /* discard previous msqio? */
  +     fdno = -1;
  +     break;
  +    }
  +
       fdPush(fd, msqio, msq, fdno);            /* Push msqio onto stack */
  -    return fdLink(fd, "msqFdopen");
  +    return fdLink(fd, __FUNCTION__);
   }
   
   RPM_GNUC_PURE
  @@ -888,13 +1127,12 @@
       if (rc >= 0)
        fdstat_exit(fd, FDSTAT_CLOSE, rc);
   
  -DBGIO(fd, (stderr, "==>\tmsqClose(%p) rc %lx %s\n", cookie, (unsigned 
long)rc, fdbg(fd)));
  +DBGIO(fd, (stderr, "<==\tmsqClose(%p) rc %lx %s\n", cookie, (unsigned 
long)rc, fdbg(fd)));
   
       if (_rpmio_debug || rpmIsDebug()) fdstat_print(fd, "MSQIO", stderr);
   
       if (rc == 0) {
        msq = rpmmsqFree(msq);
  -     fd = fdFree(fd, "msqOpen (msqClose)");
        fd = fdFree(fd, "open (msqClose)");
       }
       return rc;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmio.c
  ============================================================================
  $ cvs diff -u -r1.230.2.49 -r1.230.2.50 rpmio.c
  --- rpm/rpmio/rpmio.c 22 May 2017 21:07:19 -0000      1.230.2.49
  +++ rpm/rpmio/rpmio.c 25 May 2017 20:02:13 -0000      1.230.2.50
  @@ -263,7 +263,7 @@
        return NULL;
       }
       fd = fdNew("open (fdDup)");
  -    fdSetOpen(fd, "fdDup", nfdno, 0);        /* XXX bogus */
  +    fdSetOpen(fd, "fdDup", 0, 0);    /* XXX bogus */
       (void) fdSetFdno(fd, nfdno);
   DBGIO(fd, (stderr, "<-- fdDup(%d) fd %p %s\n", fdno, (fd ? fd : NULL), 
fdbg(fd)));
       return fd;
  @@ -2549,8 +2549,11 @@
   {
       int rc = 0, ec = 0;
   
  +    if (fd == NULL)
  +     return -1;
  +
       FDSANE(fd);
  -DBGIO(fd, (stderr, "==> Fclose(%p) %s\n", (fd ? fd : NULL), fdbg(fd)));
  +DBGIO(fd, (stderr, "==> Fclose(%p) %s\n", fd, fdbg(fd)));
   
       fd = fdLink(fd, "Fclose");
       if (fd != NULL)
  @@ -2821,7 +2824,7 @@
   #if defined(WITH_MQ) || defined(WITH_MSQ)
        } else if (!strcmp(end, "msqio")) {
            iof = msqio;
  -         fd = iof->_fdopen(fd, zstdio);
  +         /* XXX already opened in Fopen */
   #endif
        } else if (!strcmp(end, "ufdio")) {
            iof = ufdio;
  @@ -2865,8 +2868,6 @@
            ciof.close = iof->close;
            fp = fopencookie(fd, stdio, ciof);
   DBGIO(fd, (stderr, "<-- fopencookie(%p,\"%s\",*%p) returns fp %p\n", fd, 
stdio, iof, fp));
  -         if (fp && (fd->flags & O_DIRECT))
  -             assert(setvbuf(fp, NULL, _IONBF, 0) == 0);
        }
   #elif defined(HAVE_FUNOPEN)
        {   void * cookie = (void *) fd;
  @@ -2888,6 +2889,10 @@
   #endif       /* _USE_LIBIO */
   
        if (fp) {
  +
  +         if (fd->flags & O_DIRECT)
  +             assert(setvbuf(fp, NULL, _IONBF, 0) == 0);
  +
            /* XXX gzdio/bzdio use fp for private data */
            if (fdGetFp(fd) == NULL)
                fdSetFp(fd, fp);
  @@ -2924,7 +2929,10 @@
   #if defined(WITH_MQ) || defined(WITH_MSQ)
       if (end && !strcmp(end, "msqio")) {
        fd = msqio->_fopen(path, fmode);
  -     fd->flags = flags;
  +     if (fd) {
  +         fd->flags = flags;
  +         fd = Fdopen(fd, fmode);
  +     }
        goto exit;
       } else
   #endif
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmmsq.h
  ============================================================================
  $ cvs diff -u -r1.1.2.8 -r1.1.2.9 rpmmsq.h
  --- rpm/rpmio/rpmmsq.h        24 May 2017 06:03:18 -0000      1.1.2.8
  +++ rpm/rpmio/rpmmsq.h        25 May 2017 20:02:13 -0000      1.1.2.9
  @@ -40,8 +40,10 @@
   #if defined(_RPMMSQ_INTERNAL)
   struct rpmmsq_s {
       struct rpmioItem_s _item;        /*!< usage mutex and pool identifier. */
  -    rpmmsqFlags flags;               /*!< message queue option bits. */
       const char * qname;              /*!> message queue path. */
  +    const char * fmode;
  +    int fdno;
  +    rpmmsqFlags flags;               /*!< message queue option bits. */
       int qid;                 /*!< message queue id. */
       int oflags;                      /*!< message queue open flags. */
       int omode;                       /*!< message queue open mode. */
  @@ -52,7 +54,6 @@
       pthread_mutex_t m;
       int ntimeout;            /*!< LOOP: no. of receive timeouts. */
       int nagain;                      /*!< LOOP: no. of waits (O_NONBLOCK). */
  -    int nwait;                       /*!< LOOP: no. of waits for thread 
change. */
       int nsent;                       /*!< no. messages sent. */
       int nrecv;                       /*!< no. messages received. */
   };
  @@ -89,32 +90,24 @@
   #define      rpmmsqFree(_msq)        \
       ((rpmmsq)rpmioFreePoolItem((rpmioItem)(_msq), __FUNCTION__, __FILE__, 
__LINE__))
   
  -/**
  - */
   rpmmsq rpmmsqNew(const char * path, const char * fmode, int fdno, unsigned 
flags);
   
  -/**
  - */
  -ssize_t rpmmsqRecv(rpmmsq msq, char * buf, size_t count, unsigned short 
*priop);
  +ssize_t rpmmsqRecv(rpmmsq msq, char * buf, size_t count, unsigned long 
*priop);
   
  -/**
  - */
  -ssize_t rpmmsqSend(rpmmsq msq, const char * buf, size_t count, unsigned 
short prio);
  +ssize_t rpmmsqSend(rpmmsq msq, const char * buf, size_t count, unsigned long 
prio);
   
  -/**
  - */
   int rpmmsqClose(rpmmsq msq, int delete);
   
  -/**
  - */
  +rpmmsq rpmmsqOpen(const char * path, const char * fmode);
  +rpmmsq rpmmsqFdopen(void * _fdno, const char * fmode);
  +int rpmmsqFlush(void * _msq);
  +
   int rpmmsqCtl(void * _msq, int cmd, void *buf);
   
  -/**
  - */
   int rpmmsqNotify(rpmmsq msq, const void *_sevp);
   
  -/**
  - */
  +int rpmmsqDeliver(rpmmsq msq, char *b, size_t nb, unsigned long prio);
  +
   void rpmmsqReader(union sigval sv);
   #define      RPMMSQ_PRIO_EXIT        0x7fff
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tmq.c
  ============================================================================
  $ cvs diff -u -r1.1.2.8 -r1.1.2.9 tmq.c
  --- rpm/rpmio/tmq.c   24 May 2017 06:03:18 -0000      1.1.2.8
  +++ rpm/rpmio/tmq.c   25 May 2017 20:02:13 -0000      1.1.2.9
  @@ -47,6 +47,7 @@
   
   static int _debug = 0;
   
  +static const char *qname;
   static rpmmsqFlags flags =
   #ifdef       DYING
        RPMMSQ_FLAGS_DEBUG |
  @@ -59,7 +60,9 @@
   #endif
        0;
   
  -static int priority;
  +static long priority;
  +static int count;
  +static int oflags;
   
   #define SPEW(_list)     if (_rpmmsq_debug || _rpmio_debug) fprintf _list
   
  @@ -120,7 +123,7 @@
   }
   
   /*==============================================================*/
  -static int doSHM(void)
  +static int doSHM(ARGV_t av, int ac)
   {
       FD_t fd = NULL;
       int fdno = -1;
  @@ -247,41 +250,6 @@
   }
   
   /*==============================================================*/
  -static int MsqOpen(const char *path, int msqflg)
  -{
  -    int rc = -2;
  -    const char * lpath = fdSyscallPrePath(__FUNCTION__, path, 1);
  -    key_t key = ftok(lpath, 42);
  -    if (key != -1) {
  -     rc = lpath != NULL
  -         ? msgget(key, msqflg)
  -         : -2;
  -    }
  -    return fdSyscallPostPath(__FUNCTION__, lpath, rc);
  -}
  -
  -static int Msqctl(int msqid, int cmd, struct msqid_ds *buf)
  -{
  -    int rc = msgctl(msqid, cmd, buf);
  -fprintf(stderr, "<-- %s(%d,%d,%p) rc %d\n", __FUNCTION__, msqid, cmd, buf, 
rc);
  -    return rc;
  -}
  -
  -static int Msqrcv(int msqid, void *msqp, size_t msqsz, long msqtyp, int 
msqflg)
  -{
  -    int rc = msgrcv(msqid, msqp, msqsz, msqtyp, msqflg);
  -fprintf(stderr, "<-- %s(%d,%p,%lu,%ld,%d) rc %d\n", __FUNCTION__, msqid, 
msqp, (unsigned long)msqsz, (long)msqtyp, msqflg, rc);
  -    return rc;
  -}
  -
  -static int Msqsnd(int msqid, const void *msqp, size_t msqsz, long msqtyp, 
int msqflg)
  -{
  -    int rc = msgsnd(msqid, msqp, msqsz, msqflg);
  -fprintf(stderr, "<-- %s(%d,%p,%lu,%d) rc %d\n", __FUNCTION__, msqid, msqp, 
(unsigned long)msqsz, msqflg, rc);
  -    return rc;
  -}
  -
  -/*==============================================================*/
   
   #define      SECS    1
   #define      TICKS   5
  @@ -319,7 +287,7 @@
   }
   
   static int
  -doTIMER(void)
  +doTIMER(ARGV_t av, int ac)
   {
       struct AT_s _at = {
        .secs = SECS,
  @@ -357,7 +325,7 @@
   }
   
   /*==============================================================*/
  -static int doMSQ(void)
  +static int doMSQ(ARGV_t av, int ac)
   {
       int rc = -2;     /* assume failure */
       char b[BUFSIZ];
  @@ -365,8 +333,40 @@
       size_t blen;
       int xx;
   
  -    const char *qname = "/rpm";;
  -    rpmmsq msq = rpmmsqNew(qname, "w+S?", -1, flags);
  +    (void)b;
  +    (void)nb;
  +    (void)blen;
  +
  +#define F_ISSET(_f, _FLAG) ((_f) & RPMMSQ_FLAGS_##_FLAG)
  +    char fmode[64];
  +    char * te = fmode;
  +    te = stpcpy(te, "w+");
  +    switch (flags & RPMMSQ_TYPE_MASK) {
  +    default:
  +    case RPMMSQ_TYPE_DEFAULT:                        break;
  +    case RPMMSQ_TYPE_POSIX:  *te++ = 'P';    break;
  +    case RPMMSQ_TYPE_SYSV:   *te++ = 'S';    break;
  +    }
  +    if (F_ISSET(flags, RESET))       *te++ = 'R';
  +    if (F_ISSET(flags, INFO))        *te++ = 'I';
  +    if (F_ISSET(flags, DELETE))      *te++ = 'D';
  +    if (F_ISSET(flags, LOOP))        *te++ = 'l';
  +    if (oflags & O_CLOEXEC)  *te++ = 'e';
  +    if (oflags & O_NONBLOCK) *te++ = 'n';
  +    if (oflags & O_TRUNC)    *te++ = 't';
  +    if (oflags & O_EXCL)     *te++ = 'x';
  +#ifdef       NOTYET
  +    if (oflags & O_DIRECT)   *te++ = 'D';
  +#endif
  +    if (oflags & O_SYNC)     *te++ = 'S';
  +    if (oflags & O_TMPFILE)  *te++ = 'T';
  +    if (_debug)                      *te++ = '?';
  +    te = stpcpy(te, ".msqio");
  +    *te = '\0';
  +#undef       F_ISSET
  +
  +#ifdef       DISABLE
  +    rpmmsq msq = rpmmsqNew(qname, fmode, -1, flags);
   
       memset(b, 0, nb);
       if (msq) {
  @@ -384,7 +384,7 @@
        memset(b, 0, nb);
        xx = rpmmsqRecv(msq, b, nb, NULL);
   
  -     for (int i = 0; i < 1000; i++) {
  +     for (int i = 0; i < count; i++) {
            snprintf(b, nb, "%d", i);
            blen = strlen(b);
            xx = rpmmsqSend(msq, b, blen, priority);
  @@ -395,32 +395,38 @@
   
       xx = rpmmsqClose(msq, 0);
       msq = rpmmsqFree(msq);
  +#endif       /* DISABLE */
   
  -    FD_t fd = Fopen(qname, "w+lP?.msqio");
  +    FD_t fd = Fopen(qname, fmode);
       if (fd) {
  +
        strcpy(b, "foo bar baz");
        blen = strlen(b);
        xx = Fwrite(b, 1, blen, fd);
        memset(b, 0, blen);
  -     xx = Fread(b, 1, nb, fd);
  +     xx = Fread(b, 1, blen, fd);
  +
  +     xx = Fileno(fd);
  +if (_rpmio_debug)
  +fprintf(stderr, "<== Fileno(%p) rc %d\n", fd, xx);
  +     xx = Fflush(fd);
  +     xx = Ferror(fd);
  +
        strcpy(b, "blah blah blah");
        blen = strlen(b);
        xx = Fwrite(b, 1, blen, fd);
        memset(b, 0, blen);
  -     xx = Fread(b, 1, nb, fd);
  +     xx = Fread(b, 1, blen, fd);
   
  -     for (int i = 0; i < 1000; i++) {
  +     for (int i = 0; i < count; i++) {
            snprintf(b, nb, "%d", i);
            blen = strlen(b);
            xx = Fwrite(b, 1, blen, fd);
  +         memset(b, 0, blen);
  +         xx = Fread(b, 1, blen, fd);
        }
   
   #ifdef       DISABLE
  -     xx = Fflush(fd);
  -     xx = Fileno(fd);
  -if (_rpmio_debug)
  -fprintf(stderr, "<== Fileno(%p) rc %d\n", fd, xx);
  -     xx = Ferror(fd);
   #ifdef       NOTYET
        xx = Feof(fd);
        xx = Clearerr(fd);
  @@ -431,7 +437,17 @@
        fpos_t pos = {};
        xx = Fgetpos(fd, &pos);
        xx = Fsetpos(fd, &pos);
  -#endif
  +
  +     FD_t nfd = Fdopen(fd, fmode);
  +     if (nfd) {
  +         strcpy(b, "foo bar baz");
  +         blen = strlen(b);
  +         xx = Fwrite(b, 1, blen, nfd);
  +         memset(b, 0, blen);
  +         xx = Fread(b, 1, nb, nfd);
  +         xx = Fclose(nfd);
  +     }
  +#endif       /* DISABLE */
   
        xx = Fclose(fd);
       } else
  @@ -452,24 +468,32 @@
    { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,       &_debug, 1,
        NULL, NULL },
   
  - { "delete", 'D', POPT_BIT_XOR|POPT_ARGFLAG_TOGGLE, &flags, _MSQBIT(DELETE),
  -     N_("remove queue after closing"), NULL },
  - { "info", 'I', POPT_BIT_XOR|POPT_ARGFLAG_TOGGLE,   &flags, _MSQBIT(INFO),
  -     N_("display queue info on close"), NULL },
  - { "loop", 'l', POPT_BIT_XOR|POPT_ARGFLAG_TOGGLE,   &flags, _MSQBIT(LOOP),
  -     N_("toggle mq_notify running"), NULL },
  - { "priority", 'p', POPT_ARG_INT,                &priority, 0,
  -     N_("send message <priority>"), N_("<priority>") },
  - { "reset", 'R', POPT_BIT_XOR|POPT_ARGFLAG_TOGGLE,  &flags, _MSQBIT(RESET),
  -     N_("remove queue before opening"), NULL },
  -
  + { "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 },
  +     N_("Use POSIX message queues"), NULL },
    { "sysv", 'S', POPT_BIT_SET,                       &flags, _MSQBIT(SYSV),
  -     N_("use SysV message queues"), NULL },
  +     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 },
  + { "loopback", 'l', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE,&flags, _MSQBIT(LOOP),
  +     N_("Read messages after sending"), 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") },
  +
  + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioOflagsPoptTable, 0,
  +     N_("Open(2) flags:"), NULL },
   
    { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0,
  -     N_(" Common options for all rpmio executables:"), NULL },
  +     N_("Common options for all rpmio executables:"), NULL },
   
     POPT_AUTOALIAS
     POPT_AUTOHELP
  @@ -481,18 +505,21 @@
   main(int argc, char *argv[])
   {
       poptContext con = rpmioInit(argc, argv, rpmmqOptionsTable);
  -#ifdef       NOTYET
       ARGV_t av = poptGetArgs(con);
       int ac = argvCount(av);;
  -#endif
       int ec = 0;
   
  +    oflags = rpmioOflags;
  +    if (qname == NULL)
  +     qname = xstrdup("rpm");
  +
       switch (2) {
  -    case 1:  ec = doSHM();           break;
  -    case 2:  ec = doMSQ();           break;
  -    case 3:  ec = doTIMER();         break;
  +    case 1:  ec = doSHM(av, ac);     break;
  +    case 2:  ec = doMSQ(av, ac);     break;
  +    case 3:  ec = doTIMER(av, ac);   break;
       }
   
  +    qname = _free(qname);
       con = rpmioFini(con);
   
       return ec;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/xzdio.c
  ============================================================================
  $ cvs diff -u -r1.14.4.5 -r1.14.4.6 xzdio.c
  --- rpm/rpmio/xzdio.c 20 May 2017 13:42:51 -0000      1.14.4.5
  +++ rpm/rpmio/xzdio.c 25 May 2017 20:02:13 -0000      1.14.4.6
  @@ -246,14 +246,15 @@
   static FD_t lzdOpen(const char * path, const char * fmode)
   {
       FD_t fd;
  -    mode_t mode = (fmode && fmode[0] == 'w' ? O_WRONLY : O_RDONLY);
  +    int oflags = (fmode && fmode[0] == 'w' ? O_WRONLY : O_RDONLY);
  +    mode_t omode = 0;
       XZFILE * xzfile = lzopen(path, fmode);
   
       if (xzfile == NULL)
        return NULL;
       fd = fdNew("open (lzdOpen)");
       fdPop(fd); fdPush(fd, lzdio, xzfile, -1);
  -    fdSetOpen(fd, path, fileno(xzfile->fp), mode);
  +    fdSetOpen(fd, path, oflags, omode);
       return fdLink(fd, "lzdOpen");
   }
   
  @@ -275,14 +276,15 @@
   static FD_t xzdOpen(const char * path, const char * fmode)
   {
       FD_t fd;
  -    mode_t mode = (fmode && fmode[0] == 'w' ? O_WRONLY : O_RDONLY);
  +    int oflags = (fmode && fmode[0] == 'w' ? O_WRONLY : O_RDONLY);
  +    mode_t omode = 0;
       XZFILE * xzfile = xzopen(path, fmode);
   
       if (xzfile == NULL)
        return NULL;
       fd = fdNew("open (xzdOpen)");
       fdPop(fd); fdPush(fd, xzdio, xzfile, -1);
  -    fdSetOpen(fd, path, fileno(xzfile->fp), mode);
  +    fdSetOpen(fd, path, oflags, omode);
       return fdLink(fd, "xzdOpen");
   }
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to