mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-22 15:58: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:
parent
fe781e4ce4
commit
0966c33a72
@ -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 == '.') {
|
||||||
|
@ -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: */
|
||||||
|
Loading…
Reference in New Issue
Block a user