diff --git a/src/pacman/sync.c b/src/pacman/sync.c index e4fe867c..e581579e 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -156,52 +156,44 @@ static int sync_cleancache(int level) static int sync_synctree(list_t *syncs) { - char path[PATH_MAX]; - mode_t oldmask; - list_t *files = NULL; + char *root, *dbpath; list_t *i; - int success = 0; + int ret = 0; + + alpm_get_option(PM_OPT_ROOT, (long *)&root); + alpm_get_option(PM_OPT_DBPATH, (long *)&dbpath); for(i = syncs; i; i = i->next) { + char path[PATH_MAX]; + list_t *files = NULL; sync_t *sync = (sync_t *)i->data; /* build a one-element list */ snprintf(path, PATH_MAX, "%s"PM_EXT_DB, sync->treename); files = list_add(files, strdup(path)); - success = 1; - if(downloadfiles(sync->servers, pmo_dbpath, files)) { + snprintf(path, PATH_MAX, "%s%s", root, dbpath); + + if(downloadfiles(sync->servers, path, files)) { fprintf(stderr, "failed to synchronize %s\n", sync->treename); - success = 0; + FREELIST(files); + ret--; + continue; } FREELIST(files); - snprintf(path, PATH_MAX, "%s/%s"PM_EXT_DB, pmo_dbpath, sync->treename); - if(success) { - char ldir[PATH_MAX]; - - snprintf(ldir, PATH_MAX, "%s/%s", pmo_dbpath, sync->treename); - /* remove the old dir */ - vprint("removing %s (if it exists)\n", ldir); - rmrf(ldir); - - /* make the new dir */ - oldmask = umask(0000); - mkdir(ldir, 0755); - umask(oldmask); - - /* uncompress the sync database */ - vprint("Unpacking %s...\n", path); - if(unpack(path, ldir, NULL)) { - return(1); - } + snprintf(path, PATH_MAX, "%s%s/%s"PM_EXT_DB, root, dbpath, sync->treename); + if(alpm_db_update(sync->treename, path) == -1) { + fprintf(stderr, "error: %s\n", alpm_strerror(pm_errno)); + ret--; } + /* remove the .tar.gz */ unlink(path); } - return(!success); + return(ret); } static int sync_search(list_t *syncs, list_t *targets) diff --git a/src/pacman/util.c b/src/pacman/util.c index 56c3349b..5ae26149 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -28,84 +28,11 @@ #include #include #include -#include -#include +#include /* pacman */ #include "util.h" -/* borrowed and modified from Per Liden's pkgutils (http://crux.nu) */ -long 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)) { - return -1; - } - if(!(gzf = gzdopen(fd, gzoflags))) { - errno = ENOMEM; - return -1; - } - - return (long)gzf; -} - -int unpack(char *archive, const char *prefix, const char *fn) -{ - TAR *tar = NULL; - char expath[PATH_MAX]; - tartype_t gztype = { - (openfunc_t) gzopen_frontend, - (closefunc_t)gzclose, - (readfunc_t) gzread, - (writefunc_t)gzwrite - }; - - /* 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)) { - char errorstr[255]; - snprintf(errorstr, 255, "bad tar archive: %s", archive); - perror(errorstr); - tar_close(tar); - return(1); - } - continue; - } - snprintf(expath, PATH_MAX, "%s/%s", prefix, th_get_pathname(tar)); - if(tar_extract_file(tar, expath)) { - fprintf(stderr, "could not extract %s: %s\n", th_get_pathname(tar), strerror(errno)); - } - if(fn) break; - } - tar_close(tar); - - return(0); -} - /* does the same thing as 'mkdir -p' */ int makepath(char *path) { diff --git a/src/pacman/util.h b/src/pacman/util.h index 15ce8043..b181dbd1 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -26,10 +26,8 @@ fprintf(stderr, "malloc failure: could not allocate %d bytes\n", b); \ exit(1); }} else p = NULL; } while(0) -#define FREE(p) do { if (p) { free(p); (p)= NULL; }} while(0) +#define FREE(p) do { if (p) { free(p); (p) = NULL; }} while(0) -long gzopen_frontend(char *pathname, int oflags, int mode); -int unpack(char *archive, const char *prefix, const char *fn); int makepath(char *path); int rmrf(char *path); void indentprint(char *str, int indent);