From 3d087dcf52531f766af0c503a6cbddfaef84f86a Mon Sep 17 00:00:00 2001 From: jbj Date: Sat, 30 Oct 1999 21:26:45 +0000 Subject: [PATCH] Rename faFoo() routines, use FD_t I/O with fadio cookie throughout. Try to be URL sensitive on filename arguments throughout. falloc.c: Eliminate faFile, use FD_t. falloc.c: preserve abstract FD_t by creating fadGet*()/fadSet*(). macro.c: rpmGetPath() expansions were clobbering URL's. rpmio.c: create Fcntl(), Pread(), Pwrite() from previous faFoo(). rpmio.c: attempt per FD_t debugging. rpm.c: permit --dbpath with --rebuild. CVS patchset: 3408 CVS date: 1999/10/30 21:26:45 --- lib/dbindex.c | 15 ++++ lib/falloc.c | 169 ++++++++++++++++++--------------------------- lib/falloc.h | 28 ++------ lib/macro.c | 3 +- lib/misc.c | 22 ++++-- lib/rpmdb.c | 51 +++++++++----- lib/rpmio.h | 64 +++++++++++------ lib/rpmrc.c | 8 ++- po/rpm.pot | 216 +++++++++++++++++++++++++++++----------------------------- rpm.c | 13 +++- rpmio/macro.c | 3 +- 11 files changed, 313 insertions(+), 279 deletions(-) diff --git a/lib/dbindex.c b/lib/dbindex.c index 7156971..cbb4ea3 100644 --- a/lib/dbindex.c +++ b/lib/dbindex.c @@ -1,6 +1,7 @@ #include "system.h" #include +#include unsigned int dbiIndexSetCount(dbiIndexSet set) { return set.count; @@ -25,6 +26,20 @@ unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno) { dbiIndex * dbiOpenIndex(const char * filename, int flags, int perms, DBTYPE type) { dbiIndex * dbi; + switch (urlIsURL(filename)) { + case URL_IS_PATH: + filename += sizeof("file://") - 1; + filename = strchr(filename, '/'); + /*@fallthrough@*/ + case URL_IS_UNKNOWN: + break; + case URL_IS_DASH: + case URL_IS_FTP: + case URL_IS_HTTP: + default: + return NULL; + /*@notreached@*/ break; + } dbi = xmalloc(sizeof(*dbi)); dbi->db = dbopen(filename, flags, perms, type, NULL); if (!dbi->db) { diff --git a/lib/falloc.c b/lib/falloc.c index 9aca52f..b2796bc 100644 --- a/lib/falloc.c +++ b/lib/falloc.c @@ -34,91 +34,57 @@ struct faFooter { unsigned int isFree; } ; -FD_t faFileno(faFile fa) { - return fa; -} - -static inline ssize_t faRead(faFile fa, /*@out@*/ void *buf, size_t count) { - return Fread(buf, count, 1, faFileno(fa)); -} - -static inline ssize_t faWrite(faFile fa, const void *buf, size_t count) { - return Fwrite(buf, count, 1, faFileno(fa)); -} - -int faSeek(faFile fa, off_t pos, int whence) { - return Fseek(faFileno(fa), pos, whence); -} - -int faClose(faFile fa) { - return Fclose(faFileno(fa)); -} - -int faFcntl(faFile fa, int op, void *lip) { - return fcntl(Fileno(faFileno(fa)), op, lip); -} - -static inline ssize_t faPRead(faFile fa, /*@out@*/void *buf, size_t count, off_t offset) { - if (faSeek(fa, offset, SEEK_SET) < 0) - return -1; - return faRead(fa, buf, count); -} - -static inline ssize_t faPWrite(faFile fa, const void *buf, size_t count, off_t offset) { - if (faSeek(fa, offset, SEEK_SET) < 0) - return -1; - return faWrite(fa, buf, count); -} - /* flags here is the same as for open(2) - NULL returned on error */ -faFile faOpen(const char * path, int flags, int perms) +FD_t fadOpen(const char * path, int flags, int perms) { struct faFileHeader newHdr; - faFile fa; + FD_t fd; if (flags & O_WRONLY) return NULL; - fa = ufdOpen(path, flags, perms); - if (Ferror(faFileno(fa))) + fd = ufdOpen(path, flags, perms); + if (Ferror(fd)) /* XXX Fstrerror */ return NULL; - fa->readOnly = (flags & O_RDWR) ? 0 : 1; - fa->firstFree = 0; + fdSetIoCookie(fd, &fadio); + fadSetFirstFree(fd, 0); + fadSetFileSize(fd, Fseek(fd, 0, SEEK_END)); /* is this file brand new? */ - if ((fa->fileSize = faSeek(fa, 0, SEEK_END)) < 0) { + if (fadGetFileSize(fd) < 0) { newHdr.magic = FA_MAGIC; newHdr.firstFree = 0; - if (faWrite(fa, &newHdr, sizeof(newHdr)) != sizeof(newHdr)) { - faClose(fa); + if (Fwrite(&newHdr, sizeof(newHdr), 1, fd) != sizeof(newHdr)) { + Fclose(fd); return NULL; } - fa->firstFree = 0; - fa->fileSize = sizeof(newHdr); + fadSetFirstFree(fd, 0); + fadSetFileSize(fd, sizeof(newHdr)); } else { - if (faPRead(fa, &newHdr, sizeof(newHdr), 0) != sizeof(newHdr)) { - faClose(fa); + if (Pread(fd, &newHdr, sizeof(newHdr), 0) != sizeof(newHdr)) { + Fclose(fd); return NULL; } if (newHdr.magic != FA_MAGIC) { - faClose(fa); + Fclose(fd); return NULL; } - fa->firstFree = newHdr.firstFree; + fadSetFirstFree(fd, newHdr.firstFree); + fadSetFileSize(fd, Fseek(fd, 0, SEEK_END)); - if ((fa->fileSize = faSeek(fa, 0, SEEK_END)) < 0) { - faClose(fa); + if (fadGetFileSize(fd) < 0) { + Fclose(fd); return NULL; } } - return fa; + return fd; } /* returns 0 on failure */ -unsigned int faAlloc(faFile fa, unsigned int size) +unsigned int fadAlloc(FD_t fd, unsigned int size) { unsigned int nextFreeBlock; unsigned int newBlockOffset; @@ -147,11 +113,11 @@ unsigned int faAlloc(faFile fa, unsigned int size) /* find a block via first fit - see Knuth vol 1 for why */ /* XXX this could be optimized a bit still */ - nextFreeBlock = fa->firstFree; + nextFreeBlock = fadGetFirstFree(fd); newBlockOffset = 0; while (nextFreeBlock && !newBlockOffset) { - if (faPRead(fa, &header, sizeof(header), nextFreeBlock) != sizeof(header)) return 0; + if (Pread(fd, &header, sizeof(header), nextFreeBlock) != sizeof(header)) return 0; /* XXX W2DO? exit(EXIT_FAILURE) forces the user to discover rpm --rebuilddb */ if (!header.isFree) { @@ -179,7 +145,7 @@ unsigned int faAlloc(faFile fa, unsigned int size) footerOffset = newBlockOffset + header.size - sizeof(footer); - if (faPRead(fa, &footer, sizeof(footer), footerOffset) != sizeof(footer)) + if (Pread(fd, &footer, sizeof(footer), footerOffset) != sizeof(footer)) return 0; origFooter = footer; @@ -189,13 +155,13 @@ unsigned int faAlloc(faFile fa, unsigned int size) footer.isFree = header.isFree = 0; /* remove it from the free list before */ - if (newBlockOffset == fa->firstFree) { + if (newBlockOffset == fadGetFirstFree(fd)) { faHeader.magic = FA_MAGIC; faHeader.firstFree = header.freeNext; - fa->firstFree = header.freeNext; + fadSetFirstFree(fd, header.freeNext); updateHeader = 1; } else { - if (faPRead(fa, &prevFreeHeader, sizeof(prevFreeHeader), + if (Pread(fd, &prevFreeHeader, sizeof(prevFreeHeader), header.freePrev) != sizeof(prevFreeHeader)) return 0; origPrevFreeHeader = prevFreeHeader; @@ -205,7 +171,7 @@ unsigned int faAlloc(faFile fa, unsigned int size) /* and after */ if (header.freeNext) { - if (faPRead(fa, &nextFreeHeader, sizeof(nextFreeHeader), + if (Pread(fd, &nextFreeHeader, sizeof(nextFreeHeader), header.freeNext) != sizeof(nextFreeHeader)) return 0; origNextFreeHeader = nextFreeHeader; @@ -215,18 +181,18 @@ unsigned int faAlloc(faFile fa, unsigned int size) /* if any of these fail, try and restore everything before leaving */ if (updateHeader) { - if (faPWrite(fa, &faHeader, sizeof(faHeader), 0) != + if (Pwrite(fd, &faHeader, sizeof(faHeader), 0) != sizeof(faHeader)) return 0; } else { - if (faPWrite(fa, &prevFreeHeader, sizeof(prevFreeHeader), + if (Pwrite(fd, &prevFreeHeader, sizeof(prevFreeHeader), header.freePrev) != sizeof(prevFreeHeader)) return 0; restorePrevHeader = &origPrevFreeHeader; } if (header.freeNext) { - if (faPWrite(fa, &nextFreeHeader, sizeof(nextFreeHeader), + if (Pwrite(fd, &nextFreeHeader, sizeof(nextFreeHeader), header.freeNext) != sizeof(nextFreeHeader)) return 0; @@ -234,7 +200,7 @@ unsigned int faAlloc(faFile fa, unsigned int size) } if (!failed) { - if (faPWrite(fa, &header, sizeof(header), newBlockOffset) != + if (Pwrite(fd, &header, sizeof(header), newBlockOffset) != sizeof(header)) { failed = 1; restoreHeader = &origHeader; @@ -242,7 +208,7 @@ unsigned int faAlloc(faFile fa, unsigned int size) } if (!failed) { - if (faPWrite(fa, &footer, sizeof(footer), + if (Pwrite(fd, &footer, sizeof(footer), footerOffset) != sizeof(footer)) { failed = 1; restoreFooter = &origFooter; @@ -252,24 +218,24 @@ unsigned int faAlloc(faFile fa, unsigned int size) if (failed) { if (updateHeader) { faHeader.firstFree = newBlockOffset; - fa->firstFree = newBlockOffset; - (void)faPWrite(fa, &faHeader, sizeof(faHeader), 0); + fadSetFirstFree(fd, newBlockOffset); + (void)Pwrite(fd, &faHeader, sizeof(faHeader), 0); } if (restorePrevHeader) - (void)faPWrite(fa, restorePrevHeader, sizeof(*restorePrevHeader), + (void)Pwrite(fd, restorePrevHeader, sizeof(*restorePrevHeader), header.freePrev); if (restoreNextHeader) - (void)faPWrite(fa, restoreNextHeader, sizeof(*restoreNextHeader), + (void)Pwrite(fd, restoreNextHeader, sizeof(*restoreNextHeader), header.freeNext); if (restoreHeader) - (void)faPWrite(fa, restoreHeader, sizeof(header), + (void)Pwrite(fd, restoreHeader, sizeof(header), newBlockOffset); if (restoreFooter) - (void)faPWrite(fa, restoreFooter, sizeof(footer), + (void)Pwrite(fd, restoreFooter, sizeof(footer), footerOffset); return 0; @@ -278,7 +244,7 @@ unsigned int faAlloc(faFile fa, unsigned int size) char * space; /* make a new block */ - newBlockOffset = fa->fileSize; + newBlockOffset = fadGetFileSize(fd); footerOffset = newBlockOffset + size - sizeof(footer); space = alloca(size); @@ -290,22 +256,22 @@ unsigned int faAlloc(faFile fa, unsigned int size) header.freePrev = header.freeNext = 0; /* reserve all space up front */ - if (faPWrite(fa, space, size, newBlockOffset) != size) + if (Pwrite(fd, space, size, newBlockOffset) != size) return 0; - if (faPWrite(fa, &header, sizeof(header), newBlockOffset) != sizeof(header)) + if (Pwrite(fd, &header, sizeof(header), newBlockOffset) != sizeof(header)) return 0; - if (faPWrite(fa, &footer, sizeof(footer), footerOffset) != sizeof(footer)) + if (Pwrite(fd, &footer, sizeof(footer), footerOffset) != sizeof(footer)) return 0; - fa->fileSize += size; + fadSetFileSize(fd, fadGetFileSize(fd) + size); } return newBlockOffset + sizeof(header); } -void faFree(faFile fa, unsigned int offset) +void fadFree(FD_t fd, unsigned int offset) { struct faHeader header; struct faFooter footer; @@ -320,19 +286,19 @@ void faFree(faFile fa, unsigned int offset) offset -= sizeof(header); /* find out where in the (sorted) free list to put this */ - prevFreeOffset = fa->firstFree; + prevFreeOffset = fadGetFirstFree(fd); if (!prevFreeOffset || (prevFreeOffset > offset)) { - nextFreeOffset = fa->firstFree; + nextFreeOffset = fadGetFirstFree(fd); prevFreeOffset = 0; } else { - if (faPRead(fa, &prevFreeHeader, sizeof(prevFreeHeader), + if (Pread(fd, &prevFreeHeader, sizeof(prevFreeHeader), prevFreeOffset) != sizeof(prevFreeHeader)) return; while (prevFreeHeader.freeNext && prevFreeHeader.freeNext < offset) { prevFreeOffset = prevFreeHeader.freeNext; - if (faPRead(fa, &prevFreeHeader, sizeof(prevFreeHeader), + if (Pread(fd, &prevFreeHeader, sizeof(prevFreeHeader), prevFreeOffset) != sizeof(prevFreeHeader)) return; } @@ -341,17 +307,17 @@ void faFree(faFile fa, unsigned int offset) } if (nextFreeOffset) { - if (faPRead(fa, &nextFreeHeader, sizeof(nextFreeHeader), + if (Pread(fd, &nextFreeHeader, sizeof(nextFreeHeader), nextFreeOffset) != sizeof(nextFreeHeader)) return; } - if (faPRead(fa, &header, sizeof(header), offset) != sizeof(header)) + if (Pread(fd, &header, sizeof(header), offset) != sizeof(header)) return; footerOffset = offset + header.size - sizeof(footer); - if (faPRead(fa, &footer, sizeof(footer), footerOffset) != sizeof(footer)) + if (Pread(fd, &footer, sizeof(footer), footerOffset) != sizeof(footer)) return; header.isFree = 1; @@ -359,38 +325,39 @@ void faFree(faFile fa, unsigned int offset) header.freePrev = prevFreeOffset; footer.isFree = 1; - (void)faPWrite(fa, &header, sizeof(header), offset); + (void)Pwrite(fd, &header, sizeof(header), offset); - (void)faPWrite(fa, &footer, sizeof(footer), footerOffset); + (void)Pwrite(fd, &footer, sizeof(footer), footerOffset); if (nextFreeOffset) { nextFreeHeader.freePrev = offset; - if (faPWrite(fa, &nextFreeHeader, sizeof(nextFreeHeader), + if (Pwrite(fd, &nextFreeHeader, sizeof(nextFreeHeader), nextFreeOffset) != sizeof(nextFreeHeader)) return; } if (prevFreeOffset) { prevFreeHeader.freeNext = offset; - if (faPWrite(fa, &prevFreeHeader, sizeof(prevFreeHeader), + if (Pwrite(fd, &prevFreeHeader, sizeof(prevFreeHeader), prevFreeOffset) != sizeof(prevFreeHeader)) return; } else { - fa->firstFree = offset; + fadSetFirstFree(fd, offset); faHeader.magic = FA_MAGIC; - faHeader.firstFree = fa->firstFree; + faHeader.firstFree = fadGetFirstFree(fd); - if (faPWrite(fa, &faHeader, sizeof(faHeader), 0) != sizeof(faHeader)) + if (Pwrite(fd, &faHeader, sizeof(faHeader), 0) != sizeof(faHeader)) return; } } -int faFirstOffset(faFile fa) { - return faNextOffset(fa, 0); +int fadFirstOffset(FD_t fd) +{ + return fadNextOffset(fd, 0); } -int faNextOffset(faFile fa, unsigned int lastOffset) +int fadNextOffset(FD_t fd, unsigned int lastOffset) { struct faHeader header; int offset; @@ -399,10 +366,10 @@ int faNextOffset(faFile fa, unsigned int lastOffset) ? (lastOffset - sizeof(header)) : sizeof(struct faFileHeader); - if (offset >= fa->fileSize) + if (offset >= fadGetFileSize(fd)) return 0; - if (faPRead(fa, &header, sizeof(header), offset) != sizeof(header)) + if (Pread(fd, &header, sizeof(header), offset) != sizeof(header)) return 0; if (!lastOffset && !header.isFree) @@ -411,13 +378,13 @@ int faNextOffset(faFile fa, unsigned int lastOffset) do { offset += header.size; - if (faPRead(fa, &header, sizeof(header), offset) != sizeof(header)) + if (Pread(fd, &header, sizeof(header), offset) != sizeof(header)) return 0; if (!header.isFree) break; - } while (offset < fa->fileSize && header.isFree); + } while (offset < fadGetFileSize(fd) && header.isFree); - if (offset < fa->fileSize) { + if (offset < fadGetFileSize(fd)) { /* Sanity check this to make sure we're not going in loops */ offset += sizeof(header); diff --git a/lib/falloc.h b/lib/falloc.h index 4d5d2fa..1e1f0ba 100644 --- a/lib/falloc.h +++ b/lib/falloc.h @@ -5,34 +5,16 @@ are compacted. Minimal fragmentation is more important then speed. This uses 32 bit offsets on all platforms and should be byte order independent */ -#if 0 -typedef /*@abstract@*/ struct faFile_s { - /*@owned@*/ FD_t fd; - int readOnly; - unsigned int firstFree; - unsigned long fileSize; -} * faFile; -#else -typedef FD_t faFile; -#endif - #ifdef __cplusplus extern "C" { #endif -/* flags here is the same as for open(2) - NULL returned on error */ -/*@only@*/ faFile faOpen(const char * path, int flags, int perms); -unsigned int faAlloc(faFile fa, unsigned int size); /* returns 0 on failure */ -void faFree(faFile fa, unsigned int offset); - -FD_t faFileno(faFile fa); -int faSeek(faFile fa, off_t pos, int whence); -int faClose( /*@only@*/ faFile fa); - -int faFcntl(faFile fa, int op, void *lip); +/*@only@*/ FD_t fadOpen (const char * path, int flags, int perms); +unsigned int fadAlloc (FD_t fd, unsigned int size); /* 0 on failure */ +void fadFree (FD_t fd, unsigned int offset); -int faFirstOffset(faFile fa); -int faNextOffset(faFile fa, unsigned int lastOffset); /* 0 at end */ +int fadFirstOffset (FD_t fd); +int fadNextOffset (FD_t fd, unsigned int lastoff); /* 0 at end */ #ifdef __cplusplus } diff --git a/lib/macro.c b/lib/macro.c index afc0aca..10e329e 100644 --- a/lib/macro.c +++ b/lib/macro.c @@ -1462,7 +1462,8 @@ rpmGetPath(const char *path, ...) expandMacros(NULL, NULL, buf, sizeof(buf)); for (s = p = buf; *s; s++, p++) { - while (s[0] == '/' && s[1] == '/') s++; + if (!(s > buf && s[-1] == ':')) + while (s[0] == '/' && s[1] == '/') s++; *p = *s; } *p = '\0'; diff --git a/lib/misc.c b/lib/misc.c index e8cac8c..36ab312 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -1,6 +1,7 @@ #include "system.h" #include +#include #include /* XXX for rpmGetPath */ #include "misc.h" @@ -50,12 +51,25 @@ void freeSplitString(char ** list) { int rpmfileexists(const char * filespec) { struct stat buf; - if (stat(filespec, &buf)) { - switch(errno) { - case ENOENT: - case EINVAL: + switch (urlIsURL(filespec)) { + case URL_IS_PATH: + filespec += sizeof("file://") - 1; + filespec = strchr(filespec, '/'); + /*@fallthrough@*/ + case URL_IS_UNKNOWN: + if (stat(filespec, &buf)) { + switch(errno) { + case ENOENT: + case EINVAL: return 0; + } } + break; + case URL_IS_DASH: + case URL_IS_FTP: + case URL_IS_HTTP: + default: + break; } return 1; diff --git a/lib/rpmdb.c b/lib/rpmdb.c index 7782410..a8fe989 100644 --- a/lib/rpmdb.c +++ b/lib/rpmdb.c @@ -5,6 +5,7 @@ #include #include +#include #include /* XXX for rpmGetPath */ #include "falloc.h" @@ -39,7 +40,7 @@ const char *rpmdb_filenames[] = { right area w/o a linear search through the database. */ struct rpmdb_s { - faFile pkgs; + FD_t pkgs; dbiIndex * nameIndex, * fileIndex, * groupIndex, * providesIndex; dbiIndex * requiredbyIndex, * conflictsIndex, * triggerIndex; }; @@ -112,7 +113,13 @@ static int openDbFile(const char * prefix, const char * dbpath, const char * sho char * filename = alloca(len); *filename = '\0'; - if (prefix && *prefix) strcat(filename, prefix); + switch (urlIsURL(dbpath)) { + case URL_IS_UNKNOWN: + if (prefix && *prefix) strcat(filename, prefix); + break; + default: + break; + } strcat(filename, dbpath); strcat(filename, shortName); @@ -151,6 +158,7 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo int minimal = flags & RPMDB_FLAG_MINIMAL; const char * akey; +fprintf(stderr, "==> openDatabase %s\n", dbpath); if (mode & O_WRONLY) return 1; @@ -170,8 +178,15 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo } filename = alloca(strlen(prefix) + strlen(dbpath) + 40); + *filename = '\0'; - strcpy(filename, prefix); + switch (urlIsURL(dbpath)) { + case URL_IS_UNKNOWN: + strcpy(filename, prefix); + break; + default: + break; + } strcat(filename, dbpath); rpmMessage(RPMMESS_DEBUG, _("opening database mode 0x%x in %s\n"), @@ -182,7 +197,9 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo db = newRpmdb(); if (!justcheck || !rpmfileexists(filename)) { - if ((db->pkgs = faOpen(filename, mode, perms)) == NULL) { + db->pkgs = fadOpen(filename, mode, perms); + if (Ferror(db->pkgs)) { + /* XXX Fstrerror */ rpmError(RPMERR_DBOPEN, _("failed to open %s\n"), filename); return 1; } @@ -195,7 +212,7 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo if (mode & O_RDWR) { lockinfo.l_type = F_WRLCK; - if (faFcntl(db->pkgs, F_SETLK, (void *) &lockinfo)) { + if (Fcntl(db->pkgs, F_SETLK, (void *) &lockinfo)) { rpmError(RPMERR_FLOCK, _("cannot get %s lock on database"), _("exclusive")); rpmdbClose(db); @@ -203,7 +220,7 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo } } else { lockinfo.l_type = F_RDLCK; - if (faFcntl(db->pkgs, F_SETLK, (void *) &lockinfo)) { + if (Fcntl(db->pkgs, F_SETLK, (void *) &lockinfo)) { rpmError(RPMERR_FLOCK, _("cannot get %s lock on database"), _("shared")); rpmdbClose(db); @@ -269,7 +286,7 @@ int openDatabase(const char * prefix, const char * dbpath, rpmdb *rpmdbp, int mo void rpmdbClose (rpmdb db) { - if (db->pkgs != NULL) faClose(db->pkgs); + if (db->pkgs != NULL) Fclose(db->pkgs); if (db->fileIndex) dbiCloseIndex(db->fileIndex); if (db->groupIndex) dbiCloseIndex(db->groupIndex); if (db->nameIndex) dbiCloseIndex(db->nameIndex); @@ -281,12 +298,12 @@ void rpmdbClose (rpmdb db) } int rpmdbFirstRecNum(rpmdb db) { - return faFirstOffset(db->pkgs); + return fadFirstOffset(db->pkgs); } int rpmdbNextRecNum(rpmdb db, unsigned int lastOffset) { /* 0 at end */ - return faNextOffset(db->pkgs, lastOffset); + return fadNextOffset(db->pkgs, lastOffset); } static Header doGetRecord(rpmdb db, unsigned int offset, int pristine) { @@ -296,9 +313,9 @@ static Header doGetRecord(rpmdb db, unsigned int offset, int pristine) { int fileCount = 0; int i; - (void)faSeek(db->pkgs, offset, SEEK_SET); + (void)Fseek(db->pkgs, offset, SEEK_SET); - h = headerRead(faFileno(db->pkgs), HEADER_MAGIC_NO); + h = headerRead(db->pkgs, HEADER_MAGIC_NO); if (pristine) return h; @@ -578,7 +595,7 @@ int rpmdbRemove(rpmdb db, unsigned int offset, int tolerant) rpmMessage(RPMMESS_DEBUG, _("package has no files\n")); } - faFree(db->pkgs, offset); + fadFree(db->pkgs, offset); dbiSyncIndex(db->nameIndex); dbiSyncIndex(db->groupIndex); @@ -648,12 +665,12 @@ int rpmdbAdd(rpmdb db, Header dbentry) blockSignals(); - dboffset = faAlloc(db->pkgs, headerSizeof(dbentry, HEADER_MAGIC_NO)); + dboffset = fadAlloc(db->pkgs, headerSizeof(dbentry, HEADER_MAGIC_NO)); if (!dboffset) { rc = 1; } else { - (void)faSeek(db->pkgs, dboffset, SEEK_SET); - rc = headerWrite(faFileno(db->pkgs), dbentry, HEADER_MAGIC_NO); + (void)Fseek(db->pkgs, dboffset, SEEK_SET); + rc = headerWrite(db->pkgs, dbentry, HEADER_MAGIC_NO); } if (rc) { @@ -734,9 +751,9 @@ int rpmdbUpdateRecord(rpmdb db, int offset, Header newHeader) } else { blockSignals(); - (void)faSeek(db->pkgs, offset, SEEK_SET); + (void)Fseek(db->pkgs, offset, SEEK_SET); - rc = headerWrite(faFileno(db->pkgs), newHeader, HEADER_MAGIC_NO); + rc = headerWrite(db->pkgs, newHeader, HEADER_MAGIC_NO); unblockSignals(); } diff --git a/lib/rpmio.h b/lib/rpmio.h index 32ec286..8aec3d1 100644 --- a/lib/rpmio.h +++ b/lib/rpmio.h @@ -7,17 +7,19 @@ #include typedef /*@abstract@*/ struct _FD { - int fd_fd; - /*@owned@*/ void * fd_bzd; - /*@owned@*/ void * fd_gzd; - void * fd_url; - int readOnly; /* falloc.c */ - unsigned int firstFree; /* falloc.c */ - long int fileSize; /* falloc.c */ - long int fd_cpioPos; /* cpio.c */ - /*@observer@*/ const char *fd_errstr; - long int fd_pos; - /*@dependent@*/ cookie_io_functions_t *fd_io; + int fd_fd; /* file descriptor */ +/*@owned@*/ void * fd_bzd; /* bzdio: I/O cookie */ +/*@owned@*/ void * fd_gzd; /* gzdio: I/O cookie */ +/*@dependent@*/ void * fd_url; /* ufdio: URL info */ +/*@observer@*/ const void *fd_errcookie;/* opaque error token */ + int fd_errno; /* last system errno encountered */ +/*@observer@*/ const char *fd_errstr; + int fd_flags; + unsigned int firstFree; /* fadio: */ + long int fileSize; /* fadio: */ + long int fd_cpioPos; /* cfdio: */ + long int fd_pos; +/*@dependent@*/ cookie_io_functions_t *fd_io; } *FD_t; /*@observer@*/ const char * Fstrerror(FD_t); @@ -31,6 +33,10 @@ FILE * Fopen (const char *path, const char *fmode); int Ferror (FD_t fd); int Fileno (FD_t fd); +int Fcntl (FD_t, int op, void *lip); +ssize_t Pread (FD_t fd, /*@out@*/ void * buf, size_t count, off_t offset); +ssize_t Pwrite (FD_t fd, const void * buf, size_t count, off_t offset); + #endif /* H_RPMIO */ #ifndef H_RPMIO_F @@ -49,12 +55,38 @@ extern /*@only@*/ /*@null@*/ FD_t fdOpen(const char *pathname, int flags, mode_t extern /*@only@*/ /*@null@*/ FD_t fdDup(int fdno); extern /*@dependent@*/ /*@null@*/ FILE *fdFdopen( /*@only@*/ FD_t fd, const char *mode); +/*@observer@*/ const cookie_io_functions_t * fdGetIoCookie(FD_t fd); +void fdSetIoCookie(FD_t fd, cookie_io_functions_t * io); + +void fdSetDebugOn(FD_t fd); +void fdSetDebugOff(FD_t fd); + extern cookie_io_functions_t fdio; /* - * Support for GZIP library. + * Support for FTP/HTTP I/O. */ +/*@only@*/ FD_t ufdOpen(const char * pathname, int flags, mode_t mode); +/*@dependent@*/ void * ufdGetUrlinfo(FD_t fd); +/*@observer@*/ const char *urlStrerror(const char *url); + +extern cookie_io_functions_t ufdio; + +/* + * Support for first fit File Allocation I/O. + */ + +long int fadGetFileSize(FD_t fd); +void fadSetFileSize(FD_t fd, long int fileSize); +unsigned int fadGetFirstFree(FD_t fd); +void fadSetFirstFree(FD_t fd, unsigned int firstFree); + +extern cookie_io_functions_t fadio; + #ifdef HAVE_ZLIB_H +/* + * Support for GZIP library. + */ #include @@ -70,10 +102,10 @@ extern cookie_io_functions_t gzdio; #endif /* HAVE_ZLIB_H */ +#ifdef HAVE_BZLIB_H /* * Support for BZIP2 library. */ -#ifdef HAVE_BZLIB_H #include @@ -89,12 +121,6 @@ extern cookie_io_functions_t bzdio; #endif /* HAVE_BZLIB_H */ -/*@only@*/ FD_t ufdOpen(const char * pathname, int flags, mode_t mode); -/*@dependent@*/ void * ufdGetUrlinfo(FD_t fd); -/*@observer@*/ const char *urlStrerror(const char *url); - -extern cookie_io_functions_t ufdio; - #ifdef __cplusplus } #endif diff --git a/lib/rpmrc.c b/lib/rpmrc.c index 05f69e8..e4a6b1e 100644 --- a/lib/rpmrc.c +++ b/lib/rpmrc.c @@ -519,7 +519,11 @@ int rpmReadRC(const char * rcfiles) FD_t fd; /* Get pointer to rest of files */ - if ((re = strchr(r, ':')) != NULL) + for (re = r; (re = strchr(re, ':')) != NULL; re++) { + if (!(re[1] == '/' && re[2] == '/')) + break; + } + if (re && *re == ':') *re++ = '\0'; else re = r + strlen(r); @@ -539,7 +543,7 @@ int rpmReadRC(const char * rcfiles) strcat(fn, r); /* Read another rcfile */ - fd = fdOpen(fn, O_RDONLY, 0); + fd = ufdOpen(fn, O_RDONLY, 0); if (Ferror(fd)) { /* XXX Only /usr/lib/rpm/rpmrc must exist in default rcfiles list */ if (rcfiles == defrcfiles && myrcfiles != r) diff --git a/po/rpm.pot b/po/rpm.pot index a2309d7..bc4f94f 100644 --- a/po/rpm.pot +++ b/po/rpm.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 1999-10-30 11:58-0400\n" +"POT-Creation-Date: 1999-10-30 17:08-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -924,8 +924,8 @@ msgid "rebuild database from existing database" msgstr "" #: rpm.c:641 rpm.c:647 rpm.c:654 rpm.c:660 rpm.c:669 rpm.c:676 rpm.c:723 -#: rpm.c:729 rpm.c:763 rpm.c:769 rpm.c:775 rpm.c:783 rpm.c:818 rpm.c:873 -#: rpm.c:880 +#: rpm.c:729 rpm.c:763 rpm.c:769 rpm.c:775 rpm.c:783 rpm.c:824 rpm.c:879 +#: rpm.c:886 msgid "only one major mode may be specified" msgstr "" @@ -945,275 +945,275 @@ msgstr "" msgid "--tarbuild (-t) requires one of a,b,i,c,p,l as its sole argument" msgstr "" -#: rpm.c:736 rpm.c:742 rpm.c:749 rpm.c:756 rpm.c:887 +#: rpm.c:736 rpm.c:742 rpm.c:749 rpm.c:756 rpm.c:893 msgid "one type of query/verify may be performed at a time" msgstr "" -#: rpm.c:791 +#: rpm.c:793 msgid "arguments to --dbpath must begin with a /" msgstr "" -#: rpm.c:824 +#: rpm.c:830 msgid "relocations must begin with a /" msgstr "" -#: rpm.c:826 +#: rpm.c:832 msgid "relocations must contain a =" msgstr "" -#: rpm.c:829 +#: rpm.c:835 msgid "relocations must have a / following the =" msgstr "" -#: rpm.c:838 +#: rpm.c:844 msgid "exclude paths must begin with a /" msgstr "" -#: rpm.c:847 +#: rpm.c:853 #, c-format msgid "Internal error in argument processing (%d) :-(\n" msgstr "" -#: rpm.c:900 +#: rpm.c:907 msgid "--dbpath given for operation that does not use a database" msgstr "" -#: rpm.c:905 +#: rpm.c:912 msgid "--timecheck may only be used during package builds" msgstr "" -#: rpm.c:908 +#: rpm.c:915 msgid "unexpected query flags" msgstr "" -#: rpm.c:911 +#: rpm.c:918 msgid "unexpected query format" msgstr "" -#: rpm.c:915 +#: rpm.c:922 msgid "unexpected query source" msgstr "" -#: rpm.c:921 +#: rpm.c:928 msgid "only installation, upgrading, rmsource and rmspec may be forced" msgstr "" -#: rpm.c:924 +#: rpm.c:931 msgid "files may only be relocated during package installation" msgstr "" -#: rpm.c:927 +#: rpm.c:934 msgid "only one of --prefix or --relocate may be used" msgstr "" -#: rpm.c:930 +#: rpm.c:937 msgid "" "--relocate and --excludepath may only be used when installing new packages" msgstr "" -#: rpm.c:933 +#: rpm.c:940 msgid "--prefix may only be used when installing new packages" msgstr "" -#: rpm.c:936 +#: rpm.c:943 msgid "arguments to --prefix must begin with a /" msgstr "" -#: rpm.c:939 +#: rpm.c:946 msgid "--hash (-h) may only be specified during package installation" msgstr "" -#: rpm.c:943 +#: rpm.c:950 msgid "--percent may only be specified during package installation" msgstr "" -#: rpm.c:947 +#: rpm.c:954 msgid "--replacefiles may only be specified during package installation" msgstr "" -#: rpm.c:951 +#: rpm.c:958 msgid "--replacepkgs may only be specified during package installation" msgstr "" -#: rpm.c:955 +#: rpm.c:962 msgid "--excludedocs may only be specified during package installation" msgstr "" -#: rpm.c:959 +#: rpm.c:966 msgid "--includedocs may only be specified during package installation" msgstr "" -#: rpm.c:963 +#: rpm.c:970 msgid "only one of --excludedocs and --includedocs may be specified" msgstr "" -#: rpm.c:967 +#: rpm.c:974 msgid "--ignorearch may only be specified during package installation" msgstr "" -#: rpm.c:971 +#: rpm.c:978 msgid "--ignoreos may only be specified during package installation" msgstr "" -#: rpm.c:975 +#: rpm.c:982 msgid "--ignoresize may only be specified during package installation" msgstr "" -#: rpm.c:979 +#: rpm.c:986 msgid "--allmatches may only be specified during package erasure" msgstr "" -#: rpm.c:983 +#: rpm.c:990 msgid "--allfiles may only be specified during package installation" msgstr "" -#: rpm.c:987 +#: rpm.c:994 msgid "--justdb may only be specified during package installation and erasure" msgstr "" -#: rpm.c:992 +#: rpm.c:999 msgid "" "--noscripts may only be specified during package installation, erasure, and " "verification" msgstr "" -#: rpm.c:996 +#: rpm.c:1003 msgid "" "--notriggers may only be specified during package installation, erasure, and " "verification" msgstr "" -#: rpm.c:1002 +#: rpm.c:1009 msgid "" "--nodeps may only be specified during package building, installation, " "erasure, and verification" msgstr "" -#: rpm.c:1007 +#: rpm.c:1014 msgid "" "--test may only be specified during package installation, erasure, and " "building" msgstr "" -#: rpm.c:1012 +#: rpm.c:1019 msgid "" "--root (-r) may only be specified during installation, erasure, querying, " "and database rebuilds" msgstr "" -#: rpm.c:1017 +#: rpm.c:1024 msgid "arguments to --root (-r) must begin with a /" msgstr "" -#: rpm.c:1020 +#: rpm.c:1027 msgid "--oldpackage may only be used during upgrades" msgstr "" -#: rpm.c:1025 +#: rpm.c:1032 msgid "" "ftp options can only be used during package queries, installs, and upgrades" msgstr "" -#: rpm.c:1031 +#: rpm.c:1038 msgid "" "http options can only be used during package queries, installs, and upgrades" msgstr "" -#: rpm.c:1035 +#: rpm.c:1042 msgid "--nopgp may only be used during signature checking" msgstr "" -#: rpm.c:1038 +#: rpm.c:1045 msgid "--nogpg may only be used during signature checking" msgstr "" -#: rpm.c:1041 +#: rpm.c:1048 msgid "" "--nomd5 may only be used during signature checking and package verification" msgstr "" -#: rpm.c:1065 +#: rpm.c:1072 msgid "no files to sign\n" msgstr "" -#: rpm.c:1070 +#: rpm.c:1077 #, c-format msgid "cannot access file %s\n" msgstr "" -#: rpm.c:1085 +#: rpm.c:1092 msgid "pgp not found: " msgstr "" -#: rpm.c:1089 +#: rpm.c:1096 msgid "Enter pass phrase: " msgstr "" -#: rpm.c:1091 +#: rpm.c:1098 msgid "Pass phrase check failed\n" msgstr "" -#: rpm.c:1094 +#: rpm.c:1101 msgid "Pass phrase is good.\n" msgstr "" -#: rpm.c:1099 +#: rpm.c:1106 msgid "Invalid %%_signature spec in macro file.\n" msgstr "" -#: rpm.c:1105 +#: rpm.c:1112 msgid "--sign may only be used during package building" msgstr "" -#: rpm.c:1120 +#: rpm.c:1127 msgid "exec failed\n" msgstr "" -#: rpm.c:1139 +#: rpm.c:1146 msgid "unexpected arguments to --querytags " msgstr "" -#: rpm.c:1150 +#: rpm.c:1157 msgid "no packages given for signature check" msgstr "" -#: rpm.c:1161 +#: rpm.c:1168 msgid "no packages given for signing" msgstr "" -#: rpm.c:1173 +#: rpm.c:1180 msgid "no packages files given for rebuild" msgstr "" -#: rpm.c:1235 +#: rpm.c:1242 msgid "no spec files given for build" msgstr "" -#: rpm.c:1237 +#: rpm.c:1244 msgid "no tar files given for build" msgstr "" -#: rpm.c:1252 +#: rpm.c:1259 msgid "no packages given for uninstall" msgstr "" -#: rpm.c:1302 +#: rpm.c:1309 msgid "no packages given for install" msgstr "" -#: rpm.c:1325 +#: rpm.c:1332 msgid "extra arguments given for query of all packages" msgstr "" -#: rpm.c:1330 +#: rpm.c:1337 msgid "no arguments given for query" msgstr "" -#: rpm.c:1347 +#: rpm.c:1354 msgid "extra arguments given for verify of all packages" msgstr "" -#: rpm.c:1351 +#: rpm.c:1358 msgid "no arguments given for verify" msgstr "" @@ -1963,22 +1963,22 @@ msgstr "" msgid " failed - " msgstr "" -#: lib/dbindex.c:32 +#: lib/dbindex.c:47 #, c-format msgid "cannot open file %s: %s" msgstr "" -#: lib/dbindex.c:84 +#: lib/dbindex.c:99 #, c-format msgid "error getting record %s from %s" msgstr "" -#: lib/dbindex.c:111 +#: lib/dbindex.c:126 #, c-format msgid "error storing record %s into %s" msgstr "" -#: lib/dbindex.c:118 +#: lib/dbindex.c:133 #, c-format msgid "error removing record %s into %s" msgstr "" @@ -2067,7 +2067,7 @@ msgstr "" msgid "loop in prerequisite chain: %s" msgstr "" -#: lib/falloc.c:158 +#: lib/falloc.c:124 #, c-format msgid "" "free list corrupt (%u)- please run\n" @@ -2446,7 +2446,7 @@ msgstr "" msgid "internal error (rpm bug?): " msgstr "" -#: lib/misc.c:367 lib/misc.c:373 lib/misc.c:380 +#: lib/misc.c:381 lib/misc.c:387 lib/misc.c:394 #, c-format msgid "error creating temporary file %s" msgstr "" @@ -2734,7 +2734,7 @@ msgstr "" msgid "rebuilding database in rootdir %s\n" msgstr "" -#: lib/rebuilddb.c:24 lib/rpmdb.c:68 lib/rpmdb.c:84 lib/rpmdb.c:99 +#: lib/rebuilddb.c:24 lib/rpmdb.c:69 lib/rpmdb.c:85 lib/rpmdb.c:100 msgid "no dbpath has been set" msgstr "" @@ -2873,106 +2873,106 @@ msgstr "" msgid "OK" msgstr "" -#: lib/rpmdb.c:177 +#: lib/rpmdb.c:192 #, c-format msgid "opening database mode 0x%x in %s\n" msgstr "" #. XXX Fstrerror -#: lib/rpmdb.c:186 lib/url.c:342 +#: lib/rpmdb.c:203 lib/url.c:342 #, c-format msgid "failed to open %s\n" msgstr "" -#: lib/rpmdb.c:199 lib/rpmdb.c:207 +#: lib/rpmdb.c:216 lib/rpmdb.c:224 #, c-format msgid "cannot get %s lock on database" msgstr "" -#: lib/rpmdb.c:200 +#: lib/rpmdb.c:217 msgid "exclusive" msgstr "" -#: lib/rpmdb.c:208 +#: lib/rpmdb.c:225 msgid "shared" msgstr "" -#: lib/rpmdb.c:239 +#: lib/rpmdb.c:256 msgid "" "old format database is present; use --rebuilddb to generate a new format " "database" msgstr "" -#: lib/rpmdb.c:461 +#: lib/rpmdb.c:478 #, c-format msgid "package %s not listed in %s" msgstr "" -#: lib/rpmdb.c:472 +#: lib/rpmdb.c:489 #, c-format msgid "package %s not found in %s" msgstr "" -#: lib/rpmdb.c:496 lib/uninstall.c:85 +#: lib/rpmdb.c:513 lib/uninstall.c:85 #, c-format msgid "cannot read header at %d for uninstall" msgstr "" -#: lib/rpmdb.c:504 +#: lib/rpmdb.c:521 msgid "package has no name" msgstr "" -#: lib/rpmdb.c:506 +#: lib/rpmdb.c:523 msgid "removing name index\n" msgstr "" -#: lib/rpmdb.c:511 +#: lib/rpmdb.c:528 msgid "package has no group\n" msgstr "" -#: lib/rpmdb.c:513 +#: lib/rpmdb.c:530 msgid "removing group index\n" msgstr "" -#: lib/rpmdb.c:520 +#: lib/rpmdb.c:537 #, c-format msgid "removing provides index for %s\n" msgstr "" -#: lib/rpmdb.c:535 +#: lib/rpmdb.c:552 #, c-format msgid "removing requiredby index for %s\n" msgstr "" -#: lib/rpmdb.c:547 +#: lib/rpmdb.c:564 #, c-format msgid "removing trigger index for %s\n" msgstr "" -#: lib/rpmdb.c:558 +#: lib/rpmdb.c:575 #, c-format msgid "removing conflict index for %s\n" msgstr "" -#: lib/rpmdb.c:569 +#: lib/rpmdb.c:586 #, c-format msgid "removing file index for %s\n" msgstr "" -#: lib/rpmdb.c:578 +#: lib/rpmdb.c:595 msgid "package has no files\n" msgstr "" -#: lib/rpmdb.c:660 +#: lib/rpmdb.c:677 msgid "cannot allocate space for database" msgstr "" -#: lib/rpmdb.c:719 +#: lib/rpmdb.c:736 #, c-format msgid "cannot read header at %d for update" msgstr "" -#: lib/rpmdb.c:728 +#: lib/rpmdb.c:745 msgid "header changed size!" msgstr "" @@ -3074,7 +3074,7 @@ msgid "Installing %s\n" msgstr "" #. XXX PARANOIA -#: lib/rpmio.c:139 +#: lib/rpmio.c:159 #, c-format msgid "logging into %s as %s, pw %s\n" msgstr "" @@ -3119,59 +3119,59 @@ msgstr "" msgid "Too many args in default line at %s:%d" msgstr "" -#: lib/rpmrc.c:532 +#: lib/rpmrc.c:536 #, c-format msgid "Cannot expand %s" msgstr "" #. XXX Fstrerror -#: lib/rpmrc.c:548 +#: lib/rpmrc.c:552 #, c-format msgid "Unable to open %s for reading: %s." msgstr "" -#: lib/rpmrc.c:586 +#: lib/rpmrc.c:590 #, c-format msgid "Failed to read %s: %s." msgstr "" -#: lib/rpmrc.c:616 +#: lib/rpmrc.c:620 #, c-format msgid "missing ':' at %s:%d" msgstr "" -#: lib/rpmrc.c:633 lib/rpmrc.c:709 +#: lib/rpmrc.c:637 lib/rpmrc.c:713 #, c-format msgid "missing argument for %s at %s:%d" msgstr "" -#: lib/rpmrc.c:650 lib/rpmrc.c:674 +#: lib/rpmrc.c:654 lib/rpmrc.c:678 #, c-format msgid "%s expansion failed at %s:%d \"%s\"" msgstr "" #. XXX Fstrerror -#: lib/rpmrc.c:660 +#: lib/rpmrc.c:664 #, c-format msgid "cannot open %s at %s:%d" msgstr "" -#: lib/rpmrc.c:701 +#: lib/rpmrc.c:705 #, c-format msgid "missing architecture for %s at %s:%d" msgstr "" -#: lib/rpmrc.c:768 +#: lib/rpmrc.c:772 #, c-format msgid "bad option '%s' at %s:%d" msgstr "" -#: lib/rpmrc.c:1130 +#: lib/rpmrc.c:1134 #, c-format msgid "Unknown system: %s\n" msgstr "" -#: lib/rpmrc.c:1131 +#: lib/rpmrc.c:1135 msgid "Please contact rpm-list@redhat.com\n" msgstr "" diff --git a/rpm.c b/rpm.c index 8b57bda..6ae7eb5 100755 --- a/rpm.c +++ b/rpm.c @@ -787,8 +787,14 @@ int main(int argc, const char ** argv) break; case GETOPT_DBPATH: - if (optArg[0] != '/') - argerror(_("arguments to --dbpath must begin with a /")); + switch (urlIsURL(optArg)) { + case URL_IS_UNKNOWN: + if (optArg[0] != '/') + argerror(_("arguments to --dbpath must begin with a /")); + break; + default: + break; + } addMacro(NULL,"_dbpath", NULL, optArg, RMIL_CMDLINE); gotDbpath = 1; break; @@ -896,7 +902,8 @@ int main(int argc, const char ** argv) if (bigMode != MODE_QUERY && bigMode != MODE_INSTALL && bigMode != MODE_UNINSTALL && bigMode != MODE_VERIFY && - bigMode != MODE_INITDB && bigMode != MODE_REBUILDDB && gotDbpath) + bigMode != MODE_INITDB && bigMode != MODE_REBUILDDB && + bigMode != MODE_REBUILD && gotDbpath) argerror(_("--dbpath given for operation that does not use a " "database")); diff --git a/rpmio/macro.c b/rpmio/macro.c index afc0aca..10e329e 100644 --- a/rpmio/macro.c +++ b/rpmio/macro.c @@ -1462,7 +1462,8 @@ rpmGetPath(const char *path, ...) expandMacros(NULL, NULL, buf, sizeof(buf)); for (s = p = buf; *s; s++, p++) { - while (s[0] == '/' && s[1] == '/') s++; + if (!(s > buf && s[-1] == ':')) + while (s[0] == '/' && s[1] == '/') s++; *p = *s; } *p = '\0'; -- 2.7.4