]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Call stat() on open
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Aug 2022 15:49:55 +0000 (15:49 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Aug 2022 15:49:55 +0000 (15:49 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index 842754ad6abe1c2c1a155f06b187a61f17119d35..a8ccfc5f9e398c2d92dac5f7c6e31aad352ac3d7 100644 (file)
@@ -55,6 +55,8 @@ struct pakfire_archive {
 
        char path[PATH_MAX];
        FILE* f;
+       struct stat stat;
+
        struct pakfire_package* package;
 
        // metadata
@@ -564,6 +566,7 @@ ERROR:
 
 static int pakfire_archive_try_open(struct pakfire_archive* archive, const char* path) {
        struct archive* a = NULL;
+       int r;
 
        if (!path)
                return EINVAL;
@@ -578,8 +581,15 @@ static int pakfire_archive_try_open(struct pakfire_archive* archive, const char*
        if (!archive->f)
                return 1;
 
+       // Call stat() on f
+       r = fstat(fileno(archive->f), &archive->stat);
+       if (r) {
+               ERROR(archive->pakfire, "Could not stat archive: %m\n");
+               goto ERROR;
+       }
+
        // Open the archive file for reading.
-       int r = open_archive(archive, &a);
+       r = open_archive(archive, &a);
        if (r)
                goto ERROR;
 
@@ -848,16 +858,7 @@ PAKFIRE_EXPORT int pakfire_archive_verify(struct pakfire_archive* archive, int*
 }
 
 PAKFIRE_EXPORT ssize_t pakfire_archive_get_size(struct pakfire_archive* archive) {
-       struct stat buf;
-
-       int r = fstat(fileno(archive->f), &buf);
-       if (r) {
-               ERROR(archive->pakfire, "Could not stat %s: %m\n", archive->path);
-
-               return -1;
-       }
-
-       return buf.st_size;
+       return archive->stat.st_size;
 }
 
 int pakfire_archive_check_digest(struct pakfire_archive* archive,