Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=3f57a74efaf1bc74adbf3ff5f9826427ba00d5e4

commit 3f57a74efaf1bc74adbf3ff5f9826427ba00d5e4
Author: Miklos Vajna <[EMAIL PROTECTED]>
Date:   Thu Jun 26 18:15:30 2008 +0200

pacman_db_update(): lock the db while updating it

diff --git a/lib/libpacman/pacman.c b/lib/libpacman/pacman.c
index 5eb0e02..4cabf76 100644
--- a/lib/libpacman/pacman.c
+++ b/lib/libpacman/pacman.c
@@ -315,11 +315,11 @@ int pacman_db_setserver(pmdb_t *db, char *url)
int pacman_db_update(int force, PM_DB *db)
{
pmlist_t *lp;
-       char path[PATH_MAX];
+       char path[PATH_MAX], lckpath[PATH_MAX];
pmlist_t *files = NULL;
char newmtime[16] = "";
char lastupdate[16] = "";
-       int ret, updated=0;
+       int ret, updated=0, status=0;

/* Sanity checks */
ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
@@ -327,6 +327,13 @@ int pacman_db_update(int force, PM_DB *db)
/* Do not update a database if a transaction is on-going */
ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1));

+       /* lock db */
+       snprintf(lckpath, PATH_MAX, "%s/%s", handle->root, PM_LOCK);
+       handle->lckfd = _pacman_lckmk(lckpath);
+       if(handle->lckfd == -1) {
+               RET_ERR(PM_ERR_HANDLE_LOCK, -1);
+       }
+
if(!_pacman_list_is_in(db, handle->dbs_sync)) {
RET_ERR(PM_ERR_DB_NOT_FOUND, -1);
}
@@ -352,7 +359,8 @@ int pacman_db_update(int force, PM_DB *db)
_pacman_log(PM_LOG_DEBUG, _("failed to sync db: %s [%d]\n"),  
pacman_strerror(ret), ret);
pm_errno = PM_ERR_DB_SYNC;
}
-               return(1);
+               status = 1;
+               goto rmlck;
} else {
if(strlen(newmtime)) {
_pacman_log(PM_LOG_DEBUG, _("sync: new mtime for %s: %s\n"), db->treename, 
newmtime);
@@ -377,14 +385,20 @@ int pacman_db_update(int force, PM_DB *db)

/* uncompress the sync database */
if(_pacman_db_install(db, path) == -1) {
-                       return -1;
+                       status = -1;
+                       goto rmlck;
}
if(updated) {
_pacman_db_setlastupdate(db, newmtime);
}
}

-       return(0);
+rmlck:
+       if(_pacman_lckrm(lckpath)) {
+               _pacman_log(PM_LOG_WARNING, _("could not remove lock file %s"), 
path);
+               pacman_logaction(_("warning: could not remove lock file %s"), 
path);
+       }
+       return status;
}

/** Get a package entry from a package database
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to