#include <rpmbuild.h>
#include <rpmurl.h>
+#include "manifest.h"
#include "debug.h"
/*@access Header@*/ /* XXX compared with NULL */
/**
*/
-static char * permsString(int mode)
-{
- char *perms = xstrdup("----------");
-
- if (S_ISDIR(mode))
- perms[0] = 'd';
- else if (S_ISLNK(mode))
- perms[0] = 'l';
- else if (S_ISFIFO(mode))
- perms[0] = 'p';
- else if (S_ISSOCK(mode))
- perms[0] = 's';
- else if (S_ISCHR(mode))
- perms[0] = 'c';
- else if (S_ISBLK(mode))
- perms[0] = 'b';
-
- /*@-unrecog@*/
- if (mode & S_IRUSR) perms[1] = 'r';
- if (mode & S_IWUSR) perms[2] = 'w';
- if (mode & S_IXUSR) perms[3] = 'x';
-
- if (mode & S_IRGRP) perms[4] = 'r';
- if (mode & S_IWGRP) perms[5] = 'w';
- if (mode & S_IXGRP) perms[6] = 'x';
-
- if (mode & S_IROTH) perms[7] = 'r';
- if (mode & S_IWOTH) perms[8] = 'w';
- if (mode & S_IXOTH) perms[9] = 'x';
-
- if (mode & S_ISUID)
- perms[3] = ((mode & S_IXUSR) ? 's' : 'S');
-
- if (mode & S_ISGID)
- perms[6] = ((mode & S_IXGRP) ? 's' : 'S');
-
- if (mode & S_ISVTX)
- perms[9] = ((mode & S_IXOTH) ? 't' : 'T');
- /*@=unrecog@*/
-
- return perms;
-}
-
-/**
- */
static void printFileInfo(char * te, const char * name,
unsigned int size, unsigned short mode,
unsigned int mtime,
static time_t now;
static struct tm nowtm;
const char * namefield = name;
- char * perms;
+ char * perms = rpmPermsString(mode);
/* On first call, grab snapshot of now */
if (now == 0) {
nowtm = *tm; /* structure assignment */
}
- perms = permsString(mode);
-
if (owner)
strncpy(ownerfield, owner, 8);
else
sprintf(te, "%s %4d %-8s%-8s %10s %s %s", perms,
(int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
- if (perms) free(perms);
+ perms = _free(perms);
}
/**
_("package has neither file owner or id lists\n"));
}
- free(filespec);
+ filespec = _free(filespec);
}
if (te > t) {
*te++ = '\n';
}
rpmMessage(RPMMESS_NORMAL, "%s", t);
}
- if (t) free(t);
- if (dirNames) free(dirNames);
- if (baseNames) free(baseNames);
- if (fileLinktoList) free(fileLinktoList);
- if (fileMD5List) free(fileMD5List);
- if (fileOwnerList) free(fileOwnerList);
- if (fileGroupList) free(fileGroupList);
+ t = _free(t);
+ dirNames = headerFreeData(dirNames, -1);
+ baseNames = headerFreeData(baseNames, -1);
+ fileLinktoList = headerFreeData(fileLinktoList, -1);
+ fileMD5List = headerFreeData(fileMD5List, -1);
+ fileOwnerList = headerFreeData(fileOwnerList, -1);
+ fileGroupList = headerFreeData(fileGroupList, -1);
return rc;
}
switch(t->t_tag) {
case RPMTAG_SUMMARY:
case RPMTAG_GROUP:
- free(sl->sl_lines[t->t_startx]);
- sl->sl_lines[t->t_startx] = NULL;
+ sl->sl_lines[t->t_startx] = _free(sl->sl_lines[t->t_startx]);
if (t->t_lang && strcmp(t->t_lang, RPMBUILD_DEFAULT_LANG))
continue;
{ char *buf = xmalloc(strlen(tn) + sizeof(": ") + strlen(msgstr));
break;
case RPMTAG_DESCRIPTION:
for (j = 1; j < t->t_nlines; j++) {
- free(sl->sl_lines[t->t_startx + j]);
- sl->sl_lines[t->t_startx + j] = NULL;
+ sl->sl_lines[t->t_startx + j] =
+ _free(sl->sl_lines[t->t_startx + j]);
}
if (t->t_lang && strcmp(t->t_lang, RPMBUILD_DEFAULT_LANG)) {
- free(sl->sl_lines[t->t_startx]);
- sl->sl_lines[t->t_startx] = NULL;
+ sl->sl_lines[t->t_startx] = _free(sl->sl_lines[t->t_startx]);
continue;
}
sl->sl_lines[t->t_startx + 1] = xstrdup(msgstr);
switch (source) {
case RPMQV_RPM:
- { int argc = 0;
- const char ** argv = NULL;
+ { int ac = 0;
+ const char ** av = NULL;
+ const char * fileURL = NULL;
rpmRC rpmrc;
int i;
- rc = rpmGlob(arg, &argc, &argv);
- if (rc)
- return 1;
- for (i = 0; i < argc; i++) {
+ rc = rpmGlob(arg, &ac, &av);
+ if (rc) return 1;
+
+restart:
+ for (i = 0; i < ac; i++) {
FD_t fd;
- fd = Fopen(argv[i], "r.ufdio");
- if (Ferror(fd)) {
- /* XXX Fstrerror */
- rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), argv[i],
-#ifndef NOTYET
- urlStrerror(argv[i])
-#else
- Fstrerror(fd)
-#endif
- );
+
+ fileURL = _free(fileURL);
+ fileURL = av[i];
+ av[i] = NULL;
+
+ /* Try to read the header from a package file. */
+ fd = Fopen(fileURL, "r.ufdio");
+ if (fd == NULL || Ferror(fd)) {
+ rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), fileURL,
+ Fstrerror(fd));
if (fd) Fclose(fd);
retcode = 1;
break;
}
rpmrc = rpmReadPackageHeader(fd, &h, &isSource, NULL, NULL);
-
Fclose(fd);
- switch (rpmrc) {
- case RPMRC_BADSIZE:
- case RPMRC_OK:
- if (h == NULL) {
- rpmError(RPMERR_QUERY,
+ if (!(rpmrc == RPMRC_OK || rpmrc == RPMRC_BADMAGIC)) {
+ rpmError(RPMERR_QUERY, _("query of %s failed\n"), fileURL);
+ retcode = 1;
+ break;
+ }
+ if (rpmrc == RPMRC_OK && h == NULL) {
+ rpmError(RPMERR_QUERY,
_("old format source packages cannot be queried\n"));
- retcode = 1;
- break;
- }
+ retcode = 1;
+ break;
+ }
+
+ /* Query a package file. */
+ if (rpmrc == RPMRC_OK) {
retcode = showPackage(qva, rpmdb, h);
headerFree(h);
- break;
- case RPMRC_BADMAGIC:
- rpmError(RPMERR_QUERY,
- _("%s does not appear to be a RPM package\n"), argv[i]);
- /*@fallthrough@*/
- case RPMRC_SHORTREAD:
- case RPMRC_FAIL:
- rpmError(RPMERR_QUERY,
- _("query of %s failed\n"), argv[i]);
+ continue;
+ }
+
+ /* Try to read a package manifest. */
+ fd = Fopen(fileURL, "r.fpio");
+ if (fd == NULL || Ferror(fd)) {
+ rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), fileURL,
+ Fstrerror(fd));
+ if (fd) Fclose(fd);
retcode = 1;
break;
}
+
+ /* Read list of packages from manifest. */
+ retcode = rpmReadPackageManifest(fd, &ac, &av);
+ if (retcode) {
+ rpmError(RPMERR_MANIFEST, _("%s: read manifest failed: %s\n"),
+ fileURL, Fstrerror(fd));
+ retcode = 1;
+ }
+ Fclose(fd);
+
+ /* If successful, restart the query loop. */
+ if (retcode == 0)
+ goto restart;
+
+ break;
}
- if (argv) {
- for (i = 0; i < argc; i++)
- argv[i] = _free(argv[i]);
- argv = _free(argv);
+
+ fileURL = _free(fileURL);
+ if (av) {
+ for (i = 0; i < ac; i++)
+ av[i] = _free(av[i]);
+ av = _free(av);
}
} break;