Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Foret <aurelien@archlinux.org>2006-01-26 22:16:57 +0000
committerAurelien Foret <aurelien@archlinux.org>2006-01-26 22:16:57 +0000
commit831ff882ae70e83af0369a6c9a6faf825b8a884a (patch)
treeed34617626d708927a7d9a36873149e71fd126d1
parent18986b1805feb805e3d4da1d94c98ec518836431 (diff)
reworked lock handling (patch from VMiklos <vmiklos@frugalware.org>)
-rw-r--r--lib/libalpm/alpm.c43
-rw-r--r--lib/libalpm/util.c5
2 files changed, 27 insertions, 21 deletions
diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c
index 33faab82..09f8f707 100644
--- a/lib/libalpm/alpm.c
+++ b/lib/libalpm/alpm.c
@@ -50,8 +50,6 @@
#include "handle.h"
#include "alpm.h"
-#define PM_LOCK "/tmp/pacman.lck"
-
/* Globals */
pmhandle_t *handle = NULL;
enum __pmerrno_t pm_errno;
@@ -76,15 +74,6 @@ int alpm_initialize(char *root)
RET_ERR(PM_ERR_MEMORY, -1);
}
- /* lock db */
- if(handle->access == PM_ACCESS_RW) {
- handle->lckfd = _alpm_lckmk(PM_LOCK);
- if(handle->lckfd == -1) {
- FREE(handle);
- RET_ERR(PM_ERR_HANDLE_LOCK, -1);
- }
- }
-
STRNCPY(str, (root) ? root : PM_ROOT, PATH_MAX);
/* add a trailing '/' if there isn't one */
if(str[strlen(str)-1] != '/') {
@@ -105,15 +94,13 @@ int alpm_release()
ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
/* unlock db */
- if(handle->access == PM_ACCESS_RW) {
- if(handle->lckfd != -1) {
- close(handle->lckfd);
- handle->lckfd = -1;
- }
- if(_alpm_lckrm(PM_LOCK)) {
- _alpm_log(PM_LOG_WARNING, "could not remove lock file %s", PM_LOCK);
- alpm_logaction("warning: could not remove lock file %s", PM_LOCK);
- }
+ if(handle->lckfd != -1) {
+ close(handle->lckfd);
+ handle->lckfd = -1;
+ }
+ if(_alpm_lckrm(PM_LOCK) == -1) {
+ _alpm_log(PM_LOG_WARNING, "could not remove lock file %s", PM_LOCK);
+ alpm_logaction("warning: could not remove lock file %s", PM_LOCK);
}
/* close local database */
@@ -664,6 +651,12 @@ int alpm_trans_init(unsigned char type, unsigned char flags, alpm_trans_cb_event
* perform sanity checks on type and flags:
* for instance, we can't set UPGRADE and FRESHEN at the same time */
+ /* lock db */
+ handle->lckfd = _alpm_lckmk(PM_LOCK);
+ if(handle->lckfd == -1) {
+ RET_ERR(PM_ERR_HANDLE_LOCK, -1);
+ }
+
handle->trans = trans_new();
if(handle->trans == NULL) {
RET_ERR(PM_ERR_MEMORY, -1);
@@ -765,6 +758,16 @@ int alpm_trans_release()
FREETRANS(handle->trans);
+ /* unlock db */
+ if(handle->lckfd != -1) {
+ close(handle->lckfd);
+ handle->lckfd = -1;
+ }
+ if(_alpm_lckrm(PM_LOCK) == -1) {
+ _alpm_log(PM_LOG_WARNING, "could not remove lock file %s", PM_LOCK);
+ alpm_logaction("warning: could not remove lock file %s", PM_LOCK);
+ }
+
return(0);
}
/** @} */
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 3458e156..ea189c09 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -225,7 +225,10 @@ int _alpm_lckmk(char *file)
*/
int _alpm_lckrm(char *file)
{
- return(unlink(file) == -1);
+ if(unlink(file) == -1 && errno != ENOENT) {
+ return(-1);
+ }
+ return(0);
}
int _alpm_unpack(char *archive, const char *prefix, const char *fn)