split filename in pkg structure and fix some leaks
authorTomas Mlcoch <tmlcoch@redhat.com>
Mon, 16 Jan 2012 11:59:11 +0000 (12:59 +0100)
committerTomas Mlcoch <tmlcoch@redhat.com>
Mon, 16 Jan 2012 11:59:11 +0000 (12:59 +0100)
package.h
parsehdr.c
parsepkg.c
xml_dump.c

index 93b1b6c..af2ce5f 100644 (file)
--- a/package.h
+++ b/package.h
@@ -14,6 +14,7 @@ typedef struct {
 
 typedef struct {
     char *type;
+    char *path;
     char *name;
 } PackageFile;
 
index 96ac223..a9f0ac4 100644 (file)
@@ -48,6 +48,7 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
     pkg->location_base = location_base;
     pkg->checksum_type = checksum_type;
 
+    rpmtdFreeData(td);
     rpmtdFree(td);
 
 
@@ -55,25 +56,51 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
     // Files
     //
 
+    rpmtd full_filenames = rpmtdNew(); // Only for filenames_hashtable
+    rpmtd indexes   = rpmtdNew();
     rpmtd filenames = rpmtdNew();
     rpmtd fileflags = rpmtdNew();
     rpmtd filemodes = rpmtdNew();
 
     GHashTable *filenames_hashtable = g_hash_table_new(g_str_hash, g_str_equal);
 
-    if (headerGet(hdr, RPMTAG_FILENAMES, filenames, flags) &&
-        headerGet(hdr, RPMTAG_FILEFLAGS, fileflags, flags) &&
-        headerGet(hdr, RPMTAG_FILEMODES, filemodes, flags))
+    rpmtd dirnames = rpmtdNew();
+    int path_index = -1;
+    headerGet(hdr, RPMTAG_DIRNAMES, dirnames,  flags);
+
+    if (headerGet(hdr, RPMTAG_FILENAMES,  full_filenames,  flags) &&
+        headerGet(hdr, RPMTAG_DIRINDEXES, indexes,  flags) &&
+        headerGet(hdr, RPMTAG_BASENAMES,  filenames, flags) &&
+        headerGet(hdr, RPMTAG_FILEFLAGS,  fileflags, flags) &&
+        headerGet(hdr, RPMTAG_FILEMODES,  filemodes, flags))
     {
+        rpmtdInit(full_filenames);
+        rpmtdInit(indexes);
         rpmtdInit(filenames);
         rpmtdInit(fileflags);
         rpmtdInit(filemodes);
-        while ((rpmtdNext(filenames) != -1) &&
+        while ((rpmtdNext(full_filenames) != -1)   &&
+               (rpmtdNext(indexes) != -1)   &&
+               (rpmtdNext(filenames) != -1) &&
                (rpmtdNext(fileflags) != -1) &&
                (rpmtdNext(filemodes) != -1))
         {
+            while ((int) rpmtdGetNumber(indexes) > path_index) {
+                path_index++;
+                rpmtdNext(dirnames);
+            }
+
             PackageFile *packagefile = package_file_new();
             packagefile->name = rpmtdGetString(filenames);
+            packagefile->path = rpmtdGetString(dirnames);
+
+            printf("%s | %s\n", packagefile->path, packagefile->name);
+
+            // TODO:
+            // na zaklade toho, ze se zmenila struktura package...
+            // upravit hashovaci tabulku - OK
+            // upravit generovani xmlka - OK
+            // upravit swigovsky bindingy
 
             if (S_ISDIR(rpmtdGetNumber(filemodes))) {
                 // Directory
@@ -86,12 +113,20 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
                 packagefile->type = "";
             }
 
-            g_hash_table_insert(filenames_hashtable, packagefile->name, packagefile->name);
+            g_hash_table_insert(filenames_hashtable, rpmtdGetString(full_filenames), rpmtdGetString(full_filenames));
             pkg->files = g_slist_prepend(pkg->files, packagefile);
         }
         pkg->files = g_slist_reverse (pkg->files);
+
+        rpmtdFreeData(dirnames);
+        rpmtdFreeData(indexes);
+        rpmtdFreeData(filenames);
+        rpmtdFreeData(fileflags);
+        rpmtdFreeData(filemodes);
     }
 
+    rpmtdFree(dirnames);
+    rpmtdFree(indexes);
     rpmtdFree(filemodes);
 
 
@@ -230,6 +265,10 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
                 }
             }
         }
+
+        rpmtdFreeData(filenames);
+        rpmtdFreeData(fileflags);
+        rpmtdFreeData(fileversions);
     }
 
     pkg->provides  = g_slist_reverse (pkg->provides);
@@ -243,10 +282,16 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
     g_hash_table_remove_all(provided_hashtable);
     g_hash_table_remove_all(ap_hashtable);
 
+    g_hash_table_unref(filenames_hashtable);
+    g_hash_table_unref(provided_hashtable);
+    g_hash_table_unref(ap_hashtable);
+
     rpmtdFree(filenames);
     rpmtdFree(fileflags);
     rpmtdFree(fileversions);
 
+    rpmtdFreeData(full_filenames);
+    rpmtdFree(full_filenames);
 
     //
     // Changelogs
@@ -291,11 +336,14 @@ Package *parse_header(Header hdr, gint64 mtime, gint64 size, const char *checksu
         pkg->changelogs = g_slist_reverse (pkg->changelogs);
     }
 
+    rpmtdFreeData(changelogtimes);
+    rpmtdFreeData(changelognames);
+    rpmtdFreeData(changelogtexts);
+
     rpmtdFree(changelogtimes);
     rpmtdFree(changelognames);
     rpmtdFree(changelogtexts);
 
-
     return pkg;
 }
 
index edb5f89..e5d2793 100644 (file)
@@ -94,5 +94,8 @@ struct XmlStruct xml_from_package_file(const char *filename, ChecksumType checks
     free(checksum);
     headerFree(hdr);
 
+    rpmFreeMacros(NULL);
+    rpmFreeRpmrc();
+
     return result;
 }
index c1ddad4..2177e6e 100644 (file)
@@ -4,6 +4,8 @@
 #include "misc.h"
 #include "xml_dump.h"
 
+#define NAMEBUFF_LEN  1024
+
 //#define DEBUG
 #undef DEBUG
 
@@ -84,7 +86,23 @@ dump_files(xmlTextWriterPtr writer, Package *package, int primary,
     for(element = package->files; element; element=element->next) {
         PackageFile *entry = (PackageFile*) element->data;
 
-        if (primary && !is_primary(entry->name, &re)) {
+        // String concatenation (path + basename)
+        char fullname_buffer[NAMEBUFF_LEN];
+        int path_len = strlen(entry->path);
+        int name_len = strlen(entry->name);
+        if ( (path_len + name_len) > (NAMEBUFF_LEN - 1) ) {
+            printf("XML FILE DUMP - ERROR: Pathname + basename is too long: %s%s\n", entry->path, entry->name);
+            if (path_len >= NAMEBUFF_LEN) {
+                path_len = NAMEBUFF_LEN - 1;
+            }
+            name_len = (NAMEBUFF_LEN - 1) - path_len;
+        }
+        strncpy(fullname_buffer, entry->path, path_len);
+        strncpy(fullname_buffer+path_len, entry->name, name_len);
+        fullname_buffer[path_len+name_len] = '\0';
+
+
+        if (primary && !is_primary(fullname_buffer, &re)) {
             continue;
         }
 
@@ -112,7 +130,7 @@ dump_files(xmlTextWriterPtr writer, Package *package, int primary,
         }
 
         // Write text (file path)
-        tmp = ConvertInput(entry->name, handler);
+        tmp = ConvertInput(fullname_buffer, handler);
         if (tmp) {
             xmlTextWriterWriteString(writer, BAD_CAST tmp);
             if (handler && tmp != NULL) xmlFree(tmp);