From 9cccdbb7abc028c32bfe3b215f710b83184d3a50 Mon Sep 17 00:00:00 2001 From: Dusan Durech Date: Thu, 5 Mar 2009 17:43:19 +0100 Subject: The program uses the libzip library --- src/base/archive.c | 60 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 27 deletions(-) (limited to 'src/base') diff --git a/src/base/archive.c b/src/base/archive.c index 0866d2b..cbadae1 100644 --- a/src/base/archive.c +++ b/src/base/archive.c @@ -7,45 +7,63 @@ #include "archive.h" -#define ARCHIVE_BUFFER_SIZE 1024 +#define ARCHIVE_BUFFER_SIZE 4096 #define STR_TMP_FILE_NAME 4096 char *extractFileFromArchive(char *archive, char *filename) { - char buf[ARCHIVE_BUFFER_SIZE]; - char archive_name[STR_TMP_FILE_NAME]; char name[STR_TMP_FILE_NAME]; + char buf[ARCHIVE_BUFFER_SIZE]; - ZZIP_FILE *zip_file; - FILE *file; - zzip_ssize_t len; + struct zip *zipArchive; + struct zip_file *zipFile; - strcpy(archive_name, archive); - sprintf(strrchr(archive_name, '.'), "/%s", filename); + FILE *file; + int len; + int err; sprintf(name, "/tmp/tuxanci%d-%s", getpid(), filename); - if ((zip_file = zzip_open(archive_name, O_RDONLY)) == NULL) { - fprintf(stderr, "No do not open %s archive\n", archive_name); + //printf("ARCHIVE %s %s %s\n", archive, filename, name); + + zipArchive = zip_open(archive, 0, &err); + + if( zipArchive == NULL ) + { + fprintf(stderr, "Archive not open !\n"); + return NULL; + } + + zipFile = zip_fopen(zipArchive, filename, ZIP_FL_UNCHANGED); + + if( zipFile == NULL ) + { + fprintf(stderr, "File from archive not open !\n"); + zip_close(zipArchive); return NULL; } - if ((file = fopen(name, "wb")) == NULL) { + if( (file = fopen(name, "wb") ) == NULL) + { fprintf(stderr, "No do not create temp file %s\n", name); + zip_fclose(zipFile); + zip_close(zipArchive); return NULL; } do { - len = zzip_read(zip_file, buf, ARCHIVE_BUFFER_SIZE); + len = zip_fread(zipFile, buf, ARCHIVE_BUFFER_SIZE); //printf("len = %d\n", len); - if (len > 0) { + if( len > 0 ) + { fwrite(buf, len, 1, file); } - } while (len > 0); + } while( len > 0 ); - zzip_close(zip_file); fclose(file); + zip_fclose(zipFile); + zip_close(zipArchive); return strdup(name); } @@ -55,15 +73,3 @@ void deleteExtractFile(char *s) unlink(s); free(s); } - -#if ARCHIVE_TEST -int main() -{ - char *name; - - name = extractFileFromArchive("hello/a/b/hello"); - printf("name = %s\n", name); - deleteExtractFile(name); - return 0; -} -#endif -- cgit v1.2.3