1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-23 00:08:50 -05:00

Get rid of double / in database paths.

Errors like the following one happen regularly (for unknown reasons...) :
error: could not open file /var/lib/pacman/local//glibc-2.7-9/depends: No
such file or directory

Anyway, every time an user reported an error like that, it always seemed
like he thought the error was caused by the double /, which is obviously
wrong.

Since db->path always include a trailing /, there is no need to add one when
concatenating paths in be_files.c or add.c.
Additionally, some static strings were switched to dynamic.
And the computation of the "dbpath"/"pkgname"-"pkgversion" was refactored
in db_read, db_write and db_remove with a get_pkgpath static function.

Signed-off-by: Xavier Chantry <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Xavier Chantry 2008-05-30 08:52:27 +02:00 committed by Dan McGee
parent fe781e4ce4
commit 0966c33a72
2 changed files with 63 additions and 31 deletions

View File

@ -289,12 +289,12 @@ static int extract_single_file(struct archive *archive,
if(strcmp(entryname, ".INSTALL") == 0) { if(strcmp(entryname, ".INSTALL") == 0) {
/* the install script goes inside the db */ /* the install script goes inside the db */
snprintf(filename, PATH_MAX, "%s/%s-%s/install", db->path, snprintf(filename, PATH_MAX, "%s%s-%s/install", db->path,
newpkg->name, newpkg->version); newpkg->name, newpkg->version);
archive_entry_set_mode(entry, 0644); archive_entry_set_mode(entry, 0644);
} else if(strcmp(entryname, ".CHANGELOG") == 0) { } else if(strcmp(entryname, ".CHANGELOG") == 0) {
/* the changelog goes inside the db */ /* the changelog goes inside the db */
snprintf(filename, PATH_MAX, "%s/%s-%s/changelog", db->path, snprintf(filename, PATH_MAX, "%s%s-%s/changelog", db->path,
newpkg->name, newpkg->version); newpkg->name, newpkg->version);
archive_entry_set_mode(entry, 0644); archive_entry_set_mode(entry, 0644);
} else if(*entryname == '.') { } else if(*entryname == '.') {

View File

@ -123,9 +123,11 @@ int setlastupdate(const pmdb_t *db, time_t time)
int SYMEXPORT alpm_db_update(int force, pmdb_t *db) int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
{ {
alpm_list_t *lp; alpm_list_t *lp;
char path[PATH_MAX]; char *dbfile, *dbfilepath;
time_t newmtime = 0, lastupdate = 0; time_t newmtime = 0, lastupdate = 0;
const char *dbpath; const char *dbpath;
size_t len;
int ret; int ret;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -154,11 +156,15 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
} }
} }
snprintf(path, PATH_MAX, "%s" DBEXT, db->treename); len = strlen(db->treename) + strlen(DBEXT) + 1;
MALLOC(dbfile, len, RET_ERR(PM_ERR_MEMORY, -1));
sprintf(dbfile, "%s" DBEXT, db->treename);
dbpath = alpm_option_get_dbpath(); dbpath = alpm_option_get_dbpath();
ret = _alpm_download_single_file(path, db->servers, dbpath, ret = _alpm_download_single_file(dbfile, db->servers, dbpath,
lastupdate, &newmtime); lastupdate, &newmtime);
free(dbfile);
if(ret == 1) { if(ret == 1) {
/* mtimes match, do nothing */ /* mtimes match, do nothing */
@ -169,9 +175,6 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
_alpm_log(PM_LOG_DEBUG, "failed to sync db: %s\n", alpm_strerrorlast()); _alpm_log(PM_LOG_DEBUG, "failed to sync db: %s\n", alpm_strerrorlast());
return(-1); return(-1);
} else { } else {
/* form the path to the db location */
snprintf(path, PATH_MAX, "%s%s" DBEXT, dbpath, db->treename);
/* remove the old dir */ /* remove the old dir */
_alpm_log(PM_LOG_DEBUG, "flushing database %s\n", db->path); _alpm_log(PM_LOG_DEBUG, "flushing database %s\n", db->path);
for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) { for(lp = _alpm_db_get_pkgcache(db); lp; lp = lp->next) {
@ -186,11 +189,19 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
/* Cache needs to be rebuilt */ /* Cache needs to be rebuilt */
_alpm_db_free_pkgcache(db); _alpm_db_free_pkgcache(db);
/* form the path to the db location */
len = strlen(dbpath) + strlen(db->treename) + strlen(DBEXT) + 1;
MALLOC(dbfilepath, len, RET_ERR(PM_ERR_MEMORY, -1));
sprintf(dbfilepath, "%s%s" DBEXT, dbpath, db->treename);
/* uncompress the sync database */ /* uncompress the sync database */
if(_alpm_unpack(path, db->path, NULL)) { ret = _alpm_unpack(dbfilepath, db->path, NULL);
if(ret) {
free(dbfilepath);
RET_ERR(PM_ERR_SYSTEM, -1); RET_ERR(PM_ERR_SYSTEM, -1);
} }
unlink(path); unlink(dbfilepath);
free(dbfilepath);
/* if we have a new mtime, set the DB last update value */ /* if we have a new mtime, set the DB last update value */
if(newmtime) { if(newmtime) {
@ -293,7 +304,7 @@ int _alpm_db_populate(pmdb_t *db)
continue; continue;
} }
/* stat the entry, make sure it's a directory */ /* stat the entry, make sure it's a directory */
snprintf(path, PATH_MAX, "%s/%s", db->path, name); snprintf(path, PATH_MAX, "%s%s", db->path, name);
if(stat(path, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) { if(stat(path, &sbuf) != 0 || !S_ISDIR(sbuf.st_mode)) {
continue; continue;
} }
@ -329,12 +340,25 @@ int _alpm_db_populate(pmdb_t *db)
return(count); return(count);
} }
/* Note: the return value must be freed by the caller */
static char *get_pkgpath(pmdb_t *db, pmpkg_t *info)
{
size_t len;
char *pkgpath;
len = strlen(db->path) + strlen(info->name) + strlen(info->version) + 3;
MALLOC(pkgpath, len, RET_ERR(PM_ERR_MEMORY, NULL));
sprintf(pkgpath, "%s%s-%s/", db->path, info->name, info->version);
return(pkgpath);
}
int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
{ {
FILE *fp = NULL; FILE *fp = NULL;
struct stat buf; struct stat buf;
char path[PATH_MAX]; char path[PATH_MAX];
char line[513]; char line[513];
char *pkgpath = NULL;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -367,17 +391,18 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* clear out 'line', to be certain - and to make valgrind happy */ /* clear out 'line', to be certain - and to make valgrind happy */
memset(line, 0, 513); memset(line, 0, 513);
snprintf(path, PATH_MAX, "%s/%s-%s", db->path, info->name, info->version); pkgpath = get_pkgpath(db, info);
if(stat(path, &buf)) {
if(stat(pkgpath, &buf)) {
/* directory doesn't exist or can't be opened */ /* directory doesn't exist or can't be opened */
_alpm_log(PM_LOG_DEBUG, "cannot find '%s-%s' in db '%s'\n", _alpm_log(PM_LOG_DEBUG, "cannot find '%s-%s' in db '%s'\n",
info->name, info->version, db->treename); info->name, info->version, db->treename);
return(-1); goto error;
} }
/* DESC */ /* DESC */
if(inforeq & INFRQ_DESC) { if(inforeq & INFRQ_DESC) {
snprintf(path, PATH_MAX, "%s/%s-%s/desc", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sdesc", pkgpath);
if((fp = fopen(path, "r")) == NULL) { if((fp = fopen(path, "r")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
goto error; goto error;
@ -521,7 +546,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* FILES */ /* FILES */
if(inforeq & INFRQ_FILES) { if(inforeq & INFRQ_FILES) {
snprintf(path, PATH_MAX, "%s/%s-%s/files", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sfiles", pkgpath);
if((fp = fopen(path, "r")) == NULL) { if((fp = fopen(path, "r")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
goto error; goto error;
@ -548,7 +573,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* DEPENDS */ /* DEPENDS */
if(inforeq & INFRQ_DEPENDS) { if(inforeq & INFRQ_DEPENDS) {
snprintf(path, PATH_MAX, "%s/%s-%s/depends", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sdepends", pkgpath);
if((fp = fopen(path, "r")) == NULL) { if((fp = fopen(path, "r")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
goto error; goto error;
@ -587,8 +612,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* DELTAS */ /* DELTAS */
if(inforeq & INFRQ_DELTAS) { if(inforeq & INFRQ_DELTAS) {
snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path, snprintf(path, PATH_MAX, "%sdeltas", pkgpath);
info->name, info->version);
if((fp = fopen(path, "r"))) { if((fp = fopen(path, "r"))) {
while(!feof(fp)) { while(!feof(fp)) {
fgets(line, 255, fp); fgets(line, 255, fp);
@ -606,7 +630,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* INSTALL */ /* INSTALL */
if(inforeq & INFRQ_SCRIPTLET) { if(inforeq & INFRQ_SCRIPTLET) {
snprintf(path, PATH_MAX, "%s/%s-%s/install", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sinstall", pkgpath);
if(!stat(path, &buf)) { if(!stat(path, &buf)) {
info->scriptlet = 1; info->scriptlet = 1;
} }
@ -615,9 +639,11 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
/* internal */ /* internal */
info->infolevel |= inforeq; info->infolevel |= inforeq;
free(pkgpath);
return(0); return(0);
error: error:
free(pkgpath);
if(fp) { if(fp) {
fclose(fp); fclose(fp);
} }
@ -632,6 +658,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
alpm_list_t *lp = NULL; alpm_list_t *lp = NULL;
int retval = 0; int retval = 0;
int local = 0; int local = 0;
char *pkgpath = NULL;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -639,9 +666,10 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
return(-1); return(-1);
} }
snprintf(path, PATH_MAX, "%s/%s-%s", db->path, info->name, info->version); pkgpath = get_pkgpath(db, info);
oldmask = umask(0000); oldmask = umask(0000);
mkdir(path, 0755); mkdir(pkgpath, 0755);
/* make sure we have a sane umask */ /* make sure we have a sane umask */
umask(0022); umask(0022);
@ -653,7 +681,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
if(inforeq & INFRQ_DESC) { if(inforeq & INFRQ_DESC) {
_alpm_log(PM_LOG_DEBUG, "writing %s-%s DESC information back to db\n", _alpm_log(PM_LOG_DEBUG, "writing %s-%s DESC information back to db\n",
info->name, info->version); info->name, info->version);
snprintf(path, PATH_MAX, "%s/%s-%s/desc", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sdesc", pkgpath);
if((fp = fopen(path, "w")) == NULL) { if((fp = fopen(path, "w")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
retval = -1; retval = -1;
@ -741,7 +769,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
if(local && (inforeq & INFRQ_FILES)) { if(local && (inforeq & INFRQ_FILES)) {
_alpm_log(PM_LOG_DEBUG, "writing %s-%s FILES information back to db\n", _alpm_log(PM_LOG_DEBUG, "writing %s-%s FILES information back to db\n",
info->name, info->version); info->name, info->version);
snprintf(path, PATH_MAX, "%s/%s-%s/files", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sfiles", pkgpath);
if((fp = fopen(path, "w")) == NULL) { if((fp = fopen(path, "w")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
retval = -1; retval = -1;
@ -769,7 +797,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
if(inforeq & INFRQ_DEPENDS) { if(inforeq & INFRQ_DEPENDS) {
_alpm_log(PM_LOG_DEBUG, "writing %s-%s DEPENDS information back to db\n", _alpm_log(PM_LOG_DEBUG, "writing %s-%s DEPENDS information back to db\n",
info->name, info->version); info->name, info->version);
snprintf(path, PATH_MAX, "%s/%s-%s/depends", db->path, info->name, info->version); snprintf(path, PATH_MAX, "%sdepends", pkgpath);
if((fp = fopen(path, "w")) == NULL) { if((fp = fopen(path, "w")) == NULL) {
_alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno));
retval = -1; retval = -1;
@ -814,6 +842,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
cleanup: cleanup:
umask(oldmask); umask(oldmask);
free(pkgpath);
if(fp) { if(fp) {
fclose(fp); fclose(fp);
@ -824,7 +853,8 @@ cleanup:
int _alpm_db_remove(pmdb_t *db, pmpkg_t *info) int _alpm_db_remove(pmdb_t *db, pmpkg_t *info)
{ {
char path[PATH_MAX]; int ret = 0;
char *pkgpath = NULL;
ALPM_LOG_FUNC; ALPM_LOG_FUNC;
@ -832,12 +862,14 @@ int _alpm_db_remove(pmdb_t *db, pmpkg_t *info)
RET_ERR(PM_ERR_DB_NULL, -1); RET_ERR(PM_ERR_DB_NULL, -1);
} }
snprintf(path, PATH_MAX, "%s%s-%s", db->path, info->name, info->version); pkgpath = get_pkgpath(db, info);
if(_alpm_rmrf(path) == -1) {
return(-1);
}
return(0); ret = _alpm_rmrf(pkgpath);
free(pkgpath);
if(ret != 0) {
ret = -1;
}
return(ret);
} }
/* vim: set ts=2 sw=2 noet: */ /* vim: set ts=2 sw=2 noet: */