Doxygen annotations for config files.
[tools/librpm-tizen.git] / lib / query.c
index f51fc0f..cf3b414 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <rpmbuild.h>
 #include <rpmurl.h>
+#include "manifest.h"
 #include "debug.h"
 
 /*@access Header@*/                    /* XXX compared with NULL */
@@ -28,51 +29,6 @@ static /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
 
 /**
  */
-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,
@@ -88,7 +44,7 @@ static void printFileInfo(char * te, const char * name,
     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) {
@@ -97,8 +53,6 @@ static void printFileInfo(char * te, const char * name,
        nowtm = *tm;    /* structure assignment */
     }
 
-    perms = permsString(mode);
-
     if (owner) 
        strncpy(ownerfield, owner, 8);
     else
@@ -152,7 +106,7 @@ static void printFileInfo(char * te, const char * name,
 
     sprintf(te, "%s %4d %-8s%-8s %10s %s %s", perms,
        (int)nlink, ownerfield, groupfield, sizefield, timefield, namefield);
-    if (perms) free(perms);
+    perms = _free(perms);
 }
 
 /**
@@ -379,7 +333,7 @@ int showQueryPackage(QVA_t *qva, /*@unused@*/rpmdb rpmdb, Header h)
                        _("package has neither file owner or id lists\n"));
            }
 
-           free(filespec);
+           filespec = _free(filespec);
        }
        if (te > t) {
            *te++ = '\n';
@@ -400,13 +354,13 @@ exit:
        }
        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;
 }
 
@@ -442,8 +396,7 @@ printNewSpecfile(Spec spec)
        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));
@@ -453,12 +406,11 @@ printNewSpecfile(Spec spec)
            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);
@@ -539,63 +491,86 @@ int rpmQueryVerify(QVA_t *qva, rpmQVSources source, const char * arg,
 
     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;