From: Tomas Mlcoch Date: Mon, 16 Jan 2012 11:59:11 +0000 (+0100) Subject: split filename in pkg structure and fix some leaks X-Git-Tag: upstream/0.2.1~589 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bc335150486157b71d7a1d7e80992be769b567eb;p=services%2Fcreaterepo_c.git split filename in pkg structure and fix some leaks --- diff --git a/package.h b/package.h index 93b1b6c..af2ce5f 100644 --- a/package.h +++ b/package.h @@ -14,6 +14,7 @@ typedef struct { typedef struct { char *type; + char *path; char *name; } PackageFile; diff --git a/parsehdr.c b/parsehdr.c index 96ac223..a9f0ac4 100644 --- a/parsehdr.c +++ b/parsehdr.c @@ -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; } diff --git a/parsepkg.c b/parsepkg.c index edb5f89..e5d2793 100644 --- a/parsepkg.c +++ b/parsepkg.c @@ -94,5 +94,8 @@ struct XmlStruct xml_from_package_file(const char *filename, ChecksumType checks free(checksum); headerFree(hdr); + rpmFreeMacros(NULL); + rpmFreeRpmrc(); + return result; } diff --git a/xml_dump.c b/xml_dump.c index c1ddad4..2177e6e 100644 --- a/xml_dump.c +++ b/xml_dump.c @@ -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);