diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pacman/Makefile.am | 5 | ||||
| -rw-r--r-- | src/pacman/callback.c | 117 | ||||
| -rw-r--r-- | src/pacman/conf.c | 41 | ||||
| -rw-r--r-- | src/pacman/conf.h | 5 | ||||
| -rw-r--r-- | src/pacman/database.c | 2 | ||||
| -rw-r--r-- | src/pacman/deptest.c | 6 | ||||
| -rw-r--r-- | src/pacman/package.c | 26 | ||||
| -rw-r--r-- | src/pacman/pacman.c | 22 | ||||
| -rw-r--r-- | src/pacman/query.c | 38 | ||||
| -rw-r--r-- | src/pacman/remove.c | 27 | ||||
| -rw-r--r-- | src/pacman/sync.c | 124 | ||||
| -rw-r--r-- | src/pacman/upgrade.c | 24 | ||||
| -rw-r--r-- | src/pacman/util.c | 188 | ||||
| -rw-r--r-- | src/pacman/util.h | 5 | ||||
| -rw-r--r-- | src/util/Makefile.am | 5 | ||||
| -rw-r--r-- | src/util/cleanupdelta.c | 10 | ||||
| -rw-r--r-- | src/util/pacsort.c | 2 | ||||
| -rw-r--r-- | src/util/pactree.c | 43 | ||||
| -rw-r--r-- | src/util/testdb.c | 95 | ||||
| -rw-r--r-- | src/util/testpkg.c | 2 | 
20 files changed, 474 insertions, 313 deletions
| diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am index 3790bdf4..795b2d1a 100644 --- a/src/pacman/Makefile.am +++ b/src/pacman/Makefile.am @@ -17,7 +17,10 @@ DEFS = -DLOCALEDIR=\"@localedir@\" \         -DCACHEDIR=\"$(cachedir)\" \         -DLOGFILE=\"$(logfile)\" \         @DEFS@ -INCLUDES = -I$(top_srcdir)/lib/libalpm + +AM_CPPFLAGS = \ +	-imacros $(top_builddir)/config.h \ +	-I$(top_srcdir)/lib/libalpm  AM_CFLAGS = -pedantic -D_GNU_SOURCE diff --git a/src/pacman/callback.c b/src/pacman/callback.c index c7c16949..0dcdb69d 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -18,13 +18,12 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <sys/time.h>  #include <sys/types.h> /* off_t */ +#include <time.h>  #include <unistd.h>  #include <wchar.h>  #include <limits.h> /* UINT_MAX */ @@ -44,15 +43,19 @@ static off_t list_total = 0.0;  static int on_progress = 0;  static alpm_list_t *output = NULL; -/* Silly little helper function, determines if the caller needs a visual update +/* update speed for the fill_progress based functions */ +#define UPDATE_SPEED_MS 200 + +/** + * Silly little helper function, determines if the caller needs a visual update   * since the last time this function was called. - * This is made for the two progress bar functions, to prevent flicker - * - * first_call indicates if this is the first time it is called, for - * initialization purposes */ -static double get_update_timediff(int first_call) + * This is made for the two progress bar functions, to prevent flicker. + * @param first_call 1 on first call for initialization purposes, 0 otherwise + * @return number of milliseconds since last call + */ +static long get_update_timediff(int first_call)  { -	double retval = 0.0; +	long retval = 0;  	static struct timeval last_time = {0, 0};  	/* on first call, simply set the last time and return */ @@ -60,18 +63,17 @@ static double get_update_timediff(int first_call)  		gettimeofday(&last_time, NULL);  	} else {  		struct timeval this_time; -		double diff_sec, diff_usec; +		time_t diff_sec; +		suseconds_t diff_usec;  		gettimeofday(&this_time, NULL);  		diff_sec = this_time.tv_sec - last_time.tv_sec;  		diff_usec = this_time.tv_usec - last_time.tv_usec; -		retval = diff_sec + (diff_usec / 1000000.0); +		retval = (diff_sec * 1000) + (diff_usec / 1000); -		/* return 0 and do not update last_time if interval was too short */ -		if(retval < UPDATE_SPEED_SEC) { -			retval = 0.0; -		} else { +		/* do not update last_time if interval was too short */ +		if(retval >= UPDATE_SPEED_MS) {  			last_time = this_time;  		}  	} @@ -95,41 +97,41 @@ static void fill_progress(const int bar_percent, const int disp_percent,  	}  	if(hashlen > 0) { -		printf(" ["); +		fputs(" [", stdout);  		for(i = hashlen; i > 0; --i) {  			/* if special progress bar enabled */  			if(config->chomp) {  				if(i > hashlen - hash) { -					printf("-"); +					putchar('-');  				} else if(i == hashlen - hash) {  					if(lasthash == hash) {  						if(mouth) { -							printf("\033[1;33mC\033[m"); +							fputs("\033[1;33mC\033[m", stdout);  						} else { -							printf("\033[1;33mc\033[m"); +							fputs("\033[1;33mc\033[m", stdout);  						}  					} else {  						lasthash = hash;  						mouth = mouth == 1 ? 0 : 1;  						if(mouth) { -							printf("\033[1;33mC\033[m"); +							fputs("\033[1;33mC\033[m", stdout);  						} else { -							printf("\033[1;33mc\033[m"); +							fputs("\033[1;33mc\033[m", stdout);  						}  					} -				} else if(i%3 == 0) { -					printf("\033[0;37mo\033[m"); +				} else if(i % 3 == 0) { +					fputs("\033[0;37mo\033[m", stdout);  				} else { -					printf("\033[0;37m \033[m"); +					fputs("\033[0;37m \033[m", stdout);  				}  			} /* else regular progress bar */  			else if(i > hashlen - hash) { -				printf("#"); +				putchar('#');  			} else { -				printf("-"); +				putchar('-');  			}  		} -		printf("]"); +		putchar(']');  	}  	/* print display percent after progress bar */  	/* 5 = 1 space + 3 digits + 1 % */ @@ -138,9 +140,9 @@ static void fill_progress(const int bar_percent, const int disp_percent,  	}  	if(bar_percent == 100) { -		printf("\n"); +		putchar('\n');  	} else { -		printf("\r"); +		putchar('\r');  	}  	fflush(stdout);  } @@ -196,9 +198,9 @@ void cb_event(alpm_event_t event, void *data1, void *data2)  			break;  		case ALPM_EVENT_UPGRADE_DONE:  			alpm_logaction(config->handle, "upgraded %s (%s -> %s)\n", -			         (char *)alpm_pkg_get_name(data1), -			         (char *)alpm_pkg_get_version(data2), -			         (char *)alpm_pkg_get_version(data1)); +			         alpm_pkg_get_name(data1), +			         alpm_pkg_get_version(data2), +			         alpm_pkg_get_version(data1));  			display_new_optdepends(data2,data1);  			break;  		case ALPM_EVENT_INTEGRITY_START: @@ -227,10 +229,10 @@ void cb_event(alpm_event_t event, void *data1, void *data2)  			printf(_("failed.\n"));  			break;  		case ALPM_EVENT_SCRIPTLET_INFO: -			printf("%s", (char *)data1); +			fputs((const char *)data1, stdout);  			break;  		case ALPM_EVENT_RETRIEVE_START: -			printf(_(":: Retrieving packages from %s...\n"), (char *)data1); +			printf(_(":: Retrieving packages ...\n"));  			break;  		case ALPM_EVENT_DISKSPACE_START:  			if(config->noprogressbar) { @@ -294,10 +296,10 @@ void cb_question(alpm_question_t event, void *data1, void *data2,  			break;  		case ALPM_QUESTION_REMOVE_PKGS:  			{ -				alpm_list_t *unresolved = (alpm_list_t *) data1; +				alpm_list_t *unresolved = data1;  				alpm_list_t *namelist = NULL, *i;  				size_t count = 0; -				for (i = unresolved; i; i = i->next) { +				for(i = unresolved; i; i = i->next) {  					namelist = alpm_list_add(namelist,  							(char *)alpm_pkg_get_name(i->data));  					count++; @@ -317,7 +319,7 @@ void cb_question(alpm_question_t event, void *data1, void *data2,  			break;  		case ALPM_QUESTION_SELECT_PROVIDER:  			{ -				alpm_list_t *providers = (alpm_list_t *)data1; +				alpm_list_t *providers = data1;  				size_t count = alpm_list_count(providers);  				char *depstring = alpm_dep_compute_string((alpm_depend_t *)data2);  				printf(_(":: There are %zd providers available for %s:\n"), count, @@ -340,15 +342,22 @@ void cb_question(alpm_question_t event, void *data1, void *data2,  			*response = yesno(_(":: File %s is corrupted (%s).\n"  						"Do you want to delete it?"),  					(char *)data1, -					alpm_strerror(*(enum _alpm_errno_t *)data2)); +					alpm_strerror(*(alpm_errno_t *)data2));  			break;  		case ALPM_QUESTION_IMPORT_KEY:  			{  				alpm_pgpkey_t *key = data1;  				char created[12]; -				strftime(created, 12, "%Y-%m-%d", localtime(&(key->created))); -				*response = yesno(_(":: Import PGP key %s, \"%s\", created %s?"), -						key->fingerprint, key->uid, created); +				const char *revoked = ""; +				time_t time = (time_t)key->created; +				strftime(created, 12, "%Y-%m-%d", localtime(&time)); + +				if(key->revoked) { +					revoked = " (revoked)"; +				} + +				*response = yesno(_(":: Import PGP key %d%c/%s, \"%s\", created: %s%s?"), +						key->length, key->pubkey_algo, key->fingerprint, key->uid, created, revoked);  			}  			break;  	} @@ -393,7 +402,7 @@ void cb_progress(alpm_progress_t event, const char *pkgname, int percent,  		if(current != prevcurrent) {  			/* update always */  		} else if(!pkgname || percent == prevpercent || -				get_update_timediff(0) < UPDATE_SPEED_SEC) { +				get_update_timediff(0) < UPDATE_SPEED_MS) {  			/* only update the progress bar when we have a package name, the  			 * percentage has changed, and it has been long enough. */  			return; @@ -493,7 +502,7 @@ void cb_progress(alpm_progress_t event, const char *pkgname, int percent,  		alpm_list_t *i = NULL;  		on_progress = 0;  		for(i = output; i; i = i->next) { -			printf("%s", (char *)i->data); +			fputs((const char *)i->data, stdout);  		}  		fflush(stdout);  		FREELIST(output); @@ -528,7 +537,8 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)  	int totaldownload = 0;  	off_t xfered, total; -	double rate = 0.0, timediff = 0.0; +	double rate = 0.0; +	long timediff = 0;  	unsigned int eta_h = 0, eta_m = 0, eta_s = 0;  	double rate_human, xfered_human;  	const char *rate_label, *xfered_label; @@ -587,16 +597,17 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)  	} else if(file_xfered == file_total) {  		/* compute final values */  		struct timeval current_time; -		double diff_sec, diff_usec; +		time_t diff_sec; +		suseconds_t diff_usec;  		gettimeofday(¤t_time, NULL);  		diff_sec = current_time.tv_sec - initial_time.tv_sec;  		diff_usec = current_time.tv_usec - initial_time.tv_usec; -		timediff = diff_sec + (diff_usec / 1000000.0); -		if(timediff > 0.0) { -			rate = xfered / timediff; -			/* round elapsed time to the nearest second */ -			eta_s = (unsigned int)(timediff + 0.5); +		timediff = (diff_sec * 1000) + (diff_usec / 1000); +		if(timediff > 0) { +			rate = (double)xfered / (timediff / 1000.0); +			/* round elapsed time (in ms) to the nearest second */ +			eta_s = (unsigned int)(timediff + 500) / 1000;  		} else {  			eta_s = 0;  		} @@ -604,11 +615,11 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)  		/* compute current average values */  		timediff = get_update_timediff(0); -		if(timediff < UPDATE_SPEED_SEC) { +		if(timediff < UPDATE_SPEED_MS) {  			/* return if the calling interval was too short */  			return;  		} -		rate = (xfered - xfered_last) / timediff; +		rate = (double)(xfered - xfered_last) / (timediff / 1000.0);  		/* average rate to reduce jumpiness */  		rate = (rate + 2 * rate_last) / 3;  		if(rate > 0.0) { @@ -713,7 +724,7 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)  	} else if(eta_h < 100) {  		printf("%02u:%02u:%02u", eta_h, eta_m, eta_s);  	} else { -		printf("--:--"); +		fputs("--:--", stdout);  	}  	free(fname); diff --git a/src/pacman/conf.c b/src/pacman/conf.c index a9f0de91..e1bff189 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <errno.h>  #include <glob.h>  #include <limits.h> @@ -54,6 +52,7 @@ config_t *config_new(void)  	newconfig->op = PM_OP_MAIN;  	newconfig->logmask = ALPM_LOG_ERROR | ALPM_LOG_WARNING;  	newconfig->configfile = strdup(CONFFILE); +	newconfig->deltaratio = 0.0;  	if(alpm_capabilities() & ALPM_CAPABILITY_SIGNATURES) {  		newconfig->siglevel = ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL |  			ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL; @@ -203,11 +202,14 @@ static int download_with_xfercommand(const char *url, const char *localpath,  cleanup:  	/* restore the old cwd if we have it */  	if(cwdfd >= 0) { +		int ret;  		if(fchdir(cwdfd) != 0) {  			pm_printf(ALPM_LOG_ERROR, _("could not restore working directory (%s)\n"),  					strerror(errno));  		} -		close(cwdfd); +		do { +			ret = close(cwdfd); +		} while(ret == -1 && errno == EINTR);  	}  	if(ret == -1) { @@ -256,11 +258,11 @@ static int process_siglevel(alpm_list_t *values, alpm_siglevel_t *storage,  		const char *original = i->data, *value;  		int package = 0, database = 0; -		if (strncmp(original, "Package", strlen("Package")) == 0) { +		if(strncmp(original, "Package", strlen("Package")) == 0) {  			/* only packages are affected, don't flip flags for databases */  			value = original + strlen("Package");  			package = 1; -		} else if (strncmp(original, "Database", strlen("Database")) == 0) { +		} else if(strncmp(original, "Database", strlen("Database")) == 0) {  			/* only databases are affected, don't flip flags for packages */  			value = original + strlen("Database");  			database = 1; @@ -396,8 +398,8 @@ static int _parse_options(const char *key, char *value,  			config->verbosepkglists = 1;  			pm_printf(ALPM_LOG_DEBUG, "config: verbosepkglists\n");  		} else if(strcmp(key, "UseDelta") == 0) { -			config->usedelta = 1; -			pm_printf(ALPM_LOG_DEBUG, "config: usedelta\n"); +			config->deltaratio = 0.7; +			pm_printf(ALPM_LOG_DEBUG, "config: usedelta (default 0.7)\n");  		} else if(strcmp(key, "TotalDownload") == 0) {  			config->totaldownload = 1;  			pm_printf(ALPM_LOG_DEBUG, "config: totaldownload\n"); @@ -428,6 +430,18 @@ static int _parse_options(const char *key, char *value,  			if(!config->arch) {  				config_set_arch(value);  			} +		} else if(strcmp(key, "UseDelta") == 0) { +			double ratio; +			char *endptr; +			ratio = strtod(value, &endptr); +			if(*endptr != '\0' || ratio < 0.0 || ratio > 2.0) { +				pm_printf(ALPM_LOG_ERROR, +						_("config file %s, line %d: invalid value for '%s' : '%s'\n"), +						file, linenum, "UseDelta", value); +				return 1; +			} +			config->deltaratio = ratio; +			pm_printf(ALPM_LOG_DEBUG, "config: usedelta = %f\n", ratio);  		} else if(strcmp(key, "DBPath") == 0) {  			/* don't overwrite a path specified on the command line */  			if(!config->dbpath) { @@ -522,7 +536,7 @@ static int _add_mirror(alpm_db_t *db, char *value)  static int setup_libalpm(void)  {  	int ret = 0; -	enum _alpm_errno_t err; +	alpm_errno_t err;  	alpm_handle_t *handle;  	pm_printf(ALPM_LOG_DEBUG, "setup_libalpm called\n"); @@ -604,7 +618,7 @@ static int setup_libalpm(void)  	alpm_option_set_arch(handle, config->arch);  	alpm_option_set_checkspace(handle, config->checkspace);  	alpm_option_set_usesyslog(handle, config->usesyslog); -	alpm_option_set_usedelta(handle, config->usedelta); +	alpm_option_set_deltaratio(handle, config->deltaratio);  	alpm_option_set_ignorepkgs(handle, config->ignorepkg);  	alpm_option_set_ignoregroups(handle, config->ignoregrp); @@ -659,7 +673,7 @@ static int finish_section(struct section_t *section, int parse_options)  	}  	for(i = section->servers; i; i = alpm_list_next(i)) { -		char *value = alpm_list_getdata(i); +		char *value = i->data;  		if(_add_mirror(db, value) != 0) {  			pm_printf(ALPM_LOG_ERROR,  					_("could not add mirror '%s' to database '%s' (%s)\n"), @@ -725,8 +739,7 @@ static int _parseconfig(const char *file, struct section_t *section,  			*ptr = '\0';  		} -		strtrim(line); -		line_len = strlen(line); +		line_len = strtrim(line);  		if(line_len == 0) {  			continue; @@ -822,7 +835,7 @@ static int _parseconfig(const char *file, struct section_t *section,  			if((ret = _parse_options(key, value, file, linenum)) != 0) {  				goto cleanup;  			} -		} else if (!parse_options && !section->is_options) { +		} else if(!parse_options && !section->is_options) {  			/* ... or in a repo section */  			if(strcmp(key, "Server") == 0) {  				if(value == NULL) { @@ -859,7 +872,7 @@ static int _parseconfig(const char *file, struct section_t *section,  	}  cleanup: -	if (fp) { +	if(fp) {  		fclose(fp);  	}  	pm_printf(ALPM_LOG_DEBUG, "config: finished parsing %s\n", file); diff --git a/src/pacman/conf.h b/src/pacman/conf.h index 9e14925a..481132fa 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -34,7 +34,7 @@ typedef struct __config_t {  	unsigned short print;  	unsigned short checkspace;  	unsigned short usesyslog; -	unsigned short usedelta; +	double deltaratio;  	char *arch;  	char *print_format;  	/* unfortunately, we have to keep track of paths both here and in the library @@ -128,7 +128,8 @@ enum {  	OP_PRINTFORMAT,  	OP_GPGDIR,  	OP_RECURSIVE, -	OP_DBONLY +	OP_DBONLY, +	OP_FORCE  };  /* clean method */ diff --git a/src/pacman/database.c b/src/pacman/database.c index 3e4a672f..b9736618 100644 --- a/src/pacman/database.c +++ b/src/pacman/database.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdio.h>  #include <alpm.h> diff --git a/src/pacman/deptest.c b/src/pacman/deptest.c index 0055c37e..63e7985d 100644 --- a/src/pacman/deptest.c +++ b/src/pacman/deptest.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdio.h>  #include <alpm.h> @@ -36,7 +34,7 @@ int pacman_deptest(alpm_list_t *targets)  	alpm_db_t *localdb = alpm_option_get_localdb(config->handle);  	for(i = targets; i; i = alpm_list_next(i)) { -		char *target = alpm_list_getdata(i); +		char *target = i->data;  		if(!alpm_find_satisfier(alpm_db_get_pkgcache(localdb), target)) {  			deps = alpm_list_add(deps, target); @@ -48,7 +46,7 @@ int pacman_deptest(alpm_list_t *targets)  	}  	for(i = deps; i; i = alpm_list_next(i)) { -		const char *dep = alpm_list_getdata(i); +		const char *dep = i->data;  		printf("%s\n", dep);  	} diff --git a/src/pacman/package.c b/src/pacman/package.c index 12f555a1..233e8e24 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -18,14 +18,13 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdlib.h>  #include <stdio.h>  #include <string.h>  #include <unistd.h>  #include <limits.h>  #include <errno.h> +#include <time.h>  #include <alpm.h>  #include <alpm_list.h> @@ -46,7 +45,7 @@ static void deplist_display(const char *title,  {  	alpm_list_t *i, *text = NULL;  	for(i = deps; i; i = alpm_list_next(i)) { -		alpm_depend_t *dep = alpm_list_getdata(i); +		alpm_depend_t *dep = i->data;  		text = alpm_list_add(text, alpm_dep_compute_string(dep));  	}  	list_display(title, text); @@ -74,11 +73,11 @@ void dump_pkg_full(alpm_pkg_t *pkg, int extra)  	from = alpm_pkg_get_origin(pkg);  	/* set variables here, do all output below */ -	bdate = alpm_pkg_get_builddate(pkg); +	bdate = (time_t)alpm_pkg_get_builddate(pkg);  	if(bdate) {  		strftime(bdatestr, 50, "%c", localtime(&bdate));  	} -	idate = alpm_pkg_get_installdate(pkg); +	idate = (time_t)alpm_pkg_get_installdate(pkg);  	if(idate) {  		strftime(idatestr, 50, "%c", localtime(&idate));  	} @@ -223,7 +222,7 @@ void dump_pkg_backups(alpm_pkg_t *pkg)  	if(alpm_pkg_get_backup(pkg)) {  		/* package has backup files, so print them */  		for(i = alpm_pkg_get_backup(pkg); i; i = alpm_list_next(i)) { -			const alpm_backup_t *backup = alpm_list_getdata(i); +			const alpm_backup_t *backup = i->data;  			const char *value;  			if(!backup->hash) {  				continue; @@ -251,11 +250,16 @@ void dump_pkg_files(alpm_pkg_t *pkg, int quiet)  	for(i = 0; i < pkgfiles->count; i++) {  		const alpm_file_t *file = pkgfiles->files + i; +		/* Regular: '<pkgname> <root><filepath>\n' +		 * Quiet  : '<root><filepath>\n' +		 */  		if(!quiet) { -			printf("%s %s%s\n", pkgname, root, file->name); -		} else { -			printf("%s%s\n", root, file->name); +			fputs(pkgname, stdout); +			putchar(' ');  		} +		fputs(root, stdout); +		fputs(file->name, stdout); +		putchar('\n');  	}  	fflush(stdout); @@ -280,10 +284,10 @@ void dump_pkg_changelog(alpm_pkg_t *pkg)  				/* if we hit the end of the file, we need to add a null terminator */  				*(buf + ret) = '\0';  			} -			printf("%s", buf); +			fputs(buf, stdout);  		}  		alpm_pkg_changelog_close(pkg, fp); -		printf("\n"); +		putchar('\n');  	}  } diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 4c0d69ed..014520e8 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  /* special handling of package version for GIT */  #if defined(GIT_VERSION)  #undef PACKAGE_VERSION @@ -39,9 +37,6 @@  #include <sys/utsname.h> /* uname */  #include <locale.h> /* setlocale */  #include <errno.h> -#if defined(PACMAN_DEBUG) && defined(HAVE_MCHECK_H) -#include <mcheck.h> /* debug tracing (mtrace) */ -#endif  /* alpm */  #include <alpm.h> @@ -180,7 +175,7 @@ static void usage(int op, const char * const myname)  		switch(op) {  			case PM_OP_SYNC:  			case PM_OP_UPGRADE: -				addlist(_("  -f, --force          force install, overwrite conflicting files\n")); +				addlist(_("      --force          force install, overwrite conflicting files\n"));  				addlist(_("      --asdeps         install packages as non-explicitly installed\n"));  				addlist(_("      --asexplicit     install packages as explicitly installed\n"));  				addlist(_("      --ignore <pkg>   ignore a package upgrade (can be used more than once)\n")); @@ -210,8 +205,8 @@ static void usage(int op, const char * const myname)  		addlist(_("      --noconfirm      do not ask for any confirmation\n"));  	}  	list = alpm_list_msort(list, alpm_list_count(list), options_cmp); -	for (i = list; i; i = alpm_list_next(i)) { -		printf("%s", (char *)alpm_list_getdata(i)); +	for(i = list; i; i = alpm_list_next(i)) { +		fputs((const char *)i->data, stdout);  	}  	alpm_list_free(list);  #undef addlist @@ -533,7 +528,7 @@ static int parsearg_upgrade(int opt)  	if(parsearg_trans(opt) == 0)  		return 0;  	switch(opt) { -		case 'f': config->flags |= ALPM_TRANS_FLAG_FORCE; break; +		case OP_FORCE: config->flags |= ALPM_TRANS_FLAG_FORCE; break;  		case OP_ASDEPS: config->flags |= ALPM_TRANS_FLAG_ALLDEPS; break;  		case OP_ASEXPLICIT: config->flags |= ALPM_TRANS_FLAG_ALLEXPLICIT; break;  		case OP_NEEDED: config->flags |= ALPM_TRANS_FLAG_NEEDED; break; @@ -599,7 +594,6 @@ static int parseargs(int argc, char *argv[])  		{"nodeps",     no_argument,       0, 'd'},  		{"deps",       no_argument,       0, 'd'},  		{"explicit",   no_argument,       0, 'e'}, -		{"force",      no_argument,       0, 'f'},  		{"groups",     no_argument,       0, 'g'},  		{"help",       no_argument,       0, 'h'},  		{"info",       no_argument,       0, 'i'}, @@ -625,6 +619,7 @@ static int parseargs(int argc, char *argv[])  		{"config",     required_argument, 0, OP_CONFIG},  		{"ignore",     required_argument, 0, OP_IGNORE},  		{"debug",      optional_argument, 0, OP_DEBUG}, +		{"force",      no_argument,       0, OP_FORCE},  		{"noprogressbar", no_argument,    0, OP_NOPROGRESSBAR},  		{"noscriptlet", no_argument,      0, OP_NOSCRIPTLET},  		{"ask",        required_argument, 0, OP_ASK}, @@ -769,11 +764,6 @@ int main(int argc, char *argv[])  	uid_t myuid = geteuid();  #endif -#if defined(PACMAN_DEBUG) && defined(HAVE_MCHECK_H) -	/*setenv("MALLOC_TRACE","pacman.mtrace", 0);*/ -	mtrace(); -#endif -  	/* Set signal handlers */  	/* Set up the structure to specify the new action. */  	new_action.sa_handler = handler; @@ -905,7 +895,7 @@ int main(int argc, char *argv[])  		printf("DB Path   : %s\n", alpm_option_get_dbpath(config->handle));  		printf("Cache Dirs: ");  		for(i = alpm_option_get_cachedirs(config->handle); i; i = alpm_list_next(i)) { -			printf("%s  ", (char *)alpm_list_getdata(i)); +			printf("%s  ", (const char *)i->data);  		}  		printf("\n");  		printf("Lock File : %s\n", alpm_option_get_lockfile(config->handle)); diff --git a/src/pacman/query.c b/src/pacman/query.c index ab19bab2..66813e35 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdlib.h>  #include <stdio.h>  #include <stdint.h> @@ -143,7 +141,7 @@ static int query_fileowner(alpm_list_t *targets)  		alpm_list_t *i;  		int found = 0; -		filename = strdup(alpm_list_getdata(t)); +		filename = strdup(t->data);  		if(lstat(filename, &buf) == -1) {  			/*  if it is not a path but a program name, then check in PATH */ @@ -193,7 +191,7 @@ static int query_fileowner(alpm_list_t *targets)  		free(dname);  		for(i = alpm_db_get_pkgcache(db_local); i && !found; i = alpm_list_next(i)) { -			alpm_pkg_t *info = alpm_list_getdata(i); +			alpm_pkg_t *info = i->data;  			alpm_filelist_t *filelist = alpm_pkg_get_files(info);  			size_t j; @@ -263,28 +261,28 @@ static int query_search(alpm_list_t *targets)  	for(i = searchlist; i; i = alpm_list_next(i)) {  		alpm_list_t *grp; -		alpm_pkg_t *pkg = alpm_list_getdata(i); +		alpm_pkg_t *pkg = i->data;  		if(!config->quiet) {  			printf("local/%s %s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));  		} else { -			printf("%s", alpm_pkg_get_name(pkg)); +			fputs(alpm_pkg_get_name(pkg), stdout);  		}  		if(!config->quiet) {  			if((grp = alpm_pkg_get_groups(pkg)) != NULL) {  				alpm_list_t *k; -				printf(" ("); +				fputs(" (", stdout);  				for(k = grp; k; k = alpm_list_next(k)) { -					const char *group = alpm_list_getdata(k); -					printf("%s", group); +					const char *group = k->data; +					fputs(group, stdout);  					if(alpm_list_next(k)) {  						/* only print a spacer if there are more groups */ -						printf(" "); +						putchar(' ');  					}  				} -				printf(")"); +				putchar(')');  			}  			/* we need a newline and initial indent first */ @@ -304,33 +302,33 @@ static int query_search(alpm_list_t *targets)  static int query_group(alpm_list_t *targets)  {  	alpm_list_t *i, *j; -	char *grpname = NULL; +	const char *grpname = NULL;  	int ret = 0;  	alpm_db_t *db_local = alpm_option_get_localdb(config->handle);  	if(targets == NULL) {  		for(j = alpm_db_get_groupcache(db_local); j; j = alpm_list_next(j)) { -			alpm_group_t *grp = alpm_list_getdata(j); +			alpm_group_t *grp = j->data;  			const alpm_list_t *p;  			for(p = grp->packages; p; p = alpm_list_next(p)) { -				alpm_pkg_t *pkg = alpm_list_getdata(p); +				alpm_pkg_t *pkg = p->data;  				printf("%s %s\n", grp->name, alpm_pkg_get_name(pkg));  			}  		}  	} else {  		for(i = targets; i; i = alpm_list_next(i)) {  			alpm_group_t *grp; -			grpname = alpm_list_getdata(i); +			grpname = i->data;  			grp = alpm_db_readgroup(db_local, grpname);  			if(grp) {  				const alpm_list_t *p;  				for(p = grp->packages; p; p = alpm_list_next(p)) {  					if(!config->quiet) {  						printf("%s %s\n", grpname, -								alpm_pkg_get_name(alpm_list_getdata(p))); +								alpm_pkg_get_name(p->data));  					} else { -						printf("%s\n", alpm_pkg_get_name(alpm_list_getdata(p))); +						printf("%s\n", alpm_pkg_get_name(p->data));  					}  				}  			} else { @@ -350,7 +348,7 @@ static int is_foreign(alpm_pkg_t *pkg)  	int match = 0;  	for(j = sync_dbs; j; j = alpm_list_next(j)) { -		alpm_db_t *db = alpm_list_getdata(j); +		alpm_db_t *db = j->data;  		alpm_pkg_t *findpkg = alpm_db_get_pkg(db, pkgname);  		if(findpkg) {  			match = 1; @@ -526,7 +524,7 @@ int pacman_query(alpm_list_t *targets)  		}  		for(i = alpm_db_get_pkgcache(db_local); i; i = alpm_list_next(i)) { -			pkg = alpm_list_getdata(i); +			pkg = i->data;  			if(filter(pkg)) {  				int value = display(pkg);  				if(value != 0) { @@ -552,7 +550,7 @@ int pacman_query(alpm_list_t *targets)  	/* operations on named packages in the local DB  	 * valid: no-op (plain -Q), list, info, check */  	for(i = targets; i; i = alpm_list_next(i)) { -		char *strname = alpm_list_getdata(i); +		const char *strname = i->data;  		if(config->op_q_isfile) {  			alpm_pkg_load(config->handle, strname, 1, 0, &pkg); diff --git a/src/pacman/remove.c b/src/pacman/remove.c index 1cdf5d36..3de57695 100644 --- a/src/pacman/remove.c +++ b/src/pacman/remove.c @@ -18,8 +18,7 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" - +#include <fnmatch.h>  #include <stdlib.h>  #include <stdio.h> @@ -31,6 +30,11 @@  #include "util.h"  #include "conf.h" +static int fnmatch_cmp(const void *pattern, const void *string) +{ +	return fnmatch(pattern, string, 0); +} +  static int remove_target(const char *target)  {  	alpm_pkg_t *pkg; @@ -54,7 +58,7 @@ static int remove_target(const char *target)  		return -1;  	}  	for(p = grp->packages; p; p = alpm_list_next(p)) { -		pkg = alpm_list_getdata(p); +		pkg = p->data;  		if(alpm_remove_pkg(config->handle, pkg) == -1) {  			pm_printf(ALPM_LOG_ERROR, "'%s': %s\n", target,  					alpm_strerror(alpm_errno(config->handle))); @@ -89,7 +93,7 @@ int pacman_remove(alpm_list_t *targets)  	/* Step 1: add targets to the created transaction */  	for(i = targets; i; i = alpm_list_next(i)) { -		char *target = alpm_list_getdata(i); +		char *target = i->data;  		char *targ = strchr(target, '/');  		if(targ && strncmp(target, "local", 5) == 0) {  			targ++; @@ -98,25 +102,28 @@ int pacman_remove(alpm_list_t *targets)  		}  		if(remove_target(targ) == -1) {  			retval = 1; -			goto cleanup;  		}  	} +	if(retval == 1) { +		goto cleanup; +	} +  	/* Step 2: prepare the transaction based on its type, targets and flags */  	if(alpm_trans_prepare(config->handle, &data) == -1) { -		enum _alpm_errno_t err = alpm_errno(config->handle); +		alpm_errno_t err = alpm_errno(config->handle);  		pm_printf(ALPM_LOG_ERROR, _("failed to prepare transaction (%s)\n"),  		        alpm_strerror(err));  		switch(err) {  			case ALPM_ERR_PKG_INVALID_ARCH:  				for(i = data; i; i = alpm_list_next(i)) { -					char *pkg = alpm_list_getdata(i); +					const char *pkg = i->data;  					printf(_(":: package %s does not have a valid architecture\n"), pkg);  				}  				break;  			case ALPM_ERR_UNSATISFIED_DEPS:  				for(i = data; i; i = alpm_list_next(i)) { -					alpm_depmissing_t *miss = alpm_list_getdata(i); +					alpm_depmissing_t *miss = i->data;  					char *depstring = alpm_dep_compute_string(miss->depend);  					printf(_(":: %s: requires %s\n"), miss->target, depstring);  					free(depstring); @@ -133,8 +140,8 @@ int pacman_remove(alpm_list_t *targets)  	/* Search for holdpkg in target list */  	int holdpkg = 0;  	for(i = alpm_trans_get_remove(config->handle); i; i = alpm_list_next(i)) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); -		if(alpm_list_find_str(config->holdpkg, alpm_pkg_get_name(pkg))) { +		alpm_pkg_t *pkg = i->data; +		if(alpm_list_find(config->holdpkg, alpm_pkg_get_name(pkg), fnmatch_cmp)) {  			pm_printf(ALPM_LOG_WARNING, _("%s is designated as a HoldPkg.\n"),  							alpm_pkg_get_name(pkg));  			holdpkg = 1; diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 4f10e6b9..e22f94f7 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -95,7 +93,7 @@ static int sync_cleandb(const char *dbpath, int keep_used)  			len = strlen(dname);  			char *dbname = strndup(dname, len - 3);  			for(i = syncdbs; i && !found; i = alpm_list_next(i)) { -				alpm_db_t *db = alpm_list_getdata(i); +				alpm_db_t *db = i->data;  				found = !strcmp(dbname, alpm_db_get_name(db));  			}  			free(dbname); @@ -155,7 +153,7 @@ static int sync_cleancache(int level)  	int ret = 0;  	for(i = cachedirs; i; i = alpm_list_next(i)) { -		printf(_("Cache directory: %s\n"), (char *)alpm_list_getdata(i)); +		printf(_("Cache directory: %s\n"), (const char *)i->data);  	}  	if(!config->cleanmethod) { @@ -183,7 +181,7 @@ static int sync_cleancache(int level)  	}  	for(i = cachedirs; i; i = alpm_list_next(i)) { -		const char *cachedir = alpm_list_getdata(i); +		const char *cachedir = i->data;  		DIR *dir = opendir(cachedir);  		struct dirent *ent; @@ -240,7 +238,7 @@ static int sync_cleancache(int level)  				alpm_list_t *j;  				/* check if this package is in a sync DB */  				for(j = sync_dbs; j && delete; j = alpm_list_next(j)) { -					alpm_db_t *db = alpm_list_getdata(j); +					alpm_db_t *db = j->data;  					pkg = alpm_db_get_pkg(db, local_name);  					if(pkg != NULL && alpm_pkg_vercmp(local_version,  								alpm_pkg_get_version(pkg)) == 0) { @@ -276,7 +274,7 @@ static int sync_synctree(int level, alpm_list_t *syncs)  	int success = 0, ret;  	for(i = syncs; i; i = alpm_list_next(i)) { -		alpm_db_t *db = alpm_list_getdata(i); +		alpm_db_t *db = i->data;  		ret = alpm_db_update((level < 2 ? 0 : 1), db);  		if(ret < 0) { @@ -325,7 +323,7 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)  	alpm_db_t *db_local = alpm_option_get_localdb(config->handle);  	for(i = syncs; i; i = alpm_list_next(i)) { -		alpm_db_t *db = alpm_list_getdata(i); +		alpm_db_t *db = i->data;  		/* if we have a targets list, search for packages matching it */  		if(targets) {  			ret = alpm_db_search(db, targets); @@ -341,28 +339,28 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)  		}  		for(j = ret; j; j = alpm_list_next(j)) {  			alpm_list_t *grp; -			alpm_pkg_t *pkg = alpm_list_getdata(j); +			alpm_pkg_t *pkg = j->data;  			if(!config->quiet) {  				printf("%s/%s %s", alpm_db_get_name(db), alpm_pkg_get_name(pkg),  							 alpm_pkg_get_version(pkg));  			} else { -				printf("%s", alpm_pkg_get_name(pkg)); +				fputs(alpm_pkg_get_name(pkg), stdout);  			}  			if(!config->quiet) {  				if((grp = alpm_pkg_get_groups(pkg)) != NULL) {  					alpm_list_t *k; -					printf(" ("); +					fputs(" (", stdout);  					for(k = grp; k; k = alpm_list_next(k)) { -						const char *group = alpm_list_getdata(k); -						printf("%s", group); +						const char *group = k->data; +						fputs(group, stdout);  						if(alpm_list_next(k)) {  							/* only print a spacer if there are more groups */ -							printf(" "); +							putchar(' ');  						}  					} -					printf(")"); +					putchar(')');  				}  				print_installed(db_local, pkg); @@ -388,9 +386,9 @@ static int sync_group(int level, alpm_list_t *syncs, alpm_list_t *targets)  	if(targets) {  		for(i = targets; i; i = alpm_list_next(i)) { -			const char *grpname = alpm_list_getdata(i); +			const char *grpname = i->data;  			for(j = syncs; j; j = alpm_list_next(j)) { -				alpm_db_t *db = alpm_list_getdata(j); +				alpm_db_t *db = j->data;  				alpm_group_t *grp = alpm_db_readgroup(db, grpname);  				if(grp) { @@ -398,9 +396,9 @@ static int sync_group(int level, alpm_list_t *syncs, alpm_list_t *targets)  					for(k = grp->packages; k; k = alpm_list_next(k)) {  						if(!config->quiet) {  							printf("%s %s\n", grpname, -									alpm_pkg_get_name(alpm_list_getdata(k))); +									alpm_pkg_get_name(k->data));  						} else { -							printf("%s\n", alpm_pkg_get_name(alpm_list_getdata(k))); +							printf("%s\n", alpm_pkg_get_name(k->data));  						}  					}  				} @@ -408,15 +406,15 @@ static int sync_group(int level, alpm_list_t *syncs, alpm_list_t *targets)  		}  	} else {  		for(i = syncs; i; i = alpm_list_next(i)) { -			alpm_db_t *db = alpm_list_getdata(i); +			alpm_db_t *db = i->data;  			for(j = alpm_db_get_groupcache(db); j; j = alpm_list_next(j)) { -				alpm_group_t *grp = alpm_list_getdata(j); +				alpm_group_t *grp = j->data;  				if(level > 1) {  					for(k = grp->packages; k; k = alpm_list_next(k)) {  						printf("%s %s\n", grp->name, -								alpm_pkg_get_name(alpm_list_getdata(k))); +								alpm_pkg_get_name(k->data));  					}  				} else {  					/* print grp names only, no package names */ @@ -436,7 +434,7 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets)  	if(targets) {  		for(i = targets; i; i = alpm_list_next(i)) { -			const char *target = alpm_list_getdata(i); +			const char *target = i->data;  			char *name = strdup(target);  			char *repo, *pkgstr;  			int foundpkg = 0, founddb = 0; @@ -452,14 +450,14 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets)  			}  			for(j = syncs; j; j = alpm_list_next(j)) { -				alpm_db_t *db = alpm_list_getdata(j); +				alpm_db_t *db = j->data;  				if(repo && strcmp(repo, alpm_db_get_name(db)) != 0) {  					continue;  				}  				founddb = 1;  				for(k = alpm_db_get_pkgcache(db); k; k = alpm_list_next(k)) { -					alpm_pkg_t *pkg = alpm_list_getdata(k); +					alpm_pkg_t *pkg = k->data;  					if(strcmp(alpm_pkg_get_name(pkg), pkgstr) == 0) {  						dump_pkg_full(pkg, config->op_s_info > 1); @@ -483,10 +481,10 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets)  		}  	} else {  		for(i = syncs; i; i = alpm_list_next(i)) { -			alpm_db_t *db = alpm_list_getdata(i); +			alpm_db_t *db = i->data;  			for(j = alpm_db_get_pkgcache(db); j; j = alpm_list_next(j)) { -				alpm_pkg_t *pkg = alpm_list_getdata(j); +				alpm_pkg_t *pkg = j->data;  				dump_pkg_full(pkg, config->op_s_info > 1);  			}  		} @@ -502,11 +500,11 @@ static int sync_list(alpm_list_t *syncs, alpm_list_t *targets)  	if(targets) {  		for(i = targets; i; i = alpm_list_next(i)) { -			const char *repo = alpm_list_getdata(i); +			const char *repo = i->data;  			alpm_db_t *db = NULL;  			for(j = syncs; j; j = alpm_list_next(j)) { -				alpm_db_t *d = alpm_list_getdata(j); +				alpm_db_t *d = j->data;  				if(strcmp(repo, alpm_db_get_name(d)) == 0) {  					db = d; @@ -528,10 +526,10 @@ static int sync_list(alpm_list_t *syncs, alpm_list_t *targets)  	}  	for(i = ls; i; i = alpm_list_next(i)) { -		alpm_db_t *db = alpm_list_getdata(i); +		alpm_db_t *db = i->data;  		for(j = alpm_db_get_pkgcache(db); j; j = alpm_list_next(j)) { -			alpm_pkg_t *pkg = alpm_list_getdata(j); +			alpm_pkg_t *pkg = j->data;  			if(!config->quiet) {  				printf("%s %s %s", alpm_db_get_name(db), alpm_pkg_get_name(pkg), @@ -557,7 +555,7 @@ static alpm_list_t *syncfirst(void) {  	alpm_list_t *syncdbs = alpm_option_get_syncdbs(config->handle);  	for(i = config->syncfirst; i; i = alpm_list_next(i)) { -		char *pkgname = alpm_list_getdata(i); +		const char *pkgname = i->data;  		alpm_pkg_t *pkg = alpm_db_get_pkg(db_local, pkgname);  		if(pkg == NULL) {  			continue; @@ -588,7 +586,7 @@ static int process_pkg(alpm_pkg_t *pkg)  	int ret = alpm_add_pkg(config->handle, pkg);  	if(ret == -1) { -		enum _alpm_errno_t err = alpm_errno(config->handle); +		alpm_errno_t err = alpm_errno(config->handle);  		if(err == ALPM_ERR_TRANS_DUP_TARGET  				|| err == ALPM_ERR_PKG_IGNORED) {  			/* just skip duplicate or ignored targets */ @@ -604,7 +602,7 @@ static int process_pkg(alpm_pkg_t *pkg)  	return 0;  } -static int process_group(alpm_list_t *dbs, const char *group) +static int process_group(alpm_list_t *dbs, const char *group, int error)  {  	int ret = 0;  	alpm_list_t *i; @@ -616,6 +614,12 @@ static int process_group(alpm_list_t *dbs, const char *group)  		return 1;  	} +	if(error) { +		/* we already know another target errored. there is no reason to prompt the +		 * user here; we already validated the group name so just move on since we +		 * won't actually be installing anything anyway. */ +		goto cleanup; +	}  	if(config->print == 0) {  		printf(_(":: There are %d members in group %s:\n"), count, @@ -635,7 +639,7 @@ static int process_group(alpm_list_t *dbs, const char *group)  		for(i = pkgs; i; i = alpm_list_next(i)) {  			if(array[n++] == 0)  				continue; -			alpm_pkg_t *pkg = alpm_list_getdata(i); +			alpm_pkg_t *pkg = i->data;  			if(process_pkg(pkg) == 1) {  				ret = 1; @@ -646,7 +650,7 @@ static int process_group(alpm_list_t *dbs, const char *group)  		free(array);  	} else {  		for(i = pkgs; i; i = alpm_list_next(i)) { -			alpm_pkg_t *pkg = alpm_list_getdata(i); +			alpm_pkg_t *pkg = i->data;  			if(process_pkg(pkg) == 1) {  				ret = 1; @@ -654,12 +658,14 @@ static int process_group(alpm_list_t *dbs, const char *group)  			}  		}  	} +  cleanup:  	alpm_list_free(pkgs);  	return ret;  } -static int process_targname(alpm_list_t *dblist, const char *targname) +static int process_targname(alpm_list_t *dblist, const char *targname, +		int error)  {  	alpm_pkg_t *pkg = alpm_find_dbs_satisfier(config->handle, dblist, targname); @@ -673,20 +679,20 @@ static int process_targname(alpm_list_t *dblist, const char *targname)  		return process_pkg(pkg);  	}  	/* fallback on group */ -	return process_group(dblist, targname); +	return process_group(dblist, targname, error);  } -static int process_target(const char *target) +static int process_target(const char *target, int error)  {  	/* process targets */  	char *targstring = strdup(target);  	char *targname = strchr(targstring, '/'); -	char *dbname = NULL;  	int ret = 0; -	alpm_list_t *dblist = NULL; +	alpm_list_t *dblist;  	if(targname && targname != targstring) { -		alpm_db_t *db = NULL; +		alpm_db_t *db; +		const char *dbname;  		*targname = '\0';  		targname++; @@ -698,14 +704,15 @@ static int process_target(const char *target)  			ret = 1;  			goto cleanup;  		} -		dblist = alpm_list_add(dblist, db); -		ret = process_targname(dblist, targname); +		dblist = alpm_list_add(NULL, db); +		ret = process_targname(dblist, targname, error);  		alpm_list_free(dblist);  	} else {  		targname = targstring;  		dblist = alpm_option_get_syncdbs(config->handle); -		ret = process_targname(dblist, targname); +		ret = process_targname(dblist, targname, error);  	} +  cleanup:  	free(targstring);  	if(ret && access(target, R_OK) == 0) { @@ -718,6 +725,7 @@ cleanup:  static int sync_trans(alpm_list_t *targets)  { +	int retval = 0;  	alpm_list_t *i;  	/* Step 1: create a new transaction... */ @@ -727,13 +735,17 @@ static int sync_trans(alpm_list_t *targets)  	/* process targets */  	for(i = targets; i; i = alpm_list_next(i)) { -		char *targ = alpm_list_getdata(i); -		if(process_target(targ) == 1) { -			trans_release(); -			return 1; +		const char *targ = i->data; +		if(process_target(targ, retval) == 1) { +			retval = 1;  		}  	} +	if(retval) { +		trans_release(); +		return retval; +	} +  	if(config->op_s_upgrade) {  		printf(_(":: Starting full system upgrade...\n"));  		alpm_logaction(config->handle, "starting full system upgrade\n"); @@ -754,19 +766,19 @@ int sync_prepare_execute(void)  	/* Step 2: "compute" the transaction based on targets and flags */  	if(alpm_trans_prepare(config->handle, &data) == -1) { -		enum _alpm_errno_t err = alpm_errno(config->handle); +		alpm_errno_t err = alpm_errno(config->handle);  		pm_printf(ALPM_LOG_ERROR, _("failed to prepare transaction (%s)\n"),  		        alpm_strerror(err));  		switch(err) {  			case ALPM_ERR_PKG_INVALID_ARCH:  				for(i = data; i; i = alpm_list_next(i)) { -					char *pkg = alpm_list_getdata(i); +					const char *pkg = i->data;  					printf(_(":: package %s does not have a valid architecture\n"), pkg);  				}  				break;  			case ALPM_ERR_UNSATISFIED_DEPS:  				for(i = data; i; i = alpm_list_next(i)) { -					alpm_depmissing_t *miss = alpm_list_getdata(i); +					alpm_depmissing_t *miss = i->data;  					char *depstring = alpm_dep_compute_string(miss->depend);  					printf(_(":: %s: requires %s\n"), miss->target, depstring);  					free(depstring); @@ -774,7 +786,7 @@ int sync_prepare_execute(void)  				break;  			case ALPM_ERR_CONFLICTING_DEPS:  				for(i = data; i; i = alpm_list_next(i)) { -					alpm_conflict_t *conflict = alpm_list_getdata(i); +					alpm_conflict_t *conflict = i->data;  					/* only print reason if it contains new information */  					if(conflict->reason->mod == ALPM_DEP_MOD_ANY) {  						printf(_(":: %s and %s are in conflict\n"), @@ -823,13 +835,13 @@ int sync_prepare_execute(void)  	}  	if(alpm_trans_commit(config->handle, &data) == -1) { -		enum _alpm_errno_t err = alpm_errno(config->handle); +		alpm_errno_t err = alpm_errno(config->handle);  		pm_printf(ALPM_LOG_ERROR, _("failed to commit transaction (%s)\n"),  		        alpm_strerror(err));  		switch(err) {  			case ALPM_ERR_FILE_CONFLICTS:  				for(i = data; i; i = alpm_list_next(i)) { -					alpm_fileconflict_t *conflict = alpm_list_getdata(i); +					alpm_fileconflict_t *conflict = i->data;  					switch(conflict->type) {  						case ALPM_FILECONFLICT_TARGET:  							printf(_("%s exists in both '%s' and '%s'\n"), @@ -847,7 +859,7 @@ int sync_prepare_execute(void)  			case ALPM_ERR_PKG_INVALID_SIG:  			case ALPM_ERR_DLT_INVALID:  				for(i = data; i; i = alpm_list_next(i)) { -					const char *filename = alpm_list_getdata(i); +					const char *filename = i->data;  					printf(_("%s is invalid or corrupted\n"), filename);  				}  				break; diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c index 880aa4c6..87f7c390 100644 --- a/src/pacman/upgrade.c +++ b/src/pacman/upgrade.c @@ -18,8 +18,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdlib.h>  #include <stdio.h>  #include <string.h> @@ -41,6 +39,7 @@   */  int pacman_upgrade(alpm_list_t *targets)  { +	int retval = 0;  	alpm_list_t *i;  	alpm_siglevel_t level = alpm_option_get_default_siglevel(config->handle); @@ -57,7 +56,7 @@ int pacman_upgrade(alpm_list_t *targets)  			if(str == NULL) {  				pm_printf(ALPM_LOG_ERROR, "'%s': %s\n",  						(char *)i->data, alpm_strerror(alpm_errno(config->handle))); -				return 1; +				retval = 1;  			} else {  				free(i->data);  				i->data = str; @@ -65,6 +64,10 @@ int pacman_upgrade(alpm_list_t *targets)  		}  	} +	if(retval) { +		return retval; +	} +  	/* Step 1: create a new transaction */  	if(trans_init(config->flags, 1) == -1) {  		return 1; @@ -73,25 +76,30 @@ int pacman_upgrade(alpm_list_t *targets)  	printf(_("loading packages...\n"));  	/* add targets to the created transaction */  	for(i = targets; i; i = alpm_list_next(i)) { -		char *targ = alpm_list_getdata(i); +		const char *targ = i->data;  		alpm_pkg_t *pkg;  		if(alpm_pkg_load(config->handle, targ, 1, level, &pkg) != 0) {  			pm_printf(ALPM_LOG_ERROR, "'%s': %s\n",  					targ, alpm_strerror(alpm_errno(config->handle))); -			trans_release(); -			return 1; +			retval = 1; +			continue;  		}  		if(alpm_add_pkg(config->handle, pkg) == -1) {  			pm_printf(ALPM_LOG_ERROR, "'%s': %s\n",  					targ, alpm_strerror(alpm_errno(config->handle)));  			alpm_pkg_free(pkg); -			trans_release(); -			return 1; +			retval = 1; +			continue;  		}  		config->explicit_adds = alpm_list_add(config->explicit_adds, pkg);  	} +	if(retval) { +		trans_release(); +		return retval; +	} +  	/* now that targets are resolved, we can hand it all off to the sync code */  	return sync_prepare_execute();  } diff --git a/src/pacman/util.c b/src/pacman/util.c index facdc1c9..27efdb0a 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -18,12 +18,10 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <sys/types.h>  #include <sys/ioctl.h>  #include <sys/stat.h> -#include <sys/time.h> +#include <time.h>  #include <stdio.h>  #include <stdlib.h> @@ -65,7 +63,7 @@ int trans_init(alpm_transflag_t flags, int check_valid)  void trans_init_error(void)  { -	enum _alpm_errno_t err = alpm_errno(config->handle); +	alpm_errno_t err = alpm_errno(config->handle);  	pm_printf(ALPM_LOG_ERROR, _("failed to init transaction (%s)\n"),  			alpm_strerror(err));  	if(err == ALPM_ERR_HANDLE_LOCK) { @@ -266,7 +264,7 @@ void indentprint(const char *str, size_t indent)  	/* if we're not a tty, or our tty is not wide enough that wrapping even makes  	 * sense, print without indenting */  	if(cols == 0 || indent > cols) { -		printf("%s", str); +		fputs(str, stdout);  		return;  	} @@ -314,13 +312,13 @@ void indentprint(const char *str, size_t indent)  /* Trim whitespace and newlines from a string   */ -char *strtrim(char *str) +size_t strtrim(char *str)  { -	char *pch = str; +	char *end, *pch = str;  	if(str == NULL || *str == '\0') {  		/* string is empty, so we're done. */ -		return str; +		return 0;  	}  	while(isspace((unsigned char)*pch)) { @@ -337,16 +335,16 @@ char *strtrim(char *str)  	/* check if there wasn't anything but whitespace in the string. */  	if(*str == '\0') { -		return str; +		return 0;  	} -	pch = (str + (strlen(str) - 1)); -	while(isspace((unsigned char)*pch)) { -		pch--; +	end = (str + strlen(str) - 1); +	while(isspace((unsigned char)*end)) { +		end--;  	} -	*++pch = '\0'; +	*++end = '\0'; -	return str; +	return end - pch;  }  /* Replace all occurances of 'needle' with 'replace' in 'str', returning @@ -387,7 +385,7 @@ char *strreplace(const char *str, const char *needle, const char *replace)  	p = str;  	newp = newstr;  	for(i = list; i; i = alpm_list_next(i)) { -		q = alpm_list_getdata(i); +		q = i->data;  		if(q > p) {  			/* add chars between this occurence and last occurence, if any */  			memcpy(newp, p, (size_t)(q - p)); @@ -474,77 +472,120 @@ void string_display(const char *title, const char *string)  	printf("\n");  } -static void table_print_line(const alpm_list_t *line, -		size_t colcount, size_t *widths) +static void table_print_line(const alpm_list_t *line, short col_padding, +		size_t colcount, size_t *widths, int *has_data)  { -	size_t i; +	size_t i, lastcol = 0; +	int need_padding = 0;  	const alpm_list_t *curcell; +	for(i = colcount; i > 0; i--) { +		if(has_data[i - 1]) { +			lastcol = i - 1; +			break; +		} +	} +  	for(i = 0, curcell = line; curcell && i < colcount;  			i++, curcell = alpm_list_next(curcell)) { -		const char *value = curcell->data; -		size_t len = string_length(value); +		const char *value; +		int cell_padding; + +		if(!has_data[i]) { +			continue; +		} + +		value = curcell->data;  		/* silly printf requires padding size to be an int */ -		int padding = (int)widths[i] - (int)len; -		if(padding < 0) { -			padding = 0; +		cell_padding = (int)widths[i] - (int)string_length(value); +		if(cell_padding < 0) { +			cell_padding = 0; +		} +		if(need_padding) { +			printf("%*s", col_padding, "");  		}  		/* left-align all but the last column */ -		if(i + 1 < colcount) { -			printf("%s%*s", value, padding, ""); +		if(i != lastcol) { +			printf("%s%*s", value, cell_padding, "");  		} else { -			printf("%*s%s", padding, "", value); +			printf("%*s%s", cell_padding, "", value);  		} +		need_padding = 1;  	}  	printf("\n");  } -/* find the max string width of each column */ + + +/** + * Find the max string width of each column. Also determines whether values + * exist in the column and sets the value in has_data accordingly. + * @param header a list of header strings + * @param rows a list of lists of rows as strings + * @param padding the amount of padding between columns + * @param totalcols the total number of columns in the header and each row + * @param widths a pointer to store width data + * @param has_data a pointer to store whether column has data + * + * @return the total width of the table; 0 on failure + */  static size_t table_calc_widths(const alpm_list_t *header, -		const alpm_list_t *rows, size_t totalcols, size_t **widths) +		const alpm_list_t *rows, short padding, size_t totalcols, +		size_t **widths, int **has_data)  {  	const alpm_list_t *i; -	const unsigned short padding = 2; -	size_t curcol, totalwidth = 0; +	size_t curcol, totalwidth = 0, usefulcols = 0;  	size_t *colwidths; +	int *coldata;  	if(totalcols <= 0) {  		return 0;  	}  	colwidths = malloc(totalcols * sizeof(size_t)); -	if(!colwidths) { +	coldata = calloc(totalcols, sizeof(int)); +	if(!colwidths || !coldata) {  		return 0;  	}  	/* header determines column count and initial values of longest_strs */  	for(i = header, curcol = 0; i; i = alpm_list_next(i), curcol++) { -		colwidths[curcol] = string_length(alpm_list_getdata(i)); +		colwidths[curcol] = string_length(i->data); +		/* note: header does not determine whether column has data */  	}  	/* now find the longest string in each column */  	for(i = rows; i; i = alpm_list_next(i)) {  		/* grab first column of each row and iterate through columns */ -		const alpm_list_t *j = alpm_list_getdata(i); +		const alpm_list_t *j = i->data;  		for(curcol = 0; j; j = alpm_list_next(j), curcol++) { -			char *str = alpm_list_getdata(j); +			const char *str = j->data;  			size_t str_len = string_length(str);  			if(str_len > colwidths[curcol]) {  				colwidths[curcol] = str_len;  			} +			if(str_len > 0) { +				coldata[curcol] = 1; +			}  		}  	}  	for(i = header, curcol = 0; i; i = alpm_list_next(i), curcol++) { -		/* pad everything but the last column */ -		if(curcol + 1 < totalcols) { -			colwidths[curcol] += padding; +		/* only include columns that have data */ +		if(coldata[curcol]) { +			usefulcols++; +			totalwidth += colwidths[curcol];  		} -		totalwidth += colwidths[curcol]; +	} + +	/* add padding between columns */ +	if(usefulcols > 0) { +		totalwidth += padding * (usefulcols - 1);  	}  	*widths = colwidths; +	*has_data = coldata;  	return totalwidth;  } @@ -561,22 +602,25 @@ static size_t table_calc_widths(const alpm_list_t *header,  int table_display(const char *title, const alpm_list_t *header,  		const alpm_list_t *rows)  { +	const unsigned short padding = 2;  	const alpm_list_t *i;  	size_t *widths = NULL, totalcols, totalwidth; +	int *has_data = NULL;  	if(rows == NULL || header == NULL) {  		return 0;  	}  	totalcols = alpm_list_count(header); -	totalwidth = table_calc_widths(header, rows, totalcols, &widths); +	totalwidth = table_calc_widths(header, rows, padding, totalcols, +			&widths, &has_data);  	/* return -1 if terminal is not wide enough */  	if(totalwidth > getcols()) {  		pm_printf(ALPM_LOG_WARNING,  				_("insufficient columns available for table display\n"));  		return -1;  	} -	if(!totalwidth || !widths) { +	if(!totalwidth || !widths || !has_data) {  		return -1;  	} @@ -584,14 +628,15 @@ int table_display(const char *title, const alpm_list_t *header,  		printf("%s\n\n", title);  	} -	table_print_line(header, totalcols, widths); +	table_print_line(header, padding, totalcols, widths, has_data);  	printf("\n");  	for(i = rows; i; i = alpm_list_next(i)) { -		table_print_line(alpm_list_getdata(i), totalcols, widths); +		table_print_line(i->data, padding, totalcols, widths, has_data);  	}  	free(widths); +	free(has_data);  	return 0;  } @@ -610,18 +655,18 @@ void list_display(const char *title, const alpm_list_t *list)  	} else {  		const unsigned short maxcols = getcols();  		size_t cols = len; -		const char *str = alpm_list_getdata(list); -		printf("%s", str); +		const char *str = list->data; +		fputs(str, stdout);  		cols += string_length(str);  		for(i = alpm_list_next(list); i; i = alpm_list_next(i)) { -			str = alpm_list_getdata(i); +			str = i->data;  			size_t s = string_length(str);  			/* wrap only if we have enough usable column space */  			if(maxcols > len && cols + s + 2 >= maxcols) {  				size_t j;  				cols = len;  				printf("\n"); -				for (j = 1; j <= len; j++) { +				for(j = 1; j <= len; j++) {  					printf(" ");  				}  			} else if(cols != len) { @@ -629,10 +674,10 @@ void list_display(const char *title, const alpm_list_t *list)  				printf("  ");  				cols += 2;  			} -			printf("%s", str); +			fputs(str, stdout);  			cols += s;  		} -		printf("\n"); +		putchar('\n');  	}  } @@ -650,7 +695,7 @@ void list_display_linebreak(const char *title, const alpm_list_t *list)  	} else {  		const alpm_list_t *i;  		/* Print the first element */ -		indentprint((const char *) alpm_list_getdata(list), len); +		indentprint((const char *)list->data, len);  		printf("\n");  		/* Print the rest */  		for(i = alpm_list_next(list); i; i = alpm_list_next(i)) { @@ -658,7 +703,7 @@ void list_display_linebreak(const char *title, const alpm_list_t *list)  			for(j = 1; j <= len; j++) {  				printf(" ");  			} -			indentprint((const char *) alpm_list_getdata(i), len); +			indentprint((const char *)i->data, len);  			printf("\n");  		}  	} @@ -773,7 +818,12 @@ static alpm_list_t *create_verbose_row(pm_target_t *target, int dl_size)  	/* a row consists of the package name, */  	if(target->install) { -		pm_asprintf(&str, "%s", alpm_pkg_get_name(target->install)); +		const alpm_db_t *db = alpm_pkg_get_db(target->install); +		if(db) { +			pm_asprintf(&str, "%s/%s", alpm_db_get_name(db), alpm_pkg_get_name(target->install)); +		} else { +			pm_asprintf(&str, "%s", alpm_pkg_get_name(target->install)); +		}  	} else {  		pm_asprintf(&str, "%s", alpm_pkg_get_name(target->remove));  	} @@ -825,7 +875,7 @@ static void _display_targets(alpm_list_t *targets, int verbose)  	/* gather package info */  	for(i = targets; i; i = alpm_list_next(i)) { -		pm_target_t *target = alpm_list_getdata(i); +		pm_target_t *target = i->data;  		if(target->install) {  			dlsize += alpm_pkg_download_size(target->install); @@ -873,7 +923,7 @@ static void _display_targets(alpm_list_t *targets, int verbose)  	/* rows is a list of lists of strings, free inner lists here */  	for(i = rows; i; i = alpm_list_next(i)) { -		alpm_list_t *lp = alpm_list_getdata(i); +		alpm_list_t *lp = i->data;  		FREELIST(lp);  	}  	alpm_list_free(rows); @@ -930,7 +980,7 @@ void display_targets(void)  	alpm_db_t *db_local = alpm_option_get_localdb(config->handle);  	for(i = alpm_trans_get_add(config->handle); i; i = alpm_list_next(i)) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); +		alpm_pkg_t *pkg = i->data;  		pm_target_t *targ = calloc(1, sizeof(pm_target_t));  		if(!targ) return;  		targ->install = pkg; @@ -941,7 +991,7 @@ void display_targets(void)  		targets = alpm_list_add(targets, targ);  	}  	for(i = alpm_trans_get_remove(config->handle); i; i = alpm_list_next(i)) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); +		alpm_pkg_t *pkg = i->data;  		pm_target_t *targ = calloc(1, sizeof(pm_target_t));  		if(!targ) return;  		targ->remove = pkg; @@ -976,7 +1026,7 @@ static char *pkg_get_location(alpm_pkg_t *pkg)  		case PM_OP_SYNC:  			servers = alpm_db_get_servers(alpm_pkg_get_db(pkg));  			if(servers) { -				pm_asprintf(&string, "%s/%s", alpm_list_getdata(servers), +				pm_asprintf(&string, "%s/%s", servers->data,  						alpm_pkg_get_filename(pkg));  				return string;  			} @@ -1031,7 +1081,7 @@ void print_packages(const alpm_list_t *packages)  		config->print_format = strdup("%l");  	}  	for(i = packages; i; i = alpm_list_next(i)) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); +		alpm_pkg_t *pkg = i->data;  		char *string = strdup(config->print_format);  		char *temp = string;  		/* %n : pkgname */ @@ -1123,8 +1173,8 @@ void select_display(const alpm_list_t *pkglist)  	char *string = NULL;  	const char *dbname = NULL; -	for (i = pkglist; i; i = i->next) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); +	for(i = pkglist; i; i = i->next) { +		alpm_pkg_t *pkg = i->data;  		alpm_db_t *db = alpm_pkg_get_db(pkg);  		if(!dbname) @@ -1166,17 +1216,17 @@ static int multiselect_parse(char *array, int count, char *response)  {  	char *str, *saveptr; -	for (str = response; ; str = NULL) { +	for(str = response; ; str = NULL) {  		int include = 1;  		int start, end; +		size_t len;  		char *ends = NULL;  		char *starts = strtok_r(str, " ", &saveptr);  		if(starts == NULL) {  			break;  		} -		strtrim(starts); -		int len = strlen(starts); +		len = strtrim(starts);  		if(len == 0)  			continue; @@ -1255,6 +1305,7 @@ int multiselect_question(char *array, int count)  		if(fgets(response, response_len, stdin)) {  			const size_t response_incr = 64; +			size_t len;  			/* handle buffer not being large enough to read full line case */  			while(*lastchar == '\0' && lastchar[-1] != '\n') {  				response_len += response_incr; @@ -1271,8 +1322,9 @@ int multiselect_question(char *array, int count)  					return -1;  				}  			} -			strtrim(response); -			if(strlen(response) > 0) { + +			len = strtrim(response); +			if(len > 0) {  				if(multiselect_parse(array, count, response) == -1) {  					/* only loop if user gave an invalid answer */  					continue; @@ -1315,8 +1367,8 @@ int select_question(int count)  		flush_term_input();  		if(fgets(response, sizeof(response), stdin)) { -			strtrim(response); -			if(strlen(response) > 0) { +			size_t len = strtrim(response); +			if(len > 0) {  				int n;  				if(parseindex(response, &n, 1, count) != 0)  					continue; @@ -1364,8 +1416,8 @@ static int question(short preset, char *fmt, va_list args)  	flush_term_input();  	if(fgets(response, sizeof(response), stdin)) { -		strtrim(response); -		if(strlen(response) == 0) { +		size_t len = strtrim(response); +		if(len == 0) {  			return preset;  		} diff --git a/src/pacman/util.h b/src/pacman/util.h index 1b5a3daf..18048de9 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -36,9 +36,6 @@  #define _n(str1, str2, ct) (ct == 1 ? str1 : str2)  #endif -/* update speed for the fill_progress based functions */ -#define UPDATE_SPEED_SEC 0.2f -  typedef struct _pm_target_t {  	alpm_pkg_t *remove;  	alpm_pkg_t *install; @@ -55,7 +52,7 @@ int rmrf(const char *path);  const char *mbasename(const char *path);  char *mdirname(const char *path);  void indentprint(const char *str, size_t indent); -char *strtrim(char *str); +size_t strtrim(char *str);  char *strreplace(const char *str, const char *needle, const char *replace);  alpm_list_t *strsplit(const char *str, const char splitchar);  void string_display(const char *title, const char *string); diff --git a/src/util/Makefile.am b/src/util/Makefile.am index e4af56cf..2110781b 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -11,7 +11,10 @@ DEFS = -DLOCALEDIR=\"@localedir@\" \         -DDBPATH=\"$(dbpath)\" \         -DCACHEDIR=\"$(cachedir)\" \         @DEFS@ -INCLUDES = -I$(top_srcdir)/lib/libalpm + +AM_CPPFLAGS = \ +	-imacros $(top_builddir)/config.h \ +	-I$(top_srcdir)/lib/libalpm  AM_CFLAGS = -pedantic -D_GNU_SOURCE diff --git a/src/util/cleanupdelta.c b/src/util/cleanupdelta.c index 6553e6f6..ea34fe7f 100644 --- a/src/util/cleanupdelta.c +++ b/src/util/cleanupdelta.c @@ -17,8 +17,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -56,10 +54,10 @@ static void checkpkgs(alpm_list_t *pkglist)  {  	alpm_list_t *i, *j;  	for(i = pkglist; i; i = alpm_list_next(i)) { -		alpm_pkg_t *pkg = alpm_list_getdata(i); +		alpm_pkg_t *pkg = i->data;  		alpm_list_t *unused = alpm_pkg_unused_deltas(pkg);  		for(j = unused; j; j = alpm_list_next(j)) { -			char *delta = alpm_list_getdata(j); +			const char *delta = j->data;  			printf("%s\n", delta);  		}  		alpm_list_free(unused); @@ -72,7 +70,7 @@ static void checkdbs(alpm_list_t *dbnames) {  	const alpm_siglevel_t level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL;  	for(i = dbnames; i; i = alpm_list_next(i)) { -		const char *dbname = alpm_list_getdata(i); +		const char *dbname = i->data;  		db = alpm_db_register_sync(handle, dbname, level);  		if(db == NULL) {  			fprintf(stderr, "error: could not register sync database '%s' (%s)\n", @@ -94,7 +92,7 @@ static void usage(void) {  int main(int argc, char *argv[])  {  	const char *dbpath = DBPATH; -	enum _alpm_errno_t err; +	alpm_errno_t err;  	int a = 1;  	alpm_list_t *dbnames = NULL; diff --git a/src/util/pacsort.c b/src/util/pacsort.c index 0eedf59d..7275cc77 100644 --- a/src/util/pacsort.c +++ b/src/util/pacsort.c @@ -17,8 +17,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <errno.h>  #include <getopt.h>  #include <stdio.h> diff --git a/src/util/pactree.c b/src/util/pactree.c index 997ba466..0adc2ea8 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -17,8 +17,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <ctype.h>  #include <getopt.h>  #include <stdio.h> @@ -119,13 +117,13 @@ char *strndup(const char *s, size_t n)  }  #endif -static char *strtrim(char *str) +static size_t strtrim(char *str)  { -	char *pch = str; +	char *end, *pch = str;  	if(str == NULL || *str == '\0') {  		/* string is empty, so we're done. */ -		return str; +		return 0;  	}  	while(isspace((unsigned char)*pch)) { @@ -142,21 +140,21 @@ static char *strtrim(char *str)  	/* check if there wasn't anything but whitespace in the string. */  	if(*str == '\0') { -		return str; +		return 0;  	} -	pch = (str + (strlen(str) - 1)); -	while(isspace((unsigned char)*pch)) { -		pch--; +	end = (str + strlen(str) - 1); +	while(isspace((unsigned char)*end)) { +		end--;  	} -	*++pch = '\0'; +	*++end = '\0'; -	return str; +	return end - pch;  }  static int register_syncs(void) {  	FILE *fp; -	char *ptr, *section = NULL; +	char *section = NULL;  	char line[LINE_MAX];  	const alpm_siglevel_t level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL; @@ -167,20 +165,23 @@ static int register_syncs(void) {  	}  	while(fgets(line, LINE_MAX, fp)) { -		strtrim(line); +		size_t linelen; +		char *ptr; + +		linelen = strtrim(line); -		if(line[0] == '#' || !strlen(line)) { +		if(line[0] == '#' || !linelen) {  			continue;  		}  		if((ptr = strchr(line, '#'))) {  			*ptr = '\0'; -			strtrim(line); +			linelen = strtrim(line);  		} -		if(line[0] == '[' && line[strlen(line) - 1] == ']') { +		if(line[0] == '[' && line[linelen - 1] == ']') {  			free(section); -			section = strndup(&line[1], strlen(line) - 2); +			section = strndup(&line[1], linelen - 2);  			if(section && strcmp(section, "options") != 0) {  				alpm_db_register_sync(handle, section, level); @@ -363,7 +364,7 @@ static alpm_pkg_t *get_pkg_from_dbs(alpm_list_t *dbs, const char *needle) {  	alpm_pkg_t *ret;  	for(i = dbs; i; i = alpm_list_next(i)) { -		ret = alpm_db_get_pkg(alpm_list_getdata(i), needle); +		ret = alpm_db_get_pkg(i->data, needle);  		if(ret) {  			return ret;  		} @@ -386,7 +387,7 @@ static void walk_reverse_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth)  	required_by = alpm_pkg_compute_requiredby(pkg);  	for(i = required_by; i; i = alpm_list_next(i)) { -		const char *pkgname = alpm_list_getdata(i); +		const char *pkgname = i->data;  		if(alpm_list_find_str(walked, pkgname)) {  			/* if we've already seen this package, don't print in "unique" output @@ -417,7 +418,7 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth)  	walked = alpm_list_add(walked, (void *)alpm_pkg_get_name(pkg));  	for(i = alpm_pkg_get_depends(pkg); i; i = alpm_list_next(i)) { -		alpm_depend_t *depend = alpm_list_getdata(i); +		alpm_depend_t *depend = i->data;  		alpm_pkg_t *provider = alpm_find_dbs_satisfier(handle, dblist, depend->name);  		if(provider) { @@ -443,7 +444,7 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth)  int main(int argc, char *argv[])  {  	int freelist = 0, ret = 0; -	enum _alpm_errno_t err; +	alpm_errno_t err;  	const char *target_name;  	alpm_pkg_t *pkg;  	alpm_list_t *dblist = NULL; diff --git a/src/util/testdb.c b/src/util/testdb.c index d85687a4..c12aee04 100644 --- a/src/util/testdb.c +++ b/src/util/testdb.c @@ -17,8 +17,6 @@   *  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include "config.h" -  #include <unistd.h>  #include <stdio.h>  #include <stdlib.h> @@ -94,17 +92,16 @@ static int check_localdb_files(void)  	return ret;  } -static int checkdeps(alpm_list_t *pkglist) +static int check_deps(alpm_list_t *pkglist)  {  	alpm_list_t *data, *i;  	int ret = 0;  	/* check dependencies */  	data = alpm_checkdeps(handle, pkglist, NULL, pkglist, 0);  	for(i = data; i; i = alpm_list_next(i)) { -		alpm_depmissing_t *miss = alpm_list_getdata(i); +		alpm_depmissing_t *miss = i->data;  		char *depstring = alpm_dep_compute_string(miss->depend); -		printf("missing dependency for %s : %s\n", miss->target, -				depstring); +		printf("missing %s dependency for %s\n", depstring, miss->target);  		free(depstring);  		ret++;  	} @@ -112,14 +109,14 @@ static int checkdeps(alpm_list_t *pkglist)  	return ret;  } -static int checkconflicts(alpm_list_t *pkglist) +static int check_conflicts(alpm_list_t *pkglist)  {  	alpm_list_t *data, *i;  	int ret = 0;  	/* check conflicts */  	data = alpm_checkconflicts(handle, pkglist);  	for(i = data; i; i = i->next) { -		alpm_conflict_t *conflict = alpm_list_getdata(i); +		alpm_conflict_t *conflict = i->data;  		printf("%s conflicts with %s\n",  				conflict->package1, conflict->package2);  		ret++; @@ -128,6 +125,77 @@ static int checkconflicts(alpm_list_t *pkglist)  	return ret;  } +struct fileitem { +	alpm_file_t *file; +	alpm_pkg_t *pkg; +}; + +static int fileitem_cmp(const void *p1, const void *p2) +{ +	const struct fileitem * fi1 = p1; +	const struct fileitem * fi2 = p2; +	return strcmp(fi1->file->name, fi2->file->name); +} + +static int check_filelists(alpm_list_t *pkglist) +{ +	alpm_list_t *i; +	int ret = 0; +	size_t list_size = 4096; +	size_t offset = 0, j; +	struct fileitem *all_files; +	struct fileitem *prev_fileitem = NULL; + +	all_files = malloc(list_size * sizeof(struct fileitem)); + +	for(i = pkglist; i; i = i->next) { +		alpm_pkg_t *pkg = i->data; +		alpm_filelist_t *filelist = alpm_pkg_get_files(pkg); +		for(j = 0; j < filelist->count; j++) { +			alpm_file_t *file = filelist->files + j; +			/* only add files, not directories, to our big list */ +			if(file->name[strlen(file->name) - 1] == '/') { +				continue; +			} + +			/* do we need to reallocate and grow our array? */ +			if(offset >= list_size) { +				struct fileitem *new_files; +				new_files = realloc(all_files, list_size * 2 * sizeof(struct fileitem)); +				if(!new_files) { +					free(all_files); +					return 1; +				} +				all_files = new_files; +				list_size *= 2; +			} + +			/* we can finally add it to the list */ +			all_files[offset].file = file; +			all_files[offset].pkg = pkg; +			offset++; +		} +	} + +	/* now sort the list so we can find duplicates */ +	qsort(all_files, offset, sizeof(struct fileitem), fileitem_cmp); + +	/* do a 'uniq' style check on the list */ +	for(j = 0; j < offset; j++) { +		struct fileitem *fileitem = all_files + j; +		if(prev_fileitem && fileitem_cmp(prev_fileitem, fileitem) == 0) { +			printf("file owned by %s and %s: %s\n", +					alpm_pkg_get_name(prev_fileitem->pkg), +					alpm_pkg_get_name(fileitem->pkg), +					fileitem->file->name); +		} +		prev_fileitem = fileitem; +	} + +	free(all_files); +	return ret; +} +  static int check_localdb(void)  {  	int ret = 0; @@ -141,8 +209,9 @@ static int check_localdb(void)  	db = alpm_option_get_localdb(handle);  	pkglist = alpm_db_get_pkgcache(db); -	ret += checkdeps(pkglist); -	ret += checkconflicts(pkglist); +	ret += check_deps(pkglist); +	ret += check_conflicts(pkglist); +	ret += check_filelists(pkglist);  	return ret;  } @@ -154,7 +223,7 @@ static int check_syncdbs(alpm_list_t *dbnames)  	const alpm_siglevel_t level = ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL;  	for(i = dbnames; i; i = alpm_list_next(i)) { -		char *dbname = alpm_list_getdata(i); +		const char *dbname = i->data;  		db = alpm_db_register_sync(handle, dbname, level);  		if(db == NULL) {  			fprintf(stderr, "error: could not register sync database (%s)\n", @@ -165,7 +234,7 @@ static int check_syncdbs(alpm_list_t *dbnames)  		pkglist = alpm_db_get_pkgcache(db);  		syncpkglist = alpm_list_join(syncpkglist, alpm_list_copy(pkglist));  	} -	ret += checkdeps(syncpkglist); +	ret += check_deps(syncpkglist);  cleanup:  	alpm_list_free(syncpkglist); @@ -185,7 +254,7 @@ static void usage(void)  int main(int argc, char *argv[])  {  	int ret = 0; -	enum _alpm_errno_t err; +	alpm_errno_t err;  	const char *dbpath = DBPATH;  	int a = 1;  	alpm_list_t *dbnames = NULL; diff --git a/src/util/testpkg.c b/src/util/testpkg.c index 90758e16..6385e417 100644 --- a/src/util/testpkg.c +++ b/src/util/testpkg.c @@ -41,7 +41,7 @@ int main(int argc, char *argv[])  {  	int retval = 1; /* default = false */  	alpm_handle_t *handle; -	enum _alpm_errno_t err; +	alpm_errno_t err;  	alpm_pkg_t *pkg = NULL;  	const alpm_siglevel_t level = ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL; | 
