diff options
Diffstat (limited to 'src/pacman')
| -rw-r--r-- | src/pacman/Makefile.am | 5 | ||||
| -rw-r--r-- | src/pacman/callback.c | 66 | ||||
| -rw-r--r-- | src/pacman/conf.c | 19 | ||||
| -rw-r--r-- | src/pacman/conf.h | 3 | ||||
| -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 | 170 | ||||
| -rw-r--r-- | src/pacman/util.h | 2 | 
14 files changed, 305 insertions, 229 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..87ba30af 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 */ @@ -95,41 +94,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 +137,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 +195,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 +226,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 +293,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 +316,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 +339,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;  	} @@ -493,7 +499,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); @@ -713,7 +719,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..117aecd4 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> @@ -203,11 +201,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 +257,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; @@ -522,7 +523,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"); @@ -659,7 +660,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"), @@ -822,7 +823,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 +860,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..325fbb64 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -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 326664dd..3e17d905 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 2773708c..a13b6c7f 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; @@ -253,7 +251,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) { @@ -288,7 +286,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) { @@ -337,7 +335,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); @@ -353,28 +351,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); @@ -400,9 +398,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) { @@ -410,9 +408,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));  						}  					}  				} @@ -420,15 +418,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 */ @@ -448,7 +446,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; @@ -464,14 +462,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); @@ -495,10 +493,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);  			}  		} @@ -514,11 +512,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; @@ -540,10 +538,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), @@ -569,7 +567,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; @@ -600,7 +598,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 */ @@ -616,7 +614,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; @@ -628,6 +626,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, @@ -647,7 +651,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; @@ -658,7 +662,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; @@ -666,12 +670,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); @@ -685,20 +691,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++; @@ -710,14 +716,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) { @@ -730,6 +737,7 @@ cleanup:  static int sync_trans(alpm_list_t *targets)  { +	int retval = 0;  	alpm_list_t *i;  	/* Step 1: create a new transaction... */ @@ -739,13 +747,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"); @@ -766,19 +778,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); @@ -786,7 +798,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"), @@ -835,13 +847,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"), @@ -859,7 +871,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 b9ee8c9c..4160c44d 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;  	} @@ -327,13 +325,13 @@ char *strtoupper(char *str)  /* 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)) { @@ -350,16 +348,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 @@ -400,7 +398,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)); @@ -487,77 +485,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;  } @@ -574,22 +615,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;  	} @@ -597,14 +641,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;  } @@ -623,18 +668,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) { @@ -642,10 +687,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');  	}  } @@ -663,7 +708,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)) { @@ -671,7 +716,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");  		}  	} @@ -786,7 +831,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));  	} @@ -838,7 +888,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); @@ -882,7 +932,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); @@ -939,7 +989,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; @@ -950,7 +1000,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; @@ -985,7 +1035,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;  			} @@ -1040,7 +1090,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 */ @@ -1132,8 +1182,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) @@ -1175,7 +1225,7 @@ 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;  		char *ends = NULL; diff --git a/src/pacman/util.h b/src/pacman/util.h index 6ec962ff..62919395 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -56,7 +56,7 @@ const char *mbasename(const char *path);  char *mdirname(const char *path);  void indentprint(const char *str, size_t indent);  char *strtoupper(char *str); -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); | 
