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