From 9e9a116fb7c06190687cc8d5afb2d5d5ac610f3f Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 3 Jun 2021 16:22:43 +0200 Subject: [PATCH 01/N] Msysize --- lib/libalpm/add.c | 2 + .../lint_package/build_references.sh.in | 8 + scripts/libmakepkg/tidy/staticlibs.sh.in | 4 +- scripts/libmakepkg/tidy/strip.sh.in | 180 ++++++++++++------ scripts/libmakepkg/utils_fixed_path.sh.in | 34 ++++ scripts/makepkg.sh.in | 174 +++++++---------- scripts/pacman-db-upgrade.sh.in | 12 +- scripts/pacman-key.sh.in | 22 +-- scripts/repo-add.sh.in | 11 +- scripts/wrapper.sh.in | 2 +- src/pacman/callback.c | 7 +- src/pacman/check.c | 2 + src/pacman/pacman.c | 4 + test/pacman/pmtest.py | 19 +- 14 files changed, 283 insertions(+), 198 deletions(-) create mode 100644 scripts/libmakepkg/utils_fixed_path.sh.in diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index f806e5b..f0af886 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -266,6 +266,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, "filesystem: %o package: %o\n", filename, lsbuf.st_mode & mask, entrymode & mask); } +#ifndef __MSYS__ #if 0 /* Disable this warning until our user management in packages has improved. @@ -283,6 +284,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, } #endif +#endif _alpm_log(handle, ALPM_LOG_DEBUG, "extract: skipping dir extraction of %s\n", filename); archive_read_data_skip(archive); diff --git a/scripts/libmakepkg/lint_package/build_references.sh.in b/scripts/libmakepkg/lint_package/build_references.sh.in index 9b7ffab..a5fc455 100644 --- a/scripts/libmakepkg/lint_package/build_references.sh.in +++ b/scripts/libmakepkg/lint_package/build_references.sh.in @@ -37,5 +37,13 @@ warn_build_references() { printf '%s\n' "${refs[@]#"$pkgdir/"}" >&2 fi done + + # Check for Windows-style MSYS2 root path + if find "${pkgdir}" -type f -print0 | xargs -0 grep -iFqI "$(cygpath -m /)" ; then + warning "$(gettext "Package contains reference to %s")" "\$(cygpath -m /)" + fi + if find "${pkgdir}" -type f -print0 | xargs -0 grep -iFqI "$(cygpath -w /)" ; then + warning "$(gettext "Package contains reference to %s")" "\$(cygpath -w /)" + fi return 0 } diff --git a/scripts/libmakepkg/tidy/staticlibs.sh.in b/scripts/libmakepkg/tidy/staticlibs.sh.in index 498518c..e9d514a 100644 --- a/scripts/libmakepkg/tidy/staticlibs.sh.in +++ b/scripts/libmakepkg/tidy/staticlibs.sh.in @@ -35,9 +35,9 @@ tidy_staticlibs() { msg2 "$(gettext "Removing static library files...")" local l while IFS= read -rd '' l; do - if [[ -f "${l%.a}.so" || -h "${l%.a}.so" ]]; then + if [[ -f "${l%.a}.dll.a" || -h "${l%.a}.dll.a" ]]; then rm "$l" fi - done < <(find . ! -type d -name "*.a" -print0) + done < <(find . ! -type d \( -name "*.a" ! -name "*.dll.a" \) -print0) fi } diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in index 5d03b28..e3d4061 100644 --- a/scripts/libmakepkg/tidy/strip.sh.in +++ b/scripts/libmakepkg/tidy/strip.sh.in @@ -31,10 +31,6 @@ packaging_options+=('strip' 'debug') tidy_modify+=('tidy_strip') -build_id() { - LANG=C readelf -n "$1" | sed -n '/Build ID/ { s/.*: //p; q; }' -} - source_files() { LANG=C readelf "$1" --debug-dump 2>/dev/null | \ awk '/DW_AT_name +:/{name=$NF}/DW_AT_comp_dir +:/{{if (name == "") next}{if (name !~ /^[<\/]/) {printf "%s/", $NF}}{print name}}' @@ -43,58 +39,63 @@ source_files() { strip_file() { local binary=$1; shift - if check_option "debug" "y"; then - local bid=$(build_id "$binary") - - # has this file already been stripped - if [[ -n "$bid" ]]; then - if [[ -f "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" ]]; then + case "$(file -bi "$binary")" in + *application/x-dosexec*) + if check_option "debug" "y"; then + if [[ -f "$dbgdir/$binary.debug" ]]; then return fi - elif [[ -f "$dbgdir/$binary.debug" ]]; then - return - fi - # copy source files to debug directory - local file dest t - while IFS= read -r t; do - file=${t/${dbgsrcdir}/"$srcdir"} - dest="${dbgsrc/"$dbgsrcdir"/}$t" - if ! [[ -f $dest ]]; then - mkdir -p "${dest%/*}" - cp -- "$file" "$dest" - fi - done < <(source_files "$binary") + # copy source files to debug directory + local file dest t + while IFS= read -r t; do + file=${t/${dbgsrcdir}/"$srcdir"} + dest="${dbgsrc/"$dbgsrcdir"/}$t" + if ! [[ -f $dest ]]; then + mkdir -p "${dest%/*}" + cp -- "$file" "$dest" + fi + done < <(source_files "$binary") + + # copy debug symbols to debug directory + mkdir -p "$dbgdir/${binary%/*}" + msg2 "Separating debug info from $binary into $dbgdir/$binary.debug" + # create a dbg file with proper debug info: + objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug" + + msg2 "Creating a debuginfo link to $dbgdir/$binary.debug in $binary" + local tempfile=$(mktemp "$binary.XXXXXX") + objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary" "$tempfile" + cat "$tempfile" > "$binary" + rm "$tempfile" + + msg2 "Separating (again) debug info from $binary into $dbgdir/$binary.debug" + objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug" + + msg2 "Removing old .gnu_debuglink section from $binary" + objcopy --remove-section=.gnu_debuglink "$binary" + + # strip debug-info from the original file + objcopy --strip-debug "$binary" + msg2 "Creating (again) a debuginfo link to $dbgdir/$binary.debug in $binary" + tempfile=$(mktemp "$binary.XXXXXX") + objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary" "$tempfile" + cat "$tempfile" > "$binary" + rm "$tempfile" + # This way dbg file gets a .gnu_debuglink section (doesn't matter where + # it's pointing), and its contents pass the CRC32 check + + # create any needed hardlinks + while IFS= read -rd '' file ; do + if [[ "${binary}" -ef "${file}" && ! -f "$dbgdir/${file}.debug" ]]; then + mkdir -p "$dbgdir/${file%/*}" + ln "$dbgdir/${binary}.debug" "$dbgdir/${file}.debug" + fi + done < <(find . -type f -perm -u+w -print0 2>/dev/null) - # copy debug symbols to debug directory - mkdir -p "$dbgdir/${binary%/*}" - objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug" - local tempfile=$(mktemp "$binary.XXXXXX") - objcopy --add-gnu-debuglink="$dbgdir/${binary#/}.debug" "$binary" "$tempfile" - cat "$tempfile" > "$binary" - rm "$tempfile" - - # create any needed hardlinks - while IFS= read -rd '' file ; do - if [[ "${binary}" -ef "${file}" && ! -f "$dbgdir/${file}.debug" ]]; then - mkdir -p "$dbgdir/${file%/*}" - ln "$dbgdir/${binary}.debug" "$dbgdir/${file}.debug" - fi - done < <(find . -type f -perm -u+w -print0 2>/dev/null) - - if [[ -n "$bid" ]]; then - local target - mkdir -p "$dbgdir/.build-id/${bid:0:2}" - - target="../../../../../${binary#./}" - target="${target/..\/..\/usr\/lib\/}" - target="${target/..\/usr\/}" - ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}" - - target="../../${binary#./}.debug" - ln -s "$target" "$dbgdir/.build-id/${bid:0:2}/${bid:2}.debug" fi - fi + ;; + esac local tempfile=$(mktemp "$binary.XXXXXX") if strip "$@" "$binary" -o "$tempfile"; then @@ -123,17 +124,86 @@ tidy_strip() { if check_option "debug" "y"; then - dbgdir="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@/usr/lib/debug" + dbgdir="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@" dbgsrcdir="${DBGSRCDIR:-/usr/src/debug}" dbgsrc="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@$dbgsrcdir" mkdir -p "$dbgdir" "$dbgsrc" fi local binary strip_flags - find . -type f -perm -u+w -print0 2>/dev/null | while IFS= read -rd '' binary ; do + # *.so: Apache2 modules, OCaml stublibs, Ruby modules + # *.oct: Octave modules + # *.cmxs: OCaml natdynlink modules: http://gallium.inria.fr/~frisch/ndl.txt + find * -type f ! -name '*.dll.a' ! -name '*.lib' \ + -a \( -name '*.a' -o -name '*.dll' -o -name '*.exe' -o -name '*.so' -o -name '*.so.*' -o -name '*.oct' -o -name '*.cmxs' \) -print0 \ + -o -type f -executable ! -name '*.dll' ! -name '*.exe' ! -name '*.so' ! -name '*.so.[0-9]*' ! -name '*.oct' ! -name '*.cmxs' ! -name '*.a' ! -name '*.la' ! -name '*.lib' ! -name '*.exe.manifest' ! -name '*.exe.config' ! -name '*.dll.config' ! -name '*.mdb' ! -name '*-config' ! -name '*.csh' ! -name '*.sh' ! -name '*.pl' ! -name '*.pm' ! -name '*.py' ! -name '*.rb' ! -name '*.tcl' -print0 | \ + while IFS= read -d $'\0' binary + do local STRIPLTO=0 - case "$(LC_ALL=C readelf -h "$binary" 2>/dev/null)" in - *Type:*'DYN (Shared object file)'*) # Libraries (.so) or Relocatable binaries + # Skip thin archives from stripping + case "${binary##*/}" in + *.a) + if [ "$(head -c 7 "${binary}")" = '!' ] + then + continue + fi + ;; + esac + + # assure this is actually a binary object + if [ "$(head -c 2 "${binary}")" = '#!' ] + then + # sometimes .exe will be appended where it does not belong + case "${exe}" in + usr/lib/hevea/*.exe) ;; + *.exe) mv "${binary}" "${binary%.exe}" ;; + esac + continue + fi + + # OCaml bytecode must not be stripped + # Magic number is at end of file: + # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=256900#74 + # http://cygwin.com/ml/cygwin-apps/2010-10/msg00057.html + # + # Perl Archive (PAR) binaries must not be stripped + # https://rt.cpan.org/Public/Bug/Display.html?id=18536 + # http://cygwin.com/ml/cygwin-apps/2012-07/msg00088.html + case $(tail -c 12 "${binary}" | tr '\012\0' '%') in + %PAR\.pm%) continue ;; + Caml1999X0[0-9][0-9]) continue ;; + esac + + # Mono assemblies must not be stripped, but remove .mdb debug symbols, + # and make them non-executable so they're not launched by MS .NET + if LC_ALL=C file -b "${binary}" 2>&1 | grep -q "Mono/\.Net assembly" + then + chmod 0644 "${binary}" + rm -f "${binary}.mdb" + continue + fi + + # check for .exe from non-automake Makefile which install(1) didn't fix + # strip(1) used to take care of this, but not anymore + case ${CHOST} in + *-*-cygwin*|*-*-mingw*|*-*-msys*) + case "${binary##*/}" in + *.dll|*.exe|*.sfx|*.so|*.so.[0-9]*|*.oct|*.cmxs) ;; + # make sure this isn't some oddly named DLL + *) if LANG=en_US.UTF-8 LC_ALL=C objdump -f "${binary}" | grep -Eq '^start address 0x(0000000[01])?00401[0-9a-e][0-9a-e]0' + then + mv "${binary}" "${binary}.exe" + binary+=.exe + fi ;; + esac + ;; + esac + chmod 0755 "${binary}"; + + case "$(@FILECMD@ -bi "$binary")" in + *application/x-dosexec*) # Windows executables and dlls + strip_flags="$STRIP_SHARED";; + *application/x-sharedlib*) # Libraries (.so) strip_flags="$STRIP_SHARED";; *Type:*'EXEC (Executable file)'*) # Binaries strip_flags="$STRIP_BINARIES";; diff --git a/scripts/libmakepkg/utils_fixed_path.sh.in b/scripts/libmakepkg/utils_fixed_path.sh.in new file mode 100644 index 0000000..e3a06bc --- /dev/null +++ b/scripts/libmakepkg/utils_fixed_path.sh.in @@ -0,0 +1,34 @@ +if [[ -n "$MSYSTEM" ]]; then + readonly -a UTILS_NAME=('bsdtar' + 'bzip2' + 'bzr' + 'cat' + 'ccache' + 'distcc' + 'git' + 'gpg' + 'gzip' + 'hg' + 'lzip' + 'lzop' + 'openssl' + 'svn' + 'tput' + 'uncompress' + 'xargs' + 'xz' + 'zstd' + ) + + for wrapper in ${UTILS_NAME[@]}; do + eval " + ${wrapper}"'() { + local UTILS_PATH="/usr/bin/" + if ! type -p ${UTILS_PATH}${FUNCNAME[0]} >/dev/null; then + error "$(gettext "Cannot find the %s binary required for makepkg.")" "${UTILS_PATH}${FUNCNAME[0]}" + exit 1 + fi + ${UTILS_PATH}${FUNCNAME[0]} "$@" + }' + done +fi diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index e58edfa..6c8446b 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # makepkg - make packages compatible for use with pacman # @@ -26,7 +26,7 @@ # makepkg uses quite a few external programs during its execution. You # need to have at least the following installed for makepkg to function: -# awk, bsdtar (libarchive), bzip2, coreutils, fakeroot, file, find (findutils), +# awk, bsdtar (libarchive), bzip2, coreutils, file, find (findutils), # gettext, gpg, grep, gzip, sed, tput (ncurses), xz # gettext initialization @@ -59,7 +59,6 @@ FORCE=0 GENINTEG=0 HOLDVER=0 IGNOREARCH=0 -INFAKEROOT=0 INSTALL=0 LOGGING=0 NEEDED=0 @@ -105,10 +104,9 @@ done trap_exit() { local signal=$1; shift - if (( ! INFAKEROOT )); then - echo - error "$@" - fi + echo + error "$@" + [[ -n $srclinks ]] && rm -rf "$srclinks" # unset the trap for this signal, and then call the default handler @@ -123,11 +121,6 @@ trap_exit() { clean_up() { local EXIT_CODE=$? - if (( INFAKEROOT )); then - # Don't clean up when leaving fakeroot, we're not done yet. - return 0 - fi - if [[ -p $logpipe ]]; then rm "$logpipe" fi @@ -137,7 +130,7 @@ clean_up() { # If it's a clean exit and -c/--clean has been passed... msg "$(gettext "Cleaning up...")" - rm -rf "$pkgdirbase" "$srcdir" + rm -rf "$pkgdirbase" "$srcdir" "$destdir" if [[ -n $pkgbase ]]; then local fullver=$(get_full_version) # Can't do this unless the BUILDSCRIPT has been sourced. @@ -179,11 +172,6 @@ clean_up() { fi } -enter_fakeroot() { - msg "$(gettext "Entering %s environment...")" "fakeroot" - fakeroot -- bash -$- "${BASH_SOURCE[0]}" -F "${ARGLIST[@]}" || exit $? -} - # Automatically update pkgver variable if a pkgver() function is provided # Re-sources the PKGBUILD afterwards to allow for other variables that use $pkgver update_pkgver() { @@ -237,10 +225,6 @@ run_pacman() { else cmd=("${PACMAN_AUTH[@]}" "${cmd[@]}") fi - elif type -p sudo >/dev/null; then - cmd=(sudo "${cmd[@]}") - else - cmd=(su root -c "$cmdescape") fi local lockfile="$(pacman-conf DBPath)/db.lck" while [[ -f $lockfile ]]; do @@ -440,7 +424,7 @@ run_function() { $pkgfunc &>"$logpipe" - wait -f $teepid + wait $teepid rm "$logpipe" else "$pkgfunc" @@ -468,7 +452,7 @@ find_libdepends() { sodepends=0 for d in "${depends[@]}"; do - if [[ $d = *.so ]]; then + if [[ $d = *.dll ]]; then sodepends=1 break fi @@ -479,28 +463,33 @@ find_libdepends() { return 0 fi - local libdeps filename soarch sofile soname soversion + local libdeps filename soarch sofile soname declare -A libdeps while IFS= read -rd '' filename; do - # get architecture of the file; if soarch is empty it's not an ELF binary - soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') + # get architecture of the file; if soarch is empty it's not an binary + soarch=$(LANG=en_US.UTF-8 LC_ALL=C objdump -a "$filename" | sed -n 's/.*file format.*pei-\(i386\|x86-64\)/\1/p') [[ -n "$soarch" ]] || continue + case "$soarch" in + i386) + soarch=i686 + ;; + x86-64) + soarch=x86_64 + ;; + esac # process all libraries needed by the binary - for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p') + for sofile in $(LC_ALL=C objdump -x "$filename" 2>/dev/null | sed -nr 's/.*DLL Name: (.*).*/\1/p') do - # extract the library name: libfoo.so - soname="${sofile%.so?(+(.+([0-9])))}".so - # extract the major version: 1 - soversion="${sofile##*\.so\.}" + soname=${sofile} if [[ ${libdeps[$soname]} ]]; then - if [[ ${libdeps[$soname]} != *${soversion}-${soarch}* ]]; then - libdeps[$soname]+=" ${soversion}-${soarch}" + if [[ ${libdeps[$soname]} != *${soarch}* ]]; then + libdeps[$soname]+=" ${soarch}" fi else - libdeps[$soname]="${soversion}-${soarch}" + libdeps[$soname]="${soarch}" fi done done < <(find "$pkgdir" -type f -perm -u+x -print0) @@ -508,7 +497,7 @@ find_libdepends() { local libdepends v for d in "${depends[@]}"; do case "$d" in - *.so) + *.dll) if [[ ${libdeps[$d]} ]]; then for v in ${libdeps[$d]}; do libdepends+=("$d=$v") @@ -534,30 +523,23 @@ find_libprovides() { missing=0 versioned_provides=() case "$p" in - *.so) - mapfile -t filename < <(find "$pkgdir" -type f -name $p\* | LC_ALL=C sort) + *.dll) + mapfile -t filename < <(find "$pkgdir" -type f -name $p) if [[ $filename ]]; then # packages may provide multiple versions of the same library for fn in "${filename[@]}"; do - # check if we really have a shared object - if LC_ALL=C readelf -h "$fn" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then - # get the string binaries link to (e.g. libfoo.so.1.2 -> libfoo.so.1) - local sofile=$(LC_ALL=C readelf -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p') - if [[ -z "$sofile" ]]; then - warning "$(gettext "Library listed in %s is not versioned: %s")" "'provides'" "$p" - continue - fi - - # get the library architecture (32 or 64 bit) - local soarch=$(LC_ALL=C readelf -h "$fn" | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p') - - # extract the library major version - local soversion="${sofile##*\.so\.}" - - versioned_provides+=("${p}=${soversion}-${soarch}") - else - warning "$(gettext "Library listed in %s is not a shared object: %s")" "'provides'" "$p" - fi + # get the library architecture (32 or 64 bit) + local soarch=$(LC_ALL=C objdump -a "$fn" | sed -n 's/.*file format.*pei-\(i386\|x86-64\)/\1/p') + case "$soarch" in + i386) + soarch=i686 + ;; + x86-64) + soarch=x86_64 + ;; + esac + + versioned_provides+=("${p}=${soarch}") done else missing=1 @@ -597,7 +579,6 @@ write_pkginfo() { merge_arch_attrs printf "# Generated by makepkg %s\n" "$makepkg_version" - printf "# using %s\n" "$(fakeroot -v)" write_kv_pair "pkgname" "$pkgname" write_kv_pair "pkgbase" "$pkgbase" @@ -750,7 +731,7 @@ create_debug_package() { local pkgdir="$pkgdirbase/$pkgbase-@DEBUGSUFFIX@" # check if we have any debug symbols to package - if dir_is_empty "$pkgdir/usr/lib/debug"; then + if dir_is_empty "$pkgdir"; then return 0 fi @@ -939,6 +920,11 @@ restore_package_variables() { run_single_packaging() { local pkgdir="$pkgdirbase/$pkgname" + # clean existing pkg directory + if [[ -d "$pkgdir" ]]; then + msg "$(gettext "Removing existing %s directory...")" "\$pkgdir/" + rm -rf "$pkgdir" + fi mkdir "$pkgdir" if [[ -n $1 ]] || (( PKGFUNC )); then run_package $1 @@ -1032,12 +1018,16 @@ if ! type -p gettext >/dev/null; then gettext() { printf "%s\n" "$@" } +else + gettext() { + /usr/bin/gettext "$@" + } fi ARGLIST=("$@") # Parse Command Line Options. -OPT_SHORT="AcCdefFghiLmop:rRsSV" +OPT_SHORT="AcCdefghiLmop:rRsSV" OPT_LONG=('allsource' 'check' 'clean' 'cleanbuild' 'config:' 'force' 'geninteg' 'help' 'holdver' 'ignorearch' 'install' 'key:' 'log' 'noarchive' 'nobuild' 'nocolor' 'nocheck' 'nodeps' 'noextract' 'noprepare' 'nosign' 'packagelist' @@ -1071,7 +1061,6 @@ while true; do -d|--nodeps) NODEPS=1 ;; -e|--noextract) NOEXTRACT=1 ;; -f|--force) FORCE=1 ;; - -F) INFAKEROOT=1 ;; # generating integrity checks does not depend on architecture -g|--geninteg) BUILDPKG=0 GENINTEG=1 IGNOREARCH=1;; --holdver) HOLDVER=1 ;; @@ -1186,19 +1175,6 @@ if (( LOGGING )) && ! ensure_writable_dir "LOGDEST" "$LOGDEST"; then exit $E_FS_PERMISSIONS fi -if (( ! INFAKEROOT )); then - if (( EUID == 0 )); then - error "$(gettext "Running %s as root is not allowed as it can cause permanent,\n\ -catastrophic damage to your system.")" "makepkg" - exit $E_ROOT - fi -else - if [[ -z $FAKEROOTKEY ]]; then - error "$(gettext "Do not use the %s option. This option is only for internal use by %s.")" "'-F'" "makepkg" - exit $E_INVALID_OPTION - fi -fi - unset pkgname "${pkgbuild_schema_strings[@]}" "${pkgbuild_schema_arrays[@]}" unset "${known_hash_algos[@]/%/sums}" unset -f pkgver prepare build check package "${!package_@}" @@ -1319,29 +1295,6 @@ if (( ! PKGVERFUNC )); then check_build_status fi -# Run the bare minimum in fakeroot -if (( INFAKEROOT )); then - if (( SOURCEONLY )); then - create_srcpackage - msg "$(gettext "Leaving %s environment.")" "fakeroot" - exit $E_OK - fi - - prepare_buildenv - - chmod 755 "$pkgdirbase" - if (( ! SPLITPKG )); then - run_single_packaging - else - run_split_packaging - fi - - create_debug_package - - msg "$(gettext "Leaving %s environment.")" "fakeroot" - exit $E_OK -fi - msg "$(gettext "Making package: %s")" "$pkgbase $basever ($(date +%c))" # if we are creating a source-only package, go no further @@ -1365,7 +1318,7 @@ if (( SOURCEONLY )); then check_source_integrity all cd_safe "$startdir" - enter_fakeroot + create_srcpackage if [[ $SIGNPKG = 'y' ]]; then msg "$(gettext "Signing package...")" @@ -1415,6 +1368,9 @@ mkdir -p "$srcdir" chmod a-s "$srcdir" cd_safe "$srcdir" +export MINGW_CHOST MINGW_PREFIX MINGW_PACKAGE_PREFIX +export DXSDK_DIR ACLOCAL_PATH PKG_CONFIG_PATH + if (( !REPKG )); then if (( NOEXTRACT && ! VERIFYSOURCE )); then warning "$(gettext "Using existing %s tree")" "\$srcdir/" @@ -1467,15 +1423,23 @@ else cd_safe "$startdir" fi - enter_fakeroot + # if inhibiting archive creation, go no further + if (( NOARCHIVE )); then + msg "$(gettext "Package directory is ready.")" + exit $E_OK + fi + mkdir -p "$pkgdirbase" + chmod a-srwx "$pkgdirbase" + chmod 755 "$pkgdirbase" + if (( ! SPLITPKG )); then + run_single_packaging + else + run_split_packaging + fi - create_package_signatures || exit $E_PRETTY_BAD_PRIVACY -fi + create_debug_package -# if inhibiting archive creation, go no further -if (( NOARCHIVE )); then - msg "$(gettext "Package directory is ready.")" - exit $E_OK + create_package_signatures || exit $E_PRETTY_BAD_PRIVACY fi msg "$(gettext "Finished making: %s")" "$pkgbase $basever ($(date +%c))" diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in index 550d9f9..c1cb200 100644 --- a/scripts/pacman-db-upgrade.sh.in +++ b/scripts/pacman-db-upgrade.sh.in @@ -1,4 +1,4 @@ -#!/bin/bash -e +#!/usr/bin/env bash # # pacman-db-upgrade - upgrade the local pacman db to a newer format # @@ -78,9 +78,13 @@ resolve_dir() { # PROGRAM START # determine whether we have gettext; make it a no-op if we do not -if ! type gettext &>/dev/null; then +if ! type -p gettext >/dev/null; then gettext() { - echo "$@" + printf "%s\n" "$@" + } +else + gettext() { + /usr/bin/gettext "$@" } fi @@ -137,7 +141,7 @@ lockfile="${dbroot}/db.lck" # make sure pacman isn't running if [[ -f $lockfile ]]; then - die "$(gettext "Pacman lock file was found. Cannot run while pacman is running.")" + die "$(/bin/gettext "Pacman lock file was found. Cannot run while pacman is running.")" fi # do not let pacman run while we do this touch "$lockfile" diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in index 5034264..c923244 100644 --- a/scripts/pacman-key.sh.in +++ b/scripts/pacman-key.sh.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # pacman-key - manages pacman's keyring # Based on apt-key, from Debian @@ -30,6 +30,7 @@ LIBRARY=${LIBRARY:-'@libmakepkgdir@'} # Import libmakepkg source "$LIBRARY"/util/message.sh source "$LIBRARY"/util/parseopts.sh +source "$LIBRARY"/utils_fixed_path.sh # Options ADD=0 @@ -265,7 +266,7 @@ check_keyring() { exit 1 fi - if (( (EXPORT || FINGER || LIST || VERIFY) && EUID != 0 )); then + if (( EXPORT || FINGER || LIST || VERIFY )); then if ! grep -q "^[[:space:]]*lock-never[[:space:]]*$" ${PACMAN_KEYRING_DIR}/gpg.conf &>/dev/null; then error "$(gettext "You do not have sufficient permissions to run this command.")" msg "$(gettext "Use '%s' to correct the keyring permissions.")" "pacman-key --init" @@ -428,7 +429,7 @@ import_trustdb() { local ret=0 for importdir in "$@"; do if [[ -f "${importdir}/trustdb.gpg" ]]; then - gpg --homedir "${importdir}" --export-ownertrust | \ + /bin/gpg --homedir "${importdir}" --export-ownertrust | \ "${GPG_PACMAN[@]}" --import-ownertrust - if (( PIPESTATUS )); then error "$(gettext "%s could not be imported.")" "${importdir}/trustdb.gpg" @@ -603,10 +604,14 @@ updatedb() { fi } -# PROGRAM START -if ! type gettext &>/dev/null; then +# determine whether we have gettext; make it a no-op if we do not +if ! type -p gettext >/dev/null; then gettext() { - echo "$@" + printf "%s\n" "$@" + } +else + gettext() { + /usr/bin/gettext "$@" } fi @@ -670,11 +675,6 @@ if ! type -p gpg >/dev/null; then exit 1 fi -if (( (ADD || DELETE || EDITKEY || IMPORT || IMPORT_TRUSTDB || INIT || LSIGNKEY || POPULATE || RECEIVE || REFRESH || UPDATEDB) && EUID != 0 )); then - error "$(gettext "%s needs to be run as root for this operation.")" "pacman-key" - exit 1 -fi - CONFIG=${CONFIG:-@sysconfdir@/pacman.conf} if [[ ! -r "${CONFIG}" ]]; then error "$(gettext "%s configuration file '%s' not found.")" "pacman" "$CONFIG" diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index d393839..a231699 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # repo-add - add a package to a given repo database file # repo-remove - remove a package entry from a given repo database file @@ -46,6 +46,7 @@ PREVENT_DOWNGRADE=0 # Import libmakepkg source "$LIBRARY"/util/compress.sh source "$LIBRARY"/util/message.sh +source "$LIBRARY"/utils_fixed_path.sh # ensure we have a sane umask set umask 0022 @@ -562,9 +563,13 @@ clean_up() { # PROGRAM START # determine whether we have gettext; make it a no-op if we do not -if ! type gettext &>/dev/null; then +if ! type -p gettext &>/dev/null; then gettext() { - echo "$@" + printf "%s\n" "$@" + } +else + gettext() { + /usr/bin/gettext "$@" } fi diff --git a/scripts/wrapper.sh.in b/scripts/wrapper.sh.in index 1b28b84..504db36 100644 --- a/scripts/wrapper.sh.in +++ b/scripts/wrapper.sh.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # @PROGNAME@ - a wrapper for running the real @PROGNAME@ in the source tree # diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 75c74f8..2f07512 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -153,8 +153,11 @@ static int64_t get_update_timediff(int first_call) static void fill_progress(const int bar_percent, const int disp_percent, const int proglen) { - /* 8 = 1 space + 1 [ + 1 ] + 5 for percent */ - const int hashlen = proglen > 8 ? proglen - 8 : 0; + /* 9 = 1 space + 1 [ + 1 ] + 5 for percent + 1 blank */ + /* Without the single blank at the end, carriage return wouldn't + * work properly on most windows terminals. + */ + const int hashlen = proglen > 9 ? proglen - 9 : 0; const int hash = bar_percent * hashlen / 100; static int lasthash = 0, mouth = 0; int i; diff --git a/src/pacman/check.c b/src/pacman/check.c index 091055f..188f515 100644 --- a/src/pacman/check.c +++ b/src/pacman/check.c @@ -75,6 +75,7 @@ static int check_file_permissions(const char *pkgname, const char *filepath, int errors = 0; mode_t fsmode; +#ifndef __MSYS__ /* uid */ if(st->st_uid != archive_entry_uid(entry)) { errors++; @@ -92,6 +93,7 @@ static int check_file_permissions(const char *pkgname, const char *filepath, pkgname, filepath); } } +#endif /* mode */ fsmode = st->st_mode & (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO); diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index e398855..36c3b5e 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -1086,7 +1086,9 @@ static void cl_to_log(int argc, char *argv[]) int main(int argc, char *argv[]) { int ret = 0; +#ifndef __MSYS__ uid_t myuid = getuid(); +#endif console_cursor_hide(); install_segv_handler(); @@ -1130,11 +1132,13 @@ int main(int argc, char *argv[]) cleanup(ret); } +#ifndef __MSYS__ /* check if we have sufficient permission for the requested operation */ if(myuid > 0 && needs_root()) { pm_printf(ALPM_LOG_ERROR, _("you cannot perform this operation unless you are root.\n")); cleanup(EXIT_FAILURE); } +#endif /* we support reading targets from stdin if a cmdline parameter is '-' */ if(alpm_list_find_str(pm_targets, "-")) { diff --git a/test/pacman/pmtest.py b/test/pacman/pmtest.py index 94b0930..f008f22 100644 --- a/test/pacman/pmtest.py +++ b/test/pacman/pmtest.py @@ -239,19 +239,6 @@ class pmtest(object): vprint("\tpacman %s" % self.args) cmd = [] - if os.geteuid() != 0: - fakeroot = util.which("fakeroot") - if not fakeroot: - tap.diag("WARNING: fakeroot not found!") - else: - cmd.append("fakeroot") - - fakechroot = util.which("fakechroot") - if not fakechroot: - tap.diag("WARNING: fakechroot not found!") - else: - cmd.append("fakechroot") - if pacman["gdb"]: cmd.extend(["libtool", "execute", "gdb", "--args"]) if pacman["valgrind"]: @@ -294,8 +281,10 @@ class pmtest(object): # Change to the tmp dir before running pacman, so that local package # archives are made available more easily. time_start = time.time() - self.retcode = subprocess.call(cmd, stdout=output, stderr=output, - cwd=os.path.join(self.root, util.TMPDIR), env={'LC_ALL': 'C'}) + self.retcode = subprocess.call(cmd, + cwd=os.path.join(self.root, util.TMPDIR), + env={'LC_ALL': 'C', 'PATH': os.environ['PATH']}, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) time_end = time.time() vprint("\ttime elapsed: %.2fs" % (time_end - time_start)) -- 2.31.1