pkg->location_base = location_base;
pkg->checksum_type = checksum_type;
+ rpmtdFreeData(td);
rpmtdFree(td);
// 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
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);
}
}
}
+
+ rpmtdFreeData(filenames);
+ rpmtdFreeData(fileflags);
+ rpmtdFreeData(fileversions);
}
pkg->provides = g_slist_reverse (pkg->provides);
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
pkg->changelogs = g_slist_reverse (pkg->changelogs);
}
+ rpmtdFreeData(changelogtimes);
+ rpmtdFreeData(changelognames);
+ rpmtdFreeData(changelogtexts);
+
rpmtdFree(changelogtimes);
rpmtdFree(changelognames);
rpmtdFree(changelogtexts);
-
return pkg;
}
#include "misc.h"
#include "xml_dump.h"
+#define NAMEBUFF_LEN 1024
+
//#define DEBUG
#undef DEBUG
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;
}
}
// 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);