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: 03-Mar-2009 00:38:36 Branch: HEAD Handle: 2009030223383401 Modified files: rpm CHANGES rpm/rpmio bzdio.c Log: - jbj: bzdio: finish abstraction between FD_t <-> rpmbz methods. Summary: Revision Changes Path 1.2797 +1 -0 rpm/CHANGES 2.14 +34 -57 rpm/rpmio/bzdio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2796 -r1.2797 CHANGES --- rpm/CHANGES 2 Mar 2009 21:45:49 -0000 1.2796 +++ rpm/CHANGES 2 Mar 2009 23:38:34 -0000 1.2797 @@ -1,5 +1,6 @@ 5.2a2 -> 5.2a3: + - jbj: bzdio: finish abstraction between FD_t <-> rpmbz methods. - jbj: bzdio: stub-in an abstraction between FD_t <-> rpmbz methods. - jbj: bzdio: hmm, revert the pop/replace patch, there's more todo++ ... - jbj: bzdio: pop/replace ufdio with bzdio (including a fdno). @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/bzdio.c ============================================================================ $ cvs diff -u -r2.13 -r2.14 bzdio.c --- rpm/rpmio/bzdio.c 2 Mar 2009 22:55:28 -0000 2.13 +++ rpm/rpmio/bzdio.c 2 Mar 2009 23:38:35 -0000 2.14 @@ -131,7 +131,13 @@ /*...@unchecked@*/ static int _bzdW = 30; -static void rpmbzClose(rpmbz bz, int abort) +static const char * rpmbzStrerror(rpmbz bz) + /*...@*/ +{ + return BZ2_bzerror(bz->bzfile, &bz->bzerr); +} + +static void rpmbzClose(rpmbz bz, int abort, /*...@null@*/ const char ** errmsg) /*...@modifies bz @*/ { if (bz->bzfile != NULL) { @@ -140,6 +146,8 @@ else BZ2_bzWriteClose(&bz->bzerr, bz->bzfile, abort, &bz->nbytes_in, &bz->nbytes_out); + if (bz->bzerr != BZ_OK && errmsg) + *errmsg = rpmbzStrerror(bz); } bz->bzfile = NULL; } @@ -149,7 +157,7 @@ /*...@globals fileSystem @*/ /*...@modifies bz, fileSystem @*/ { - rpmbzClose(bz, abort); + rpmbzClose(bz, abort, NULL); if (bz->fp != NULL) { (void) fclose(bz->fp); bz->fp = NULL; @@ -222,20 +230,18 @@ return (bz->bzfile != NULL ? bz : rpmbzFree(bz, 0)); } -static const char * rpmbzStrerror(rpmbz bz) - /*...@*/ -{ - return BZ2_bzerror(bz->bzfile, &bz->bzerr); -} - -#ifdef NOTYET /* XXX TODO: finish wiring up the FD_t <-> rpmbz abstraction. */ -static ssize_t rpmbzRead(rpmbz bz, /*...@out@*/ char * buf, size_t count) +static ssize_t rpmbzRead(rpmbz bz, /*...@out@*/ char * buf, size_t count, + /*...@null@*/ const char ** errmsg) /*...@globals fileSystem, internalState @*/ /*...@modifies *buf, fileSystem, internalState @*/ { ssize_t rc = 0; -assert(bz->bzfile != NULL); /* XXX TODO: lazy open? */ +#ifdef NOTYET /* XXX hmmm, read after close needs to return EOF. */ +assert(bz->bzfile != NULL); +#else + if (bz->bzfile == NULL) return 0; +#endif rc = BZ2_bzRead(&bz->bzerr, bz->bzfile, buf, (int)count); switch (bz->bzerr) { case BZ_STREAM_END: { @@ -249,23 +255,26 @@ unused = NULL; nUnused = 0; } - rpmbzClose(bz, 0); + rpmbzClose(bz, 0, NULL); bz->bzfile = BZ2_bzReadOpen(&bz->bzerr, bz->fp, bz->V, bz->S, unused, nUnused); unused = _free(unused); } /*...@fallthrough@*/ case BZ_OK: - break; +assert(rc >= 0); + break; default: rc = -1; /* XXX just in case. */ - rpmbzClose(bz, 1); + if (errmsg) + *errmsg = rpmbzStrerror(bz); + rpmbzClose(bz, 1, NULL); break; } return rc; } -#endif /* NOTYET */ -static ssize_t rpmbzWrite(rpmbz bz, const char * buf, size_t count) +static ssize_t rpmbzWrite(rpmbz bz, const char * buf, size_t count, + /*...@null@*/ const char ** errmsg) /*...@globals fileSystem, internalState @*/ /*...@modifies fileSystem, internalState @*/ { @@ -278,7 +287,9 @@ rc = count; break; default: - rpmbzClose(bz, 1); + if (errmsg) + *errmsg = rpmbzStrerror(bz); + rpmbzClose(bz, 1, NULL); rc = -1; break; } @@ -372,34 +383,7 @@ assert(bz != NULL); if (fd->bytesRemain == 0) return 0; /* XXX simulate EOF */ fdstat_enter(fd, FDSTAT_READ); - if (bz->bzfile != NULL) { - rc = BZ2_bzRead(&bz->bzerr, bz->bzfile, buf, (int)count); - switch (bz->bzerr) { - case BZ_STREAM_END: { - void * unused = NULL; - int nUnused = 0; - - BZ2_bzReadGetUnused(&bz->bzerr, bz->bzfile, &unused, &nUnused); - if (unused != NULL && nUnused > 0) - unused = memcpy(xmalloc(nUnused), unused, nUnused); - else { - unused = NULL; - nUnused = 0; - } - rpmbzClose(bz, 0); - bz->bzfile = BZ2_bzReadOpen(&bz->bzerr, bz->fp, bz->V, bz->S, - unused, nUnused); - unused = _free(unused); - } /*...@fallthrough@*/ - case BZ_OK: - break; - default: - rc = -1; /* XXX just in case. */ - fd->errcookie = rpmbzStrerror(bz); - rpmbzClose(bz, 1); - break; - } - } + rc = rpmbzRead(bz, buf, count, (const char **)&fd->errcookie); if (rc >= 0) { fdstat_exit(fd, FDSTAT_READ, rc); /*...@-compdef@*/ @@ -426,11 +410,9 @@ if (fd->ndigests && count > 0) fdUpdateDigests(fd, (void *)buf, count); fdstat_enter(fd, FDSTAT_WRITE); - rc = rpmbzWrite(bz, buf, count); + rc = rpmbzWrite(bz, buf, count, (const char **)&fd->errcookie); if (rc >= 0) fdstat_exit(fd, FDSTAT_WRITE, rc); - else - fd->errcookie = rpmbzStrerror(bz); return rc; } /*...@=globuse@*/ @@ -459,20 +441,15 @@ fdstat_enter(fd, FDSTAT_CLOSE); /*...@-noeffectuncon@*/ /* FIX: check rc */ - rpmbzClose(bz, 0); + rpmbzClose(bz, 0, (const char **)&fd->errcookie); /*...@=noeffectuncon@*/ rc = 0; /* XXX FIXME */ /* XXX TODO: preserve fd if errors */ - if (fd) { - if (rc == -1) - fd->errcookie = rpmbzStrerror(bz); - else - if (rc >= 0) { - fdstat_exit(fd, FDSTAT_CLOSE, rc); - } - } + if (fd) + if (rc >= 0) + fdstat_exit(fd, FDSTAT_CLOSE, rc); DBGIO(fd, (stderr, "==>\tbzdClose(%p) rc %lx %s\n", cookie, (unsigned long)rc, fdbg(fd))); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org