Merge branch 'maint'

Conflicts:
	src/pacman/util.c
This commit is contained in:
Dan McGee 2011-10-13 11:25:09 -05:00
commit ff87046354
5 changed files with 96 additions and 66 deletions

4
NEWS
View File

@ -1,5 +1,8 @@
VERSION DESCRIPTION
-----------------------------------------------------------------------------
4.0.1 - ensure VerbosePkgList table display supports multibyte chars
- add guidance message for users when public keyring not found
- repo-add: fix race condition around lock file removal
4.0.0 - well-integrated and powerful signed packages and databases
support in pacman, the library, and scripts (FS#5331)
- over 800 commits to pacman.git since 3.5.4 release
@ -44,6 +47,7 @@ VERSION DESCRIPTION
- makepkg:
- allow signing packages after creation
- allow verifying source file signatures (FS#20448)
- add auto-versioned libdepends/libprovides support
- support UPX compression of executables (FS#17213)
- allow usage of an alternate build directory (FS#22308)
- cleancache option has been removed; use shell instead

View File

@ -140,6 +140,9 @@ static int init_gpgme(alpm_handle_t *handle)
|| _alpm_access(handle, sigdir, "trustdb.gpg", R_OK)) {
handle->pm_errno = ALPM_ERR_NOT_A_FILE;
_alpm_log(handle, ALPM_LOG_DEBUG, "Signature verification will fail!\n");
_alpm_log(handle, ALPM_LOG_WARNING,
_("Public keyring not found; have you run '%s'?\n"),
"pacman-key --init");
}
/* calling gpgme_check_version() returns the current version and runs
@ -370,7 +373,7 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
const char *base64_sig, alpm_siglist_t *siglist)
{
int ret = -1, sigcount;
gpgme_error_t err;
gpgme_error_t err = 0;
gpgme_ctx_t ctx;
gpgme_data_t filedata, sigdata;
gpgme_verify_result_t verify_result;
@ -394,9 +397,27 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
_alpm_access(handle, NULL, sigpath, R_OK);
}
/* does the file we are verifying exist? */
file = fopen(path, "rb");
if(file == NULL) {
handle->pm_errno = ALPM_ERR_NOT_A_FILE;
goto error;
}
/* does the sig file exist (if we didn't get the data directly)? */
if(!base64_sig) {
sigfile = fopen(sigpath, "rb");
if(sigfile == NULL) {
_alpm_log(handle, ALPM_LOG_DEBUG, "sig path %s could not be opened\n",
sigpath);
handle->pm_errno = ALPM_ERR_SIG_MISSING;
goto error;
}
}
if(init_gpgme(handle)) {
/* pm_errno was set in gpgme_init() */
return -1;
goto error;
}
_alpm_log(handle, ALPM_LOG_DEBUG, "checking signature for %s\n", path);
@ -409,11 +430,6 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
CHECK_ERR();
/* create our necessary data objects to verify the signature */
file = fopen(path, "rb");
if(file == NULL) {
handle->pm_errno = ALPM_ERR_NOT_A_FILE;
goto error;
}
err = gpgme_data_new_from_stream(&filedata, file);
CHECK_ERR();
@ -425,19 +441,12 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
&decoded_sigdata, &data_len);
if(decode_ret) {
handle->pm_errno = ALPM_ERR_SIG_INVALID;
goto error;
goto gpg_error;
}
err = gpgme_data_new_from_mem(&sigdata,
(char *)decoded_sigdata, data_len, 0);
} else {
/* file-based, it is on disk */
sigfile = fopen(sigpath, "rb");
if(sigfile == NULL) {
_alpm_log(handle, ALPM_LOG_DEBUG, "sig path %s could not be opened\n",
sigpath);
handle->pm_errno = ALPM_ERR_SIG_MISSING;
goto error;
}
err = gpgme_data_new_from_stream(&sigdata, sigfile);
}
CHECK_ERR();
@ -450,14 +459,14 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
if(!verify_result || !verify_result->signatures) {
_alpm_log(handle, ALPM_LOG_DEBUG, "no signatures returned\n");
handle->pm_errno = ALPM_ERR_SIG_MISSING;
goto error;
goto gpg_error;
}
for(gpgsig = verify_result->signatures, sigcount = 0;
gpgsig; gpgsig = gpgsig->next, sigcount++);
_alpm_log(handle, ALPM_LOG_DEBUG, "%d signatures returned\n", sigcount);
CALLOC(siglist->results, sigcount, sizeof(alpm_sigresult_t),
handle->pm_errno = ALPM_ERR_MEMORY; goto error);
handle->pm_errno = ALPM_ERR_MEMORY; goto gpg_error);
siglist->count = sigcount;
for(gpgsig = verify_result->signatures, sigcount = 0; gpgsig;
@ -488,7 +497,7 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
err = GPG_ERR_NO_ERROR;
/* we dupe the fpr in this case since we have no key to point at */
STRDUP(result->key.fingerprint, gpgsig->fpr,
handle->pm_errno = ALPM_ERR_MEMORY; goto error);
handle->pm_errno = ALPM_ERR_MEMORY; goto gpg_error);
} else {
CHECK_ERR();
if(key->uids) {
@ -555,10 +564,12 @@ int _alpm_gpgme_checksig(alpm_handle_t *handle, const char *path,
ret = 0;
error:
gpg_error:
gpgme_data_release(sigdata);
gpgme_data_release(filedata);
gpgme_release(ctx);
error:
if(sigfile) {
fclose(sigfile);
}

View File

@ -179,7 +179,9 @@ clean_up() {
##
set -E
trap 'clean_up' 0
trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
for signal in TERM HUP QUIT; do
trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal"
done
trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR

View File

@ -520,13 +520,19 @@ remove() {
}
trap_exit() {
# unhook all traps to avoid race conditions
trap '' EXIT TERM HUP QUIT INT ERR
echo
error "$@"
exit 1
clean_up 1
}
clean_up() {
local exit_code=$?
local exit_code=${1:-$?}
# unhook all traps to avoid race conditions
trap '' EXIT TERM HUP QUIT INT ERR
[[ -d $tmpdir ]] && rm -rf "$tmpdir"
(( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE"
@ -566,9 +572,11 @@ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\
mkdir $tmpdir/tree
trap 'clean_up' EXIT
trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
for signal in TERM HUP QUIT; do
trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal"
done
trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit "$(gettext "An unknown error has occured. Exiting...")"' ERR
trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR
declare -a args
success=0

View File

@ -488,34 +488,47 @@ void string_display(const char *title, const char *string)
}
static void table_print_line(const alpm_list_t *line,
const alpm_list_t *formats)
size_t colcount, size_t *widths)
{
const alpm_list_t *curformat = formats;
const alpm_list_t *curcell = line;
size_t i;
const alpm_list_t *curcell;
while(curcell && curformat) {
printf(curformat->data, curcell->data);
curcell = alpm_list_next(curcell);
curformat = alpm_list_next(curformat);
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);
/* silly printf requires padding size to be an int */
int padding = (int)widths[i] - (int)len;
if(padding < 0) {
padding = 0;
}
/* left-align all but the last column */
if(i + 1 < colcount) {
printf("%s%*s", value, padding, "");
} else {
printf("%*s%s", padding, "", value);
}
}
printf("\n");
}
/* creates format strings by checking max cell lengths in cols */
static alpm_list_t *table_create_format(const alpm_list_t *header,
const alpm_list_t *rows)
/* find the max string width of each column */
static size_t table_calc_widths(const alpm_list_t *header,
const alpm_list_t *rows, size_t totalcols, size_t **widths)
{
alpm_list_t *formats = NULL;
const alpm_list_t *i;
const unsigned short padding = 2;
size_t curcol, totalcols, totalwidth = 0;
size_t curcol, totalwidth = 0;
size_t *colwidths;
totalcols = alpm_list_count(header);
if(totalcols <= 0) {
return 0;
}
colwidths = malloc(totalcols * sizeof(size_t));
if(!colwidths) {
return NULL;
return 0;
}
/* header determines column count and initial values of longest_strs */
for(i = header, curcol = 0; i; i = alpm_list_next(i), curcol++) {
@ -536,30 +549,16 @@ static alpm_list_t *table_create_format(const alpm_list_t *header,
}
}
/* now use the column width info to generate format strings */
for(curcol = 0; curcol < totalcols; curcol++) {
const char *display;
char *formatstr;
size_t colwidth = colwidths[curcol] + padding;
totalwidth += colwidth;
/* right align the last column for a cleaner table display */
display = (curcol + 1 < totalcols) ? "%%-%ds" : "%%%ds";
pm_asprintf(&formatstr, display, colwidth);
formats = alpm_list_add(formats, formatstr);
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;
}
totalwidth += colwidths[curcol];
}
free(colwidths);
/* return NULL if terminal is not wide enough */
if(totalwidth > getcols()) {
fprintf(stderr, _("insufficient columns available for table display\n"));
FREELIST(formats);
return NULL;
}
return formats;
*widths = colwidths;
return totalwidth;
}
/** Displays the list in table format
@ -576,14 +575,20 @@ int table_display(const char *title, const alpm_list_t *header,
const alpm_list_t *rows)
{
const alpm_list_t *i;
alpm_list_t *formats;
size_t *widths = NULL, totalcols, totalwidth;
if(rows == NULL || header == NULL) {
return 0;
}
formats = table_create_format(header, rows);
if(formats == NULL) {
totalcols = alpm_list_count(header);
totalwidth = table_calc_widths(header, rows, totalcols, &widths);
/* return -1 if terminal is not wide enough */
if(totalwidth > getcols()) {
fprintf(stderr, _("insufficient columns available for table display\n"));
return -1;
}
if(!totalwidth || !widths) {
return -1;
}
@ -591,14 +596,14 @@ int table_display(const char *title, const alpm_list_t *header,
printf("%s\n\n", title);
}
table_print_line(header, formats);
table_print_line(header, totalcols, widths);
printf("\n");
for(i = rows; i; i = alpm_list_next(i)) {
table_print_line(i->data, formats);
table_print_line(i->data, totalcols, widths);
}
FREELIST(formats);
free(widths);
return 0;
}