[Frugalware-darcs] pacman: pacman: libarchive integration - part 2

Christian Hamar alias krix krics at linuxforum.hu
Mon Dec 26 10:58:35 CET 2005


[pacman: libarchive integration - part 2
Christian Hamar alias krix <krics at linuxforum.hu>**20051209235243
   * Modified all needed source files (i hope :P )
 
] {
hunk ./lib/libalpm/add.c 31
-#include <zlib.h>
-#include <libtar.h>
hunk ./lib/libalpm/add.c 306
-	TAR *tar = NULL;
+	register struct archive *archive;
+	struct archive_entry *entry;
hunk ./lib/libalpm/add.c 320
-		tartype_t gztype = {
-			(openfunc_t)_alpm_gzopen_frontend,
-			(closefunc_t)gzclose,
-			(readfunc_t)gzread,
-			(writefunc_t)gzwrite
-		};
hunk ./lib/libalpm/add.c 400
-			/* Extract the .tar.gz package */
-			if(tar_open(&tar, info->data, &gztype, O_RDONLY, 0, TAR_GNU) == -1) {
+			/* Extract the package */
+			if ((archive = archive_read_new ()) == NULL)
+				RET_ERR(PM_ERR_LIBARCHIVE_ERROR, -1);
+
+			archive_read_support_compression_all (archive);
+			archive_read_support_format_all (archive);
+
+			if (archive_read_open_file (archive, info->data, 10240) != ARCHIVE_OK) {
hunk ./lib/libalpm/add.c 411
-			for(i = 0; !th_read(tar); i++) {
+			chdir(handle->root);
+
+			for(i = 0; archive_read_next_header (archive, &entry) == ARCHIVE_OK; i++) {
hunk ./lib/libalpm/add.c 420
-				STRNCPY(pathname, th_get_pathname(tar), PATH_MAX);
+				STRNCPY(pathname, archive_entry_pathname (entry), PATH_MAX);
hunk ./lib/libalpm/add.c 423
-					tar_skip_regfile(tar);
+					archive_read_data_skip (archive);
hunk ./lib/libalpm/add.c 442
-					tar_skip_regfile(tar);
+					archive_read_data_skip (archive);
hunk ./lib/libalpm/add.c 471
-					if(tar_extract_file(tar, temp)) {
+					
+					archive_entry_set_pathname (entry, temp);
+
+					if(archive_read_extract (archive, entry, ARCHIVE_EXTRACT_FLAGS) != ARCHIVE_OK) {
hunk ./lib/libalpm/add.c 517
+								archive_entry_set_pathname (entry, expath);
hunk ./lib/libalpm/add.c 522
+								archive_entry_set_pathname (entry, expath);
hunk ./lib/libalpm/add.c 527
+								archive_entry_set_pathname (entry, expath);
hunk ./lib/libalpm/add.c 570
+						    archive_entry_set_pathname (entry, expath);
hunk ./lib/libalpm/add.c 598
-					if(tar_extract_file(tar, expath)) {
-						_alpm_log(PM_LOG_ERROR, "could not extract %s (%s)", pathname, strerror(errno));
-						alpm_logaction("could not extract %s (%s)", pathname, strerror(errno));
+					archive_entry_set_pathname (entry, expath);
+					if(archive_read_extract (archive, entry, ARCHIVE_EXTRACT_FLAGS) != ARCHIVE_OK) {
+						_alpm_log(PM_LOG_ERROR, "could not extract %s (%s)", expath, strerror(errno));
+						alpm_logaction("could not extract %s (%s)", expath, strerror(errno));
hunk ./lib/libalpm/add.c 624
-			tar_close(tar);
+			archive_read_finish (archive);
hunk ./lib/libalpm/alpm.h 364
+	PM_ERR_LIBARCHIVE_ERROR,
hunk ./lib/libalpm/error.c 115
+		case PM_ERR_LIBARCHIVE_ERROR:
+			return "libarchive error";
hunk ./lib/libalpm/package.c 28
-#include <libtar.h>
-#include <zlib.h>
hunk ./lib/libalpm/package.c 249
-	TAR *tar;
+	register struct archive *archive;
+	struct archive_entry *entry;
hunk ./lib/libalpm/package.c 252
-	tartype_t gztype = {
-		(openfunc_t)_alpm_gzopen_frontend,
-		(closefunc_t)gzclose,
-		(readfunc_t)gzread,
-		(writefunc_t)gzwrite
-	};
hunk ./lib/libalpm/package.c 257
-	if(tar_open(&tar, pkgfile, &gztype, O_RDONLY, 0, TAR_GNU) == -1) {
-		RET_ERR(PM_ERR_NOT_A_FILE, NULL);
-	}
+	if ((archive = archive_read_new ()) == NULL)
+		RET_ERR(PM_ERR_LIBARCHIVE_ERROR, NULL);
+
+	archive_read_support_compression_all (archive);
+	archive_read_support_format_all (archive);
+
+	if (archive_read_open_file (archive, pkgfile, 10240) != ARCHIVE_OK)
+		RET_ERR(PM_ERR_PKG_OPEN, -1);
hunk ./lib/libalpm/package.c 268
-		tar_close(tar);
+		archive_read_finish (archive);
hunk ./lib/libalpm/package.c 277
-	for(i = 0; !th_read(tar); i++) {
+	for(i = 0; archive_read_next_header (archive, &entry) == ARCHIVE_OK; i++) {
hunk ./lib/libalpm/package.c 289
-			tar_extract_file(tar, descfile);
+			_alpm_archive_read_entry_data_into_fd (archive, file);
hunk ./lib/libalpm/package.c 320
-		} else if(!strcmp(th_get_pathname(tar), "._install") || !strcmp(th_get_pathname(tar), ".INSTALL")) {
+		} else if(!strcmp(archive_entry_pathname (entry), "._install") || !strcmp(archive_entry_pathname (entry),  ".INSTALL")) {
hunk ./lib/libalpm/package.c 323
-		} else if(!strcmp(th_get_pathname(tar), ".FILELIST")) {
+		} else if(!strcmp(archive_entry_pathname (entry), ".FILELIST")) {
hunk ./lib/libalpm/package.c 333
-			tar_extract_file(tar, fn);
+			_alpm_archive_read_entry_data_into_fd (archive, fd);
hunk ./lib/libalpm/package.c 356
-				expath = strdup(th_get_pathname(tar));
+				expath = strdup(archive_entry_pathname (entry));
hunk ./lib/libalpm/package.c 361
-		if(TH_ISREG(tar) && tar_skip_regfile(tar)) {
+		if(archive_read_data_skip (archive)) {
hunk ./lib/libalpm/package.c 367
-	tar_close(tar);
+	archive_read_finish (archive);
hunk ./lib/libalpm/package.c 383
-	tar_close(tar);
+	archive_read_finish (archive);
hunk ./lib/libalpm/sync.c 30
-#include <libtar.h>
-#include <zlib.h>
hunk ./lib/libalpm/sync.c 104
-	TAR *tar = NULL;
-	tartype_t gztype = {
-		(openfunc_t)_alpm_gzopen_frontend,
-		(closefunc_t)gzclose,
-		(readfunc_t)gzread,
-		(writefunc_t)gzwrite
-	};
+	register struct archive *_archive;
+	struct archive_entry *entry;
+	
+        if ((_archive = archive_read_new ()) == NULL) {
+		pm_errno = PM_ERR_LIBARCHIVE_ERROR;
+		goto error;
+	}
+	
+        archive_read_support_compression_all(_archive);
+        archive_read_support_format_all (_archive);
hunk ./lib/libalpm/sync.c 115
-	if(tar_open(&tar, archive, &gztype, O_RDONLY, 0, TAR_GNU) == -1) {
+        if (archive_read_open_file (_archive, archive, 10240) != ARCHIVE_OK) {
hunk ./lib/libalpm/sync.c 118
-	}
+        }
hunk ./lib/libalpm/sync.c 123
-	tar_close(tar);
+	archive_read_finish(_archive);
hunk ./lib/libalpm/sync.c 128
-	if(tar) {
-		tar_close(tar);
+	if(_archive) {
+		archive_read_finish(_archive);
hunk ./lib/libalpm/util.c 38
-#include <zlib.h>
-#include <libtar.h>
hunk ./lib/libalpm/util.c 41
+#include "error.h"
hunk ./lib/libalpm/util.c 44
-/* borrowed and modified from Per Liden's pkgutils (http://crux.nu) */
-long _alpm_gzopen_frontend(char *pathname, int oflags, int mode)
-{
-	char* gzoflags;
-	int fd;
-	gzFile gzf;
-
-	switch (oflags & O_ACCMODE) {
-		case O_WRONLY:
-			gzoflags = "w";
-			break;
-		case O_RDONLY:
-			gzoflags = "r";
-			break;
-		case O_RDWR:
-		default:
-			errno = EINVAL;
-			return -1;
-	}
-	
-	if((fd = open(pathname, oflags, mode)) == -1) {
-		return -1;
-	}
-	if((oflags & O_CREAT) && fchmod(fd, mode)) {
-		close(fd);
-		return -1;
-	}
-	if(!(gzf = gzdopen(fd, gzoflags))) {
-		close(fd);
-		errno = ENOMEM;
-		return -1;
-	}
-
-	return (long)gzf;
-}
-
hunk ./lib/libalpm/util.c 194
+/* Compression functions
+ */
+
hunk ./lib/libalpm/util.c 199
-	TAR *tar = NULL;
+	register struct archive *_archive;
+	struct archive_entry *entry;
hunk ./lib/libalpm/util.c 202
-	tartype_t gztype = {
-		(openfunc_t) _alpm_gzopen_frontend,
-		(closefunc_t)gzclose,
-		(readfunc_t) gzread,
-		(writefunc_t)gzwrite
-	};
hunk ./lib/libalpm/util.c 203
-	/* open the .tar.gz package */
-	if(tar_open(&tar, archive, &gztype, O_RDONLY, 0, TAR_GNU) == -1) {
-		perror(archive);
-		return(1);
-	}
-	while(!th_read(tar)) {
-		if(fn && strcmp(fn, th_get_pathname(tar))) {
-			if(TH_ISREG(tar) && tar_skip_regfile(tar)) {
-				_alpm_log(PM_LOG_ERROR, "bad tar archive: %s", archive);
-				tar_close(tar);
+	if ((_archive = archive_read_new ()) == NULL)
+		RET_ERR(PM_ERR_LIBARCHIVE_ERROR, -1);
+
+	archive_read_support_compression_all(_archive);
+	archive_read_support_format_all (_archive);
+
+	if (archive_read_open_file (_archive, archive, 10240) != ARCHIVE_OK)
+		RET_ERR(PM_ERR_PKG_OPEN, -1);
+
+	while (archive_read_next_header (_archive, &entry) == ARCHIVE_OK) {
+		if (fn && strcmp (fn, archive_entry_pathname (entry))) {
+			if (archive_read_data_skip (_archive) != ARCHIVE_OK)
hunk ./lib/libalpm/util.c 216
-			}
hunk ./lib/libalpm/util.c 218
-		snprintf(expath, PATH_MAX, "%s/%s", prefix, th_get_pathname(tar));
-		if(tar_extract_file(tar, expath)) {
-			_alpm_log(PM_LOG_ERROR, "could not extract %s (%s)", th_get_pathname(tar), strerror(errno));
+		snprintf(expath, PATH_MAX, "%s/%s", prefix, archive_entry_pathname (entry));
+		archive_entry_set_pathname (entry, expath);
+		if (archive_read_extract (_archive, entry, ARCHIVE_EXTRACT_FLAGS) != ARCHIVE_OK) {
+			fprintf(stderr, "could not extract %s: %s\n", archive_entry_pathname (entry), archive_error_string (_archive));
+			 return(1);
hunk ./lib/libalpm/util.c 224
-		if(fn) break;
-	}
-	tar_close(tar);
hunk ./lib/libalpm/util.c 225
+		if (fn)
+			break;
+	}
+	
+	archive_read_finish (_archive);
hunk ./lib/libalpm/util.c 414
+
+int _alpm_archive_read_entry_data_into_fd (struct archive *archive, int file) {
+	register size_t length;
+	char cache [10240];
+
+	if (file == -1)
+		return ARCHIVE_RETRY;
+
+	while ((length = archive_read_data (archive, &cache, sizeof (cache))) > 0)
+		write (file, cache, length);
+
+	return ARCHIVE_OK;
+}
hunk ./lib/libalpm/util.h 25
+#include <archive.h>
+#include <archive_entry.h>
hunk ./lib/libalpm/util.h 48
-long _alpm_gzopen_frontend(char *pathname, int oflags, int mode);
+#define ARCHIVE_EXTRACT_FLAGS ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME
+
+int _alpm_archive_read_entry_data_into_fd (struct archive *archive, int file);
}


More information about the Frugalware-darcs mailing list