Index: package.c =================================================================== RCS file: /home/cvs-pacman/pacman-lib/lib/libalpm/package.c,v retrieving revision 1.42 diff -u -r1.42 package.c --- package.c 22 Nov 2006 09:03:42 -0000 1.42 +++ package.c 29 Dec 2006 20:47:18 -0000 @@ -275,98 +275,72 @@ return(0); } -pmpkg_t *_alpm_pkg_load(char *pkgfile) +/* function for _alpm_pkg_load */ +int _alpm_pkg_checker(archive *archive, archive_entry *entry, pmpkg_t *info, char *pkgfile) { char *expath; - int i; int config = 0; int filelist = 0; int scriptcheck = 0; - register struct archive *archive; - struct archive_entry *entry; - pmpkg_t *info = NULL; - - if(pkgfile == NULL || strlen(pkgfile) == 0) { - RET_ERR(PM_ERR_WRONG_ARGS, 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, ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) - RET_ERR(PM_ERR_PKG_OPEN, NULL); - info = _alpm_pkg_new(NULL, NULL); - if(info == NULL) { - archive_read_finish (archive); - RET_ERR(PM_ERR_MEMORY, NULL); - } - - for(i = 0; archive_read_next_header (archive, &entry) == ARCHIVE_OK; i++) { - if(config && filelist && scriptcheck) { + while ( archive_read_next_header(archive, &entry) == ARCHIVE_OK ) { + if ( config && filelist && scriptcheck ) { /* we have everything we need */ break; - } - if(!strcmp(archive_entry_pathname (entry), ".PKGINFO")) { + } if ( !strcmp(archive_entry_pathname(entry), ".PKGINFO") ) { char *descfile; int fd; /* extract this file into /tmp. it has info for us */ descfile = strdup("/tmp/alpm_XXXXXX"); fd = mkstemp(descfile); - archive_read_data_into_fd (archive, fd); + archive_read_data_into_fd(archive, fd); /* parse the info file */ - if(parse_descfile(descfile, info, 0) == -1) { + if ( parse_descfile(descfile, info, 0) == -1 ) { _alpm_log(PM_LOG_ERROR, _("could not parse the package description file")); pm_errno = PM_ERR_PKG_INVALID; unlink(descfile); FREE(descfile); close(fd); - goto error; - } - if(!strlen(info->name)) { + return -1; + } if ( !strlen(info->name) ) { _alpm_log(PM_LOG_ERROR, _("missing package name in %s"), pkgfile); pm_errno = PM_ERR_PKG_INVALID; unlink(descfile); FREE(descfile); close(fd); - goto error; - } - if(!strlen(info->version)) { + return -1; + } if ( !strlen(info->version) ) { _alpm_log(PM_LOG_ERROR, _("missing package version in %s"), pkgfile); pm_errno = PM_ERR_PKG_INVALID; unlink(descfile); FREE(descfile); close(fd); - goto error; + return -1; } config = 1; unlink(descfile); FREE(descfile); close(fd); continue; - } else if(!strcmp(archive_entry_pathname (entry), "._install") || !strcmp(archive_entry_pathname (entry), ".INSTALL")) { + } else if ( !strcmp(archive_entry_pathname(entry), "._install") || !strcmp(archive_entry_pathname(entry), ".INSTALL") ) { info->scriptlet = 1; scriptcheck = 1; - } else if(!strcmp(archive_entry_pathname (entry), ".FILELIST")) { - /* Build info->files from the filelist */ + } else if ( !strcmp(archive_entry_pathname(entry), ".FILELIST") ) { FILE *fp; char *fn; char *str; int fd; - - if((str = (char *)malloc(PATH_MAX)) == NULL) { - RET_ERR(PM_ERR_MEMORY, (pmpkg_t *)-1); + + if ( (str = (char *)malloc(PATH_MAX)) == NULL ) { + return -2; } fn = strdup("/tmp/alpm_XXXXXX"); - fd = mkstemp(fn); - archive_read_data_into_fd (archive,fd); + fd = mktemp(fn); + archive_read_data_into_fd(archive, fd); fp = fopen(fn, "r"); - while(!feof(fp)) { - if(fgets(str, PATH_MAX, fp) == NULL) { + while ( !feof(fp) ) { + if ( fgets(str, PATH_MAX, fp) == NULL ) { continue; } _alpm_strtrim(str); @@ -374,7 +348,7 @@ } FREE(str); fclose(fp); - if(unlink(fn)) { + if ( unlink(fn) ) { _alpm_log(PM_LOG_WARNING, _("could not remove tempfile %s"), fn); } FREE(fn); @@ -383,39 +357,72 @@ continue; } else { scriptcheck = 1; - if(!filelist) { - /* no .FILELIST present in this package.. build the filelist the */ - /* old-fashioned way, one at a time */ - expath = strdup(archive_entry_pathname (entry)); + if ( !filelist ) { + /* no .FILELIST present in this package.. build the filelist the + * old-fashioned way, one at a time */ + expath = strdup(archive_entry_pathname(entry)); info->files = _alpm_list_add(info->files, expath); } } - if(archive_read_data_skip (archive)) { + if ( archive_read_data_skip(archive) ) { _alpm_log(PM_LOG_ERROR, _("bad package file in %s"), pkgfile); - goto error; + return -1; } expath = NULL; } - archive_read_finish (archive); - - if(!config) { + if ( !config ) { _alpm_log(PM_LOG_ERROR, _("missing package info file in %s"), pkgfile); - goto error; + return -1; } - - /* internal */ + archive_read_finish(archive); info->origin = PKG_FROM_FILE; info->data = strdup(pkgfile); info->infolevel = 0xFF; - return(info); + return 0; +} + +pmpkg_t *_alpm_pkg_load(char *pkgfile) +{ + char *expath; + int i; + int config = 0; + int filelist = 0; + int scriptcheck = 0; + register struct archive *archive; + struct archive_entry *entry; + pmpkg_t *info = NULL; -error: - FREEPKG(info); - archive_read_finish (archive); + if(pkgfile == NULL || strlen(pkgfile) == 0) { + RET_ERR(PM_ERR_WRONG_ARGS, NULL); + } - return(NULL); + if ((archive = archive_read_new ()) == NULL) + RET_ERR(PM_ERR_LIBARCHIVE_ERROR, NULL); + + archive_read_support_compression_gzip (archive); + archive_read_support_format_tar (archive); + + if (archive_read_open_file (archive, pkgfile, ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + RET_ERR(PM_ERR_PKG_OPEN, NULL); + + info = _alpm_pkg_new(NULL, NULL); + if(info == NULL) { + archive_read_finish (archive); + RET_ERR(PM_ERR_MEMORY, NULL); + } + + i = _alpm_pkg_checker(archive, entry, info, pkgfile); + if ( i == -1 ) { + FREEPKG(info); + archive_read_finish(archive); + return(NULL); + } if ( i == -2 ) { + RET_ERR(PM_ERR_MEMORY, (pmpkg_t *)-1); + } + + return(info); }