diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/add.c | 20 | ||||
| -rw-r--r-- | lib/libalpm/alpm.c | 9 | ||||
| -rw-r--r-- | lib/libalpm/be_files.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/db.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/deps.c | 5 | ||||
| -rw-r--r-- | lib/libalpm/error.h | 2 | ||||
| -rw-r--r-- | lib/libalpm/remove.c | 3 | ||||
| -rw-r--r-- | lib/libalpm/sync.c | 9 | 
8 files changed, 39 insertions, 13 deletions
| diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 2c33947b..957cd69b 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -206,9 +206,15 @@ error:  	return(-1);  } + +static int name_cmp(const void *p1, const void *p2) +{ +	return(strcmp(((pmpkg_t *)p1)->name, (const char *)p2)); +} +  int _alpm_add_prepare(pmtrans_t *trans, pmdb_t *db, pmlist_t **data)  { -	pmlist_t *lp; +	pmlist_t *lp = NULL, *i = NULL;  	pmlist_t *rmlist = NULL;  	char rm_fname[PATH_MAX];  	pmpkg_t *info = NULL; @@ -236,6 +242,18 @@ int _alpm_add_prepare(pmtrans_t *trans, pmdb_t *db, pmlist_t **data)  		/* no unsatisfied deps, so look for conflicts */  		_alpm_log(PM_LOG_FLOW1, _("looking for conflicts"));  		lp = _alpm_checkconflicts(db, trans->packages); +		for(i = lp; i; i = i->next) { +			int skip_this = 0; +			pmdepmissing_t *miss = i->data; + +			/* Attempt to resolve conflicts */ +			QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, miss->target, miss->depend.name, NULL, &skip_this); +			if(skip_this) { +				pmpkg_t *pkg = NULL; +				lp = _alpm_list_remove(lp, miss->depend.name, name_cmp, (void **)&pkg); +				FREEPKG(pkg); +			} +		}  		if(lp != NULL) {  			if(data) {  				*data = lp; diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 1bda976c..a7fb0a99 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -261,8 +261,13 @@ int alpm_db_update(int force, pmdb_t *db)  	/* Sanity checks */  	ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));  	ASSERT(db != NULL && db != handle->db_local, RET_ERR(PM_ERR_WRONG_ARGS, -1)); -	/* Do not update a database if a transaction is on-going */ -	ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, -1)); +	/* Verify we are in a transaction.  This is done _mainly_ because we need a DB +	 * lock - if we update without a db lock, we may kludge some other pacman +	 * process that _has_ a lock. +	 */ +	ASSERT(handle->trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); +	ASSERT(handle->trans->state == STATE_INITIALIZED, RET_ERR(PM_ERR_TRANS_NOT_INITIALIZED, -1)); +	ASSERT(handle->trans->type == PM_TRANS_TYPE_SYNC, RET_ERR(PM_ERR_TRANS_TYPE, -1));  	if(!_alpm_list_is_in(db, handle->dbs_sync)) {  		RET_ERR(PM_ERR_DB_NOT_FOUND, -1); diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index ccd0b246..24adabb4 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -180,7 +180,7 @@ int _alpm_db_read(pmdb_t *db, unsigned int inforeq, pmpkg_t *info)  	FILE *fp = NULL;  	struct stat buf;  	char path[PATH_MAX+1]; -	char line[513]; +	char line[513] = {0};  	pmlist_t *tmplist;  	char *locale; diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index c3e071b0..6cb6fe8f 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -184,7 +184,7 @@ pmdb_t *_alpm_db_register(char *treename, alpm_cb_db_register callback)  		for(i = handle->dbs_sync; i; i = i->next) {  			pmdb_t *sdb = i->data;  			if(strcmp(treename, sdb->treename) == 0) { -				_alpm_log(PM_LOG_DEBUG, _("attempt to re-register the '%s' databse, using existing"), sdb->treename); +				_alpm_log(PM_LOG_DEBUG, _("attempt to re-register the '%s' database, using existing"), sdb->treename);  				return sdb;  			}  		} diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 97c527ab..7b870085 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -332,7 +332,8 @@ pmlist_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, unsigned char op, pmlist  			found=0;  			for(j = tp->requiredby; j; j = j->next) { -				if(!_alpm_list_is_strin((char *)j->data, packages)) { +				char *reqname = j->data; +				if(!_alpm_list_is_strin(reqname, packages)) {  					/* check if a package in trans->packages provides this package */  					for(k=trans->packages; !found && k; k=k->next) {  						pmpkg_t *spkg = NULL; @@ -347,7 +348,7 @@ pmlist_t *_alpm_checkdeps(pmtrans_t *trans, pmdb_t *db, unsigned char op, pmlist  						}  					}  					if(!found) { -						_alpm_log(PM_LOG_DEBUG, _("checkdeps: found %s as required by %s"), (char *)j->data, tp->name); +						_alpm_log(PM_LOG_DEBUG, _("checkdeps: found %s as required by %s"), reqname, tp->name);  						miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_REQUIRED, PM_DEP_MOD_ANY, j->data, NULL);  						if(!_alpm_depmiss_isin(miss, baddeps)) {  							baddeps = _alpm_list_add(baddeps, miss); diff --git a/lib/libalpm/error.h b/lib/libalpm/error.h index 5f53712a..6294f05b 100644 --- a/lib/libalpm/error.h +++ b/lib/libalpm/error.h @@ -22,7 +22,7 @@  #define _ALPM_ERROR_H  #define RET_ERR(err, ret) do { pm_errno = (err); \ -	_alpm_log(PM_LOG_DEBUG, _("returning error %d: %s\n"), err, alpm_strerror(err)); \ +	_alpm_log(PM_LOG_DEBUG, _("returning error %d from %s : %s\n"), err, __func__, alpm_strerror(err)); \  	return(ret); } while(0)  #endif /* _ALPM_ERROR_H */ diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c index 6fce2d35..84c5da2f 100644 --- a/lib/libalpm/remove.c +++ b/lib/libalpm/remove.c @@ -71,7 +71,8 @@ int _alpm_remove_loadtarget(pmtrans_t *trans, pmdb_t *db, char *name)  	}  	if((info = _alpm_db_scan(db, name, INFRQ_ALL)) == NULL) { -		_alpm_log(PM_LOG_ERROR, _("could not find %s in database"), name); +		/* Unimportant - just ignore it if we can't find it */ +		_alpm_log(PM_LOG_DEBUG, _("could not find %s in database"), name);  		RET_ERR(PM_ERR_PKG_NOT_FOUND, -1);  	} diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 470216cb..a2645a38 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -220,7 +220,7 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, pmlist_t *dbs_sync  				local->name, local->version, db->treename, spkg->version);  		} else if(cmp == 0) {  			/* versions are identical */ -		} else if(_alpm_list_is_strin(i->data, handle->ignorepkg)) { +		} else if(_alpm_list_is_strin(spkg->name, handle->ignorepkg)) {  			/* package should be ignored (IgnorePkg) */  			_alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s)"),  				local->name, local->version, spkg->version); @@ -367,10 +367,11 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, pmlist_t *dbs_sync,  /* Helper functions for _alpm_list_remove   */ +/* removed - use pkg_cmp all of the time  static int ptr_cmp(const void *s1, const void *s2)  {  	return(strcmp(((pmsyncpkg_t *)s1)->pkg->name, ((pmsyncpkg_t *)s2)->pkg->name)); -} +}*/  static int pkg_cmp(const void *p1, const void *p2)  { @@ -562,7 +563,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, pmlist_t *dbs_sync, p  							pmsyncpkg_t *rsync = find_pkginsync(rmpkg, trans->packages);  							void *vpkg;  							_alpm_log(PM_LOG_FLOW2, _("removing '%s' from target list"), rmpkg); -							trans->packages = _alpm_list_remove(trans->packages, rsync, ptr_cmp, &vpkg); +							trans->packages = _alpm_list_remove(trans->packages, rsync, pkg_cmp, &vpkg);  							FREESYNC(vpkg);  							continue;  						} @@ -599,7 +600,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, pmlist_t *dbs_sync, p  								/* remove it from the target list */  								void *vpkg;  								_alpm_log(PM_LOG_FLOW2, _("removing '%s' from target list"), miss->depend.name); -								trans->packages = _alpm_list_remove(trans->packages, rsync, ptr_cmp, &vpkg); +								trans->packages = _alpm_list_remove(trans->packages, rsync, pkg_cmp, &vpkg);  								FREESYNC(vpkg);  							}  						} else { | 
