Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/rpm-software-management/createrepo_c.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Mlcoch <tmlcoch@redhat.com>2014-06-04 15:59:59 +0400
committerTomas Mlcoch <tmlcoch@redhat.com>2014-06-04 15:59:59 +0400
commit9ae853c3003e69f449edf4edb513646bf1bd8822 (patch)
treebedae474e6ba7cbf32d0e6a1a54e1cfefb89378f
parent1e5616fa3cc73ccce5b8880d6e6ffc73aae5c91d (diff)
parsepkg: New function cr_package_from_rpm_base()
-rw-r--r--src/parsepkg.c63
-rw-r--r--src/parsepkg.h18
2 files changed, 48 insertions, 33 deletions
diff --git a/src/parsepkg.c b/src/parsepkg.c
index c7fd6ca..1e6cd29 100644
--- a/src/parsepkg.c
+++ b/src/parsepkg.c
@@ -80,7 +80,7 @@ cr_package_parser_cleanup()
g_once(&package_parser_cleanup_once, cr_package_parser_cleanup_once_cb, NULL);
}
-static int
+static gboolean
read_header(const char *filename, Header *hdr, GError **err)
{
assert(filename);
@@ -92,7 +92,7 @@ read_header(const char *filename, Header *hdr, GError **err)
__func__, filename, strerror(errno));
g_set_error(err, CR_PARSEPKG_ERROR, CRE_IO,
"Fopen failed: %s", strerror(errno));
- return CRE_IO;
+ return FALSE;
}
int rc = rpmReadPackageFile(cr_ts, fd, NULL, hdr);
@@ -112,12 +112,31 @@ read_header(const char *filename, Header *hdr, GError **err)
g_set_error(err, CR_PARSEPKG_ERROR, CRE_IO,
"rpmReadPackageFile() error");
Fclose(fd);
- return CRE_IO;
+ return FALSE;
}
}
Fclose(fd);
- return CRE_OK;
+ return TRUE;
+}
+
+cr_Package *
+cr_package_from_rpm_base(const char *filename,
+ int changelog_limit,
+ GError **err)
+{
+ Header hdr;
+ cr_Package *pkg;
+
+ assert(filename);
+ assert(!err || *err == NULL);
+
+ if (!read_header(filename, &hdr, err))
+ return NULL;
+
+ pkg = cr_package_from_header(hdr, changelog_limit, err);
+ headerFree(hdr);
+ return pkg;
}
cr_Package *
@@ -129,6 +148,7 @@ cr_package_from_rpm(const char *filename,
struct stat *stat_buf,
GError **err)
{
+ Header hdr;
cr_Package *pkg = NULL;
const char *checksum_type_str;
GError *tmp_err = NULL;
@@ -138,19 +158,10 @@ cr_package_from_rpm(const char *filename,
checksum_type_str = cr_checksum_name_str(checksum_type);
-
- // Read header
-
- Header hdr;
- read_header(filename, &hdr, &tmp_err);
- if (tmp_err) {
- g_propagate_error(err, tmp_err);
+ if (!read_header(filename, &hdr, err))
return NULL;
- }
-
// Get file stat
-
gint64 mtime;
gint64 size;
@@ -169,9 +180,7 @@ cr_package_from_rpm(const char *filename,
size = stat_buf->st_size;
}
-
// Compute checksum
-
char *checksum = cr_checksum_file(filename, checksum_type, &tmp_err);
if (!checksum) {
g_propagate_prefixed_error(err, tmp_err,
@@ -180,9 +189,7 @@ cr_package_from_rpm(const char *filename,
return NULL;
}
-
// Get header range
-
struct cr_HeaderRangeStruct hdr_r = cr_get_header_byte_range(filename,
&tmp_err);
if (tmp_err) {
@@ -192,14 +199,15 @@ cr_package_from_rpm(const char *filename,
return NULL;
}
-
- // Get package object
-
- pkg = cr_package_from_header(hdr, changelog_limit, &tmp_err);
-
+ // Get a package object
+ pkg = cr_package_from_header(hdr, changelog_limit, err);
+ headerFree(hdr);
+ if (!pkg) {
+ free(checksum);
+ return NULL;
+ }
// Fill missing values
-
pkg->pkgId = cr_safe_string_chunk_insert(pkg->chunk, checksum);
pkg->checksum_type = cr_safe_string_chunk_insert(pkg->chunk, checksum_type_str);
pkg->time_file = mtime;
@@ -210,13 +218,6 @@ cr_package_from_rpm(const char *filename,
pkg->rpm_header_end = hdr_r.end;
free(checksum);
- headerFree(hdr);
-
- if (!pkg) {
- g_propagate_prefixed_error(err, tmp_err,
- "Error while checksum calculation:");
- return NULL;
- }
return pkg;
}
diff --git a/src/parsepkg.h b/src/parsepkg.h
index a988946..2e8f82e 100644
--- a/src/parsepkg.h
+++ b/src/parsepkg.h
@@ -43,7 +43,21 @@ void cr_package_parser_init();
*/
void cr_package_parser_cleanup();
-/** Generate package object from package file.
+/** Generate a package object from a package file.
+ * Some attributes like pkgId (checksum), checksum_type, time_file,
+ * location_href, location_base, rpm_header_start, rpm_header_end
+ * are not filled.
+ * @param filename filename
+ * @param changelog_limit number of changelogs that will be loaded
+ * @param err GError **
+ * @return cr_Package or NULL on error
+ */
+cr_Package *
+cr_package_from_rpm_base(const char *filename,
+ int changelog_limit,
+ GError **err);
+
+/** Generate a package object from a package file.
* @param filename filename
* @param checksum_type type of checksum to be used
* @param location_href package location inside repository
@@ -52,7 +66,7 @@ void cr_package_parser_cleanup();
* @param stat_buf struct stat of the filename
* (optional - could be NULL)
* @param err GError **
- * @return cr_Package
+ * @return cr_Package or NULL on error
*/
cr_Package *cr_package_from_rpm(const char *filename,
cr_ChecksumType checksum_type,