Date: Sunday, March 4, 2007 @ 04:08:55 Author: aaron Path: /home/cvs-pacman/pacman-lib/lib/libalpm Modified: add.c (1.123 -> 1.124) alpm.c (1.122 -> 1.123) be_files.c (1.34 -> 1.35) db.c (1.64 -> 1.65) handle.c (1.34 -> 1.35) md5driver.c (1.5 -> 1.6) sha1.c (1.4 -> 1.5) sync.c (1.108 -> 1.109) util.c (1.47 -> 1.48) * Fixed a whole mess of extra '/' pathing issues when a different root is specified * Use db->path when appropriate * Commented out the FAKEROOT checks in libalpm. This should never ever be done. TODO test this quite a bit, as this will never cause the transactions to fail if RW operations are requested... right now it is totally up to the front end to decide when to fail * Use realpath() to canonicalize the root path when specified, so _alpm_makepath() doesn't freak out * Fixed some output/indent of MDFile and SHAFile algorithms * More efficient sprintf() usage in MDFile/SHAFile * Added real error output to _alpm_makepath -------------+ add.c | 2 +- alpm.c | 4 ++-- be_files.c | 4 ++-- db.c | 2 +- handle.c | 57 ++++++++++++++++++++++++++++++++++----------------------- md5driver.c | 20 ++++---------------- sha1.c | 51 +++++++++++++++++++++++++-------------------------- sync.c | 11 ++++++----- util.c | 2 ++ 9 files changed, 77 insertions(+), 76 deletions(-) Index: pacman-lib/lib/libalpm/add.c diff -u pacman-lib/lib/libalpm/add.c:1.123 pacman-lib/lib/libalpm/add.c:1.124 --- pacman-lib/lib/libalpm/add.c:1.123 Sat Mar 3 15:22:48 2007 +++ pacman-lib/lib/libalpm/add.c Sun Mar 4 04:08:54 2007 @@ -816,7 +816,7 @@ /* run the post-install script if it exists */ if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { char pm_install[PATH_MAX]; - snprintf(pm_install, PATH_MAX, "%s%s/%s/%s-%s/install", handle->root, handle->dbpath, db->treename, + snprintf(pm_install, PATH_MAX, "%s%s%s-%s/install", handle->root, db->path, alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg)); if(is_upgrade) { _alpm_runscriptlet(handle->root, pm_install, "post_upgrade", Index: pacman-lib/lib/libalpm/alpm.c diff -u pacman-lib/lib/libalpm/alpm.c:1.122 pacman-lib/lib/libalpm/alpm.c:1.123 --- pacman-lib/lib/libalpm/alpm.c:1.122 Sat Mar 3 03:13:59 2007 +++ pacman-lib/lib/libalpm/alpm.c Sun Mar 4 04:08:54 2007 @@ -299,10 +299,10 @@ _alpm_log(PM_LOG_DEBUG, _("sync: new mtime for %s: %s"), db->treename, newmtime); _alpm_db_setlastupdate(db, newmtime); } - snprintf(path, PATH_MAX, "%s%s/%s" PM_EXT_DB, handle->root, handle->dbpath, db->treename); + snprintf(path, PATH_MAX, "%s%s%s" PM_EXT_DB, handle->root, handle->dbpath, db->treename); /* remove the old dir */ - _alpm_log(PM_LOG_DEBUG, _("flushing database %s%s"), handle->dbpath, db->treename); + _alpm_log(PM_LOG_DEBUG, _("flushing database %s%s"), db->path); for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) { pmpkg_t *pkg = lp->data; if(pkg && _alpm_db_remove(db, pkg) == -1) { Index: pacman-lib/lib/libalpm/be_files.c diff -u pacman-lib/lib/libalpm/be_files.c:1.34 pacman-lib/lib/libalpm/be_files.c:1.35 --- pacman-lib/lib/libalpm/be_files.c:1.34 Sun Mar 4 01:28:48 2007 +++ pacman-lib/lib/libalpm/be_files.c Sun Mar 4 04:08:54 2007 @@ -717,7 +717,7 @@ return(-1); } - snprintf(file, PATH_MAX, "%s%s/%s/.lastupdate", handle->root, handle->dbpath, db->treename); + snprintf(file, PATH_MAX, "%s%s.lastupdate", handle->root, db->path); /* get the last update time, if it's there */ if((fp = fopen(file, "r")) == NULL) { @@ -749,7 +749,7 @@ return(-1); } - snprintf(file, PATH_MAX, "%s%s/%s/.lastupdate", handle->root, handle->dbpath, db->treename); + snprintf(file, PATH_MAX, "%s%s.lastupdate", handle->root, db->path); if((fp = fopen(file, "w")) == NULL) { return(-1); Index: pacman-lib/lib/libalpm/db.c diff -u pacman-lib/lib/libalpm/db.c:1.64 pacman-lib/lib/libalpm/db.c:1.65 --- pacman-lib/lib/libalpm/db.c:1.64 Sat Mar 3 03:13:59 2007 +++ pacman-lib/lib/libalpm/db.c Sun Mar 4 04:08:54 2007 @@ -181,7 +181,7 @@ /* make sure the database directory exists */ snprintf(path, PATH_MAX, "%s%s/%s", handle->root, handle->dbpath, treename); if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) { - _alpm_log(PM_LOG_DEBUG, _("database directory '%s' does not exist -- try creating it"), path); + _alpm_log(PM_LOG_ERROR, _("database directory '%s' does not exist, try creating it"), path); if(_alpm_makepath(path) != 0) { RET_ERR(PM_ERR_SYSTEM, NULL); } Index: pacman-lib/lib/libalpm/handle.c diff -u pacman-lib/lib/libalpm/handle.c:1.34 pacman-lib/lib/libalpm/handle.c:1.35 --- pacman-lib/lib/libalpm/handle.c:1.34 Sun Mar 4 01:28:48 2007 +++ pacman-lib/lib/libalpm/handle.c Sun Mar 4 04:08:55 2007 @@ -56,25 +56,25 @@ #ifndef CYGWIN /* see if we're root or not */ handle->uid = geteuid(); -#ifndef FAKEROOT - if(!handle->uid && getenv("FAKEROOTKEY")) { - /* fakeroot doesn't count, we're non-root */ - handle->uid = 99; - } -#endif - - /* see if we're root or not (fakeroot does not count) */ -#ifndef FAKEROOT - if(handle->uid == 0 && !getenv("FAKEROOTKEY")) { - /* } make vim indent work - stupid ifdef's */ -#else - if(handle->uid == 0) { -#endif - handle->access = PM_ACCESS_RW; - } else { - handle->access = PM_ACCESS_RO; - } -#else +//#ifndef FAKEROOT +// if(!handle->uid && getenv("FAKEROOTKEY")) { +// /* fakeroot doesn't count, we're non-root */ +// handle->uid = 99; +// } +//#endif +// +// /* see if we're root or not (fakeroot does not count) */ +//#ifndef FAKEROOT +// if(handle->uid == 0 && !getenv("FAKEROOTKEY")) { +// /* } make vim indent work - stupid ifdef's */ +//#else +// if(handle->uid == 0) { +//#endif +// handle->access = PM_ACCESS_RW; +// } else { +// handle->access = PM_ACCESS_RO; +// } +//#else handle->access = PM_ACCESS_RW; #endif @@ -152,16 +152,27 @@ void alpm_option_set_root(const char *root) { if(handle->root) FREE(handle->root); - if(root) { + /* According to the man page, realpath is safe to use IFF the second arg is + * NULL. */ + char *realroot = realpath(root, NULL); + if(!realroot) { + realroot = root; + _alpm_log(PM_LOG_ERROR, _("cannot canonicalize specified root path '%s'"), root); + } + + /* check again, in case both are null */ + if(realroot) { /* verify root ends in a '/' */ - int rootlen = strlen(root); - if(root[rootlen-1] != '/') { + int rootlen = strlen(realroot); + if(realroot[rootlen-1] != '/') { rootlen += 1; } handle->root = calloc(rootlen+1, sizeof(char)); - strncpy(handle->root, root, rootlen); + strncpy(handle->root, realroot, rootlen); handle->root[rootlen-1] = '/'; _alpm_log(PM_LOG_DEBUG, _("option 'root' = %s"), handle->root); + + free(realroot); } } Index: pacman-lib/lib/libalpm/md5driver.c diff -u pacman-lib/lib/libalpm/md5driver.c:1.5 pacman-lib/lib/libalpm/md5driver.c:1.6 --- pacman-lib/lib/libalpm/md5driver.c:1.5 Tue Jan 30 03:14:11 2007 +++ pacman-lib/lib/libalpm/md5driver.c Sun Mar 4 04:08:55 2007 @@ -48,7 +48,7 @@ ALPM_LOG_FUNC; if((file = fopen(filename, "rb")) == NULL) { - printf (_("%s can't be opened\n"), filename); + _alpm_log(PM_LOG_ERROR, _("%s can't be opened\n"), filename); } else { char *ret; int i; @@ -59,28 +59,16 @@ } MDFinal(digest, &context); fclose(file); - /*printf("MD5 (%s) = ", filename); - MDPrint(digest); - printf("\n");*/ - ret = (char*)malloc(33); - ret[0] = '\0'; + ret = calloc(33, sizeof(char)); for(i = 0; i < 16; i++) { - sprintf(ret, "%s%02x", ret, digest[i]); + sprintf(ret+(i*2), "%02x", digest[i]); } + _alpm_log(PM_LOG_DEBUG, _("sha1(%s) = %s"), filename, ret); return(ret); } return(NULL); } -/* Prints a message digest in hexadecimal. - */ -void _alpm_MDPrint(unsigned char digest[16]) -{ - unsigned int i; - for (i = 0; i < 16; i++) - printf ("%02x", digest[i]); -} - /* vim: set ts=2 sw=2 noet: */ Index: pacman-lib/lib/libalpm/sha1.c diff -u pacman-lib/lib/libalpm/sha1.c:1.4 pacman-lib/lib/libalpm/sha1.c:1.5 --- pacman-lib/lib/libalpm/sha1.c:1.4 Tue Jan 30 03:14:11 2007 +++ pacman-lib/lib/libalpm/sha1.c Sun Mar 4 04:08:55 2007 @@ -386,35 +386,34 @@ char* _alpm_SHAFile(char *filename) { - FILE *file; - struct sha_ctx context; - int len, i; - unsigned char buffer[1024], digest[20]; - char *ret; - - ALPM_LOG_FUNC; + FILE *file; + struct sha_ctx context; + int len, i; + unsigned char buffer[1024], digest[20]; + char *ret; - if((file = fopen(filename, "rb")) == NULL) { - fprintf(stderr, _("%s can't be opened\n"), filename); - } else { - sha_init_ctx(&context); - while((len = fread(buffer, 1, 1024, file))) { - sha_process_bytes(buffer, len, &context); - } - sha_finish_ctx(&context, digest); - fclose(file); -#ifdef DEBUG - SHAPrint(digest); -#endif - ret = (char*)malloc(41); - ret[0] = '\0'; - for(i = 0; i < 20; i++) { - sprintf(ret, "%s%02x", ret, digest[i]); + ALPM_LOG_FUNC; + + if((file = fopen(filename, "rb")) == NULL) { + _alpm_log(PM_LOG_ERROR, _("sha1: %s can't be opened\n"), filename); + } else { + sha_init_ctx(&context); + while((len = fread(buffer, 1, 1024, file))) { + sha_process_bytes(buffer, len, &context); + } + sha_finish_ctx(&context, digest); + fclose(file); + + ret = (char*)malloc(41); + ret[0] = '\0'; + for(i = 0; i < 20; i++) { + sprintf(ret+(i*2), "%02x", digest[i]); + } + _alpm_log(PM_LOG_DEBUG, _("sha1(%s) = %s"), filename, ret); + return(ret); } - return(ret); - } - return(NULL); + return(NULL); } /* vim: set ts=2 sw=2 noet: */ Index: pacman-lib/lib/libalpm/sync.c diff -u pacman-lib/lib/libalpm/sync.c:1.108 pacman-lib/lib/libalpm/sync.c:1.109 --- pacman-lib/lib/libalpm/sync.c:1.108 Sat Mar 3 20:22:57 2007 +++ pacman-lib/lib/libalpm/sync.c Sun Mar 4 04:08:55 2007 @@ -800,8 +800,8 @@ EVENT(trans, PM_TRANS_EVT_RETRIEVE_START, current->treename, NULL); if(stat(ldir, &buf)) { /* no cache directory.... try creating it */ - _alpm_log(PM_LOG_WARNING, _("no %s cache exists. creating...\n"), ldir); - alpm_logaction(_("warning: no %s cache exists. creating..."), ldir); + _alpm_log(PM_LOG_WARNING, _("no %s cache exists, creating...\n"), ldir); + alpm_logaction(_("warning: no %s cache exists, creating..."), ldir); if(_alpm_makepath(ldir)) { /* couldn't mkdir the cache directory, so fall back to /tmp and unlink * the package afterwards. @@ -840,6 +840,7 @@ sha1sum1 = spkg->sha1sum; if((md5sum1 == NULL) && (sha1sum1 == NULL)) { + /* TODO wtf is this? malloc'd strings for error messages? */ if((ptr = (char *)malloc(512)) == NULL) { RET_ERR(PM_ERR_MEMORY, -1); } @@ -848,7 +849,7 @@ retval = 1; continue; } - snprintf(str, PATH_MAX, "%s/%s/%s", handle->root, handle->cachedir, pkgname); + snprintf(str, PATH_MAX, "%s%s%s", handle->root, handle->cachedir, pkgname); md5sum2 = _alpm_MDFile(str); sha1sum2 = _alpm_SHAFile(str); if(md5sum2 == NULL && sha1sum2 == NULL) { @@ -872,7 +873,7 @@ } if(doremove) { char str[PATH_MAX]; - snprintf(str, PATH_MAX, "%s%s/%s", handle->root, handle->cachedir, pkgname); + snprintf(str, PATH_MAX, "%s%s%s", handle->root, handle->cachedir, pkgname); unlink(str); snprintf(ptr, 512, _("archive %s was corrupted (bad MD5 or SHA1 checksum)\n"), pkgname); } else { @@ -957,7 +958,7 @@ char str[PATH_MAX]; fname = alpm_pkg_get_filename(spkg); - snprintf(str, PATH_MAX, "%s%s/%s", handle->root, handle->cachedir, fname); + snprintf(str, PATH_MAX, "%s%s%s", handle->root, handle->cachedir, fname); if(_alpm_trans_addtarget(tr, str) == -1) { goto error; } Index: pacman-lib/lib/libalpm/util.c diff -u pacman-lib/lib/libalpm/util.c:1.47 pacman-lib/lib/libalpm/util.c:1.48 --- pacman-lib/lib/libalpm/util.c:1.47 Sat Mar 3 03:14:00 2007 +++ pacman-lib/lib/libalpm/util.c Sun Mar 4 04:08:55 2007 @@ -139,6 +139,8 @@ if(mkdir(full, 0755)) { FREE(orig); umask(oldmask); + _alpm_log(PM_LOG_ERROR, _("failed to make path '%s' : %s"), + path, strerror(errno)); return(1); } }