diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/macro.c | 94 | ||||
-rw-r--r-- | lib/rpminstall.c | 78 | ||||
-rw-r--r-- | lib/rpmmacro.h | 28 |
3 files changed, 112 insertions, 88 deletions
diff --git a/lib/macro.c b/lib/macro.c index bf8a5a412..0323f2873 100644 --- a/lib/macro.c +++ b/lib/macro.c @@ -132,7 +132,7 @@ sortMacroTable(MacroContext *mc) } void -dumpMacroTable(MacroContext *mc, FILE *f) +dumpMacroTable(MacroContext * mc, FILE * fp) { int i; int nempty = 0; @@ -140,10 +140,10 @@ dumpMacroTable(MacroContext *mc, FILE *f) if (mc == NULL) mc = &globalMacroContext; - if (f == NULL) - f = stderr; + if (fp == NULL) + fp = stderr; - fprintf(f, "========================\n"); + fprintf(fp, "========================\n"); for (i = 0; i < mc->firstFree; i++) { MacroEntry *me; if ((me = mc->macroTable[i]) == NULL) { @@ -151,16 +151,16 @@ dumpMacroTable(MacroContext *mc, FILE *f) nempty++; continue; } - fprintf(f, "%3d%c %s", me->level, + fprintf(fp, "%3d%c %s", me->level, (me->used > 0 ? '=' : ':'), me->name); if (me->opts && *me->opts) - fprintf(f, "(%s)", me->opts); + fprintf(fp, "(%s)", me->opts); if (me->body && *me->body) - fprintf(f, "\t%s", me->body); - fprintf(f, "\n"); + fprintf(fp, "\t%s", me->body); + fprintf(fp, "\n"); nactive++; } - fprintf(f, _("======================== active %d empty %d\n"), + fprintf(fp, _("======================== active %d empty %d\n"), nactive, nempty); } @@ -1462,32 +1462,14 @@ rpmExpandNumeric(const char *arg) return rc; } -/* Return concatenated and expanded path with multiple /'s removed */ -const char * -rpmGetPath(const char *path, ...) +const char *rpmCleanPath(char * path) { - char buf[BUFSIZ], *t, *te, *se; const char *s; - va_list ap; - - if (path == NULL) - return xstrdup(""); + char *se, *t, *te; - t = buf; - te = stpcpy(t, path); - *te = '\0'; - - va_start(ap, path); - while ((s = va_arg(ap, const char *)) != NULL) { - te = stpcpy(te, s); - *te = '\0'; - } - va_end(ap); - expandMacros(NULL, NULL, buf, sizeof(buf)); - - s = t = te = buf; + s = t = te = path; while (*s) { -/*fprintf(stderr, "*** got \"%.*s\"\trest \"%s\"\n", (t-buf), buf, s); */ +/*fprintf(stderr, "*** got \"%.*s\"\trest \"%s\"\n", (t-path), path, s); */ switch(*s) { case ':': /* handle url's */ if (s[1] == '/' && s[2] == '/') { @@ -1501,37 +1483,37 @@ rpmGetPath(const char *path, ...) ; if (se < t && *se == '/') { te = se; -/*fprintf(stderr, "*** next pdir \"%.*s\"\n", (te-buf), buf); */ +/*fprintf(stderr, "*** next pdir \"%.*s\"\n", (te-path), path); */ } while (s[1] == '/') s++; - while (t > buf && t[-1] == '/') + while (t > path && t[-1] == '/') t--; break; case '.': /* Leading .. is special */ - if (t == buf && s[1] == '.') { + if (t == path && s[1] == '.') { *t++ = *s++; break; } /* Single . is special */ - if (t == buf && s[1] == '\0') { + if (t == path && s[1] == '\0') { break; } /* Trim leading ./ , embedded ./ , trailing /. */ - if ((t == buf || t[-1] == '/') && (s[1] == '/' || s[1] == '\0')) { + if ((t == path || t[-1] == '/') && (s[1] == '/' || s[1] == '\0')) { /*fprintf(stderr, "*** Trim leading ./ , embedded ./ , trailing /.\n"); */ s++; continue; } /* Trim embedded /../ and trailing /.. */ - if (t > buf && t[-1] == '/' && s[1] == '.' && (s[2] == '/' || s[2] == '\0')) { + if (t > path && t[-1] == '/' && s[1] == '.' && (s[2] == '/' || s[2] == '\0')) { t = te; /* Move parent dir forward */ - if (te > buf) - for (--te; te > buf && *te != '/'; te--) + if (te > path) + for (--te; te > path && *te != '/'; te--) ; -/*fprintf(stderr, "*** prev pdir \"%.*s\"\n", (te-buf), buf); */ +/*fprintf(stderr, "*** prev pdir \"%.*s\"\n", (te-path), path); */ s++; s++; continue; @@ -1542,12 +1524,40 @@ rpmGetPath(const char *path, ...) } *t++ = *s++; } + /* Trim trailing / (but leave single / alone) */ - if (t > &buf[1] && t[-1] == '/') + if (t > &path[1] && t[-1] == '/') t--; *t = '\0'; - return xstrdup(buf); + return path; +} + +/* Return concatenated and expanded canonical path. */ +const char * +rpmGetPath(const char *path, ...) +{ + char buf[BUFSIZ]; + const char * s; + char * t, * te; + va_list ap; + + if (path == NULL) + return xstrdup(""); + + t = buf; + te = stpcpy(t, path); + *te = '\0'; + + va_start(ap, path); + while ((s = va_arg(ap, const char *)) != NULL) { + te = stpcpy(te, s); + *te = '\0'; + } + va_end(ap); + expandMacros(NULL, NULL, buf, sizeof(buf)); + + return xstrdup( rpmCleanPath(buf) ); } /* Merge 3 args into path, any or all of which may be a url. */ diff --git a/lib/rpminstall.c b/lib/rpminstall.c index e71778425..18cd2bc53 100644 --- a/lib/rpminstall.c +++ b/lib/rpminstall.c @@ -90,13 +90,14 @@ static void * showProgress(const Header h, const rpmCallbackType what, int rpmInstall(const char * rootdir, const char ** argv, int transFlags, int interfaceFlags, int probFilter, - rpmRelocation * relocations) { + rpmRelocation * relocations) +{ rpmdb db = NULL; FD_t fd; int i; int mode, rc, major; - const char ** packages, ** tmpPackages; - const char ** filename; + const char ** pkgURL, ** tmppkgURL; + const char ** fileURL; int numPackages; int numTmpPackages = 0, numBinaryPackages = 0, numSourcePackages = 0; int numFailed = 0; @@ -108,7 +109,7 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, size_t nb; int notifyFlags = interfaceFlags | (rpmIsVerbose() ? INSTALL_LABEL : 0 ); int dbIsOpen = 0; - const char ** sourcePackages; + const char ** sourceURL; rpmRelocation * defaultReloc; if (transFlags & RPMTRANS_FLAG_TEST) @@ -121,31 +122,31 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, if (defaultReloc && !defaultReloc->newPath) defaultReloc = NULL; rpmMessage(RPMMESS_DEBUG, _("counting packages to install\n")); - for (filename = argv, numPackages = 0; *filename; filename++, numPackages++) + for (fileURL = argv, numPackages = 0; *fileURL; fileURL++, numPackages++) ; rpmMessage(RPMMESS_DEBUG, _("found %d packages\n"), numPackages); nb = (numPackages + 1) * sizeof(char *); - packages = alloca(nb); - memset(packages, 0, nb); - tmpPackages = alloca(nb); - memset(tmpPackages, 0, nb); + pkgURL = alloca(nb); + memset(pkgURL, 0, nb); + tmppkgURL = alloca(nb); + memset(tmppkgURL, 0, nb); nb = (numPackages + 1) * sizeof(Header); rpmMessage(RPMMESS_DEBUG, _("looking for packages to download\n")); - for (filename = argv, i = 0; *filename; filename++) { + for (fileURL = argv, i = 0; *fileURL; fileURL++) { - switch (urlIsURL(*filename)) { + switch (urlIsURL(*fileURL)) { case URL_IS_FTP: case URL_IS_HTTP: - case URL_IS_PATH: { int myrc; const char *tfn; if (rpmIsVerbose()) - fprintf(stdout, _("Retrieving %s\n"), *filename); + fprintf(stdout, _("Retrieving %s\n"), *fileURL); +#ifdef DYING { char tfnbuf[64]; const char * tempfn; strcpy(tfnbuf, "rpm-xfer.XXXXXX"); @@ -168,29 +169,36 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, break; } } +#else + { char tfnbuf[64]; + strcpy(tfnbuf, "rpm-xfer.XXXXXX"); + tfn = rpmGenPath(rootdir, "%{_tmppath}/", mktemp(tfnbuf)); + } +#endif /* XXX undefined %{name}/%{version}/%{release} here */ /* XXX %{_tmpdir} does not exist */ rpmMessage(RPMMESS_DEBUG, _(" ... as %s\n"), tfn); - myrc = urlGetFile(*filename, tfn); + myrc = urlGetFile(*fileURL, tfn); if (myrc < 0) { rpmMessage(RPMMESS_ERROR, _("skipping %s - transfer failed - %s\n"), - *filename, ftpStrerror(myrc)); + *fileURL, ftpStrerror(myrc)); numFailed++; - packages[i] = NULL; + pkgURL[i] = NULL; xfree(tfn); } else { - tmpPackages[numTmpPackages++] = packages[i++] = tfn; + tmppkgURL[numTmpPackages++] = pkgURL[i++] = tfn; } } break; + case URL_IS_PATH: default: - packages[i++] = *filename; + pkgURL[i++] = *fileURL; break; } } - sourcePackages = alloca(sizeof(*sourcePackages) * i); + sourceURL = alloca(sizeof(*sourceURL) * i); rpmMessage(RPMMESS_DEBUG, _("retrieved %d packages\n"), numTmpPackages); @@ -198,13 +206,15 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, are installed right here, only because they don't have headers and would create all sorts of confusion later. */ - for (filename = packages; *filename; filename++) { - fd = Fopen(*filename, "r.ufdio"); + for (fileURL = pkgURL; *fileURL; fileURL++) { + const char * fileName; + (void) urlPath(*fileURL, &fileName); + fd = Fopen(*fileURL, "r.ufdio"); if (Ferror(fd)) { - rpmMessage(RPMMESS_ERROR, _("cannot open file %s: %s\n"), *filename, + rpmMessage(RPMMESS_ERROR, _("cannot open file %s: %s\n"), *fileURL, Fstrerror(fd)); numFailed++; - packages[i] = NULL; + pkgURL[i] = NULL; continue; } @@ -215,16 +225,16 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, Fclose(fd); rpmMessage(RPMMESS_ERROR, _("%s does not appear to be a RPM package\n"), - *filename); + *fileURL); break; default: - rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), *filename); + rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), *fileURL); numFailed++; - packages[i] = NULL; + pkgURL[i] = NULL; break; case 0: if (isSource) { - sourcePackages[numSourcePackages++] = *filename; + sourceURL[numSourcePackages++] = fileName; Fclose(fd); } else { if (!dbIsOpen) { @@ -260,7 +270,7 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, } } - rc = rpmtransAddPackage(rpmdep, h, NULL, *filename, + rc = rpmtransAddPackage(rpmdep, h, NULL, fileName, (interfaceFlags & INSTALL_UPGRADE) != 0, relocations); @@ -272,13 +282,13 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, break; case 1: rpmMessage(RPMMESS_ERROR, - _("error reading from file %s\n"), *filename); + _("error reading from file %s\n"), *fileURL); return numPackages; /*@notreached@*/ break; case 2: rpmMessage(RPMMESS_ERROR, _("file %s requires a newer version of RPM\n"), - *filename); + *fileURL); return numPackages; /*@notreached@*/ break; } @@ -341,10 +351,10 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, if (numSourcePackages && !stopInstall) { for (i = 0; i < numSourcePackages; i++) { - fd = Fopen(sourcePackages[i], "r.ufdio"); + fd = Fopen(sourceURL[i], "r.ufdio"); if (Ferror(fd)) { rpmMessage(RPMMESS_ERROR, _("cannot open file %s: %s\n"), - sourcePackages[i], Fstrerror(fd)); + sourceURL[i], Fstrerror(fd)); continue; } @@ -357,8 +367,8 @@ int rpmInstall(const char * rootdir, const char ** argv, int transFlags, } for (i = 0; i < numTmpPackages; i++) { - unlink(tmpPackages[i]); - xfree(tmpPackages[i]); + Unlink(tmppkgURL[i]); + xfree(tmppkgURL[i]); } /* FIXME how do we close our various fd's? */ diff --git a/lib/rpmmacro.h b/lib/rpmmacro.h index a1d038666..9ad1e5ded 100644 --- a/lib/rpmmacro.h +++ b/lib/rpmmacro.h @@ -33,28 +33,32 @@ typedef /*@abstract@*/ struct MacroContext { extern "C" { #endif -void dumpMacroTable (MacroContext *mc, FILE *f); +void dumpMacroTable (MacroContext * mc, FILE * fp); /* XXX this is used only in build/expression.c and will go away. */ const char *getMacroBody (MacroContext *mc, const char *name); -int expandMacros (void *spec, MacroContext *mc, char *sbuf, size_t sbuflen); -void addMacro (MacroContext *mc, const char *n, const char *o, const char *b, int depth); -void delMacro (MacroContext *mc, const char *n); +int expandMacros (void * spec, MacroContext * mc, char * sbuf, + size_t sbuflen); +void addMacro (MacroContext * mc, const char * n, const char * o, + const char * b, int depth); +void delMacro (MacroContext * mc, const char * n); -int rpmDefineMacro (MacroContext *mc, const char *macro, int level); -void initMacros (MacroContext *mc, const char *macrofile); -void freeMacros (MacroContext *mc); +int rpmDefineMacro (MacroContext * mc, const char * macro, int level); +void initMacros (MacroContext * mc, const char * macrofile); +void freeMacros (MacroContext * mc); #define COMPRESSED_NOT 0 #define COMPRESSED_OTHER 1 #define COMPRESSED_BZIP2 2 -int isCompressed (const char *file, int *compressed); +int isCompressed (const char * file, int * compressed); -char * rpmExpand (const char *arg, ...); -const char *rpmGetPath (const char *path, ...); -const char *rpmGenPath (const char *root, const char *mdir, const char *file); -int rpmExpandNumeric (const char *arg); +char * rpmExpand (const char * arg, ...); +const char *rpmCleanPath(char * path); +const char *rpmGetPath (const char * path, ...); +const char *rpmGenPath (const char * root, const char * mdir, + const char * file); +int rpmExpandNumeric (const char * arg); #ifdef __cplusplus } |