/[gentoo-x86]/eclass/eutils.eclass
Gentoo

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.55 Revision 1.73
1# Copyright 1999-2003 Gentoo Technologies, Inc. 1# Copyright 1999-2003 Gentoo Technologies, Inc.
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.55 2003/09/21 09:58:47 solar Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.73 2003/12/01 20:13:00 vapier Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 8# have to implement themselves.
461# do not exist on the users system 461# do not exist on the users system
462# vapier@gentoo.org 462# vapier@gentoo.org
463# 463#
464# Takes just 1 parameter (the directory to create tmpfile in) 464# Takes just 1 parameter (the directory to create tmpfile in)
465mymktemp() { 465mymktemp() {
466 local topdir=$1 466 local topdir="$1"
467
467 [ -z "${topdir}" ] && topdir=/tmp 468 [ -z "${topdir}" ] && topdir=/tmp
468 if [ `which mktemp 2>/dev/null` ] ; then 469 if [ "`which mktemp 2>/dev/null`" ]
470 then
469 mktemp -p ${topdir} 471 mktemp -p ${topdir}
470 else 472 else
471 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 473 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
472 touch ${tmp} 474 touch ${tmp}
473 echo ${tmp} 475 echo ${tmp}
488# groups: none 490# groups: none
489# extra: comment of 'added by portage for ${PN}' 491# extra: comment of 'added by portage for ${PN}'
490enewuser() { 492enewuser() {
491 # get the username 493 # get the username
492 local euser="$1"; shift 494 local euser="$1"; shift
493 if [ -z "${euser}" ] ; then 495 if [ -z "${euser}" ]
496 then
494 eerror "No username specified !" 497 eerror "No username specified !"
495 die "Cannot call enewuser without a username" 498 die "Cannot call enewuser without a username"
496 fi 499 fi
497 500
498 # setup a file for testing usernames/groups 501 # setup a file for testing usernames/groups
499 local tmpfile="`mymktemp ${T}`" 502 local tmpfile="`mymktemp ${T}`"
500 chown ${euser} ${tmpfile} >& /dev/null 503 chown ${euser} ${tmpfile} >& /dev/null
501 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" 504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
502 505
503 # see if user already exists 506 # see if user already exists
504 if [ "${euser}" == "${realuser}" ] ; then 507 if [ "${euser}" == "${realuser}" ]
508 then
505 return 0 509 return 0
506 fi 510 fi
507 einfo "Adding user '${euser}' to your system ..." 511 einfo "Adding user '${euser}' to your system ..."
508 512
509 # options to pass to useradd 513 # options to pass to useradd
510 local opts="" 514 local opts=
511 515
512 # handle uid 516 # handle uid
513 local euid="$1"; shift 517 local euid="$1"; shift
514 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then 518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then
515 if [ ${euid} -gt 0 ] ; then 520 if [ "${euid}" -gt 0 ]
521 then
516 opts="${opts} -u ${euid}" 522 opts="${opts} -u ${euid}"
517 else 523 else
518 eerror "Userid given but is not greater than 0 !" 524 eerror "Userid given but is not greater than 0 !"
519 die "${euid} is not a valid UID" 525 die "${euid} is not a valid UID"
520 fi 526 fi
523 fi 529 fi
524 einfo " - Userid: ${euid}" 530 einfo " - Userid: ${euid}"
525 531
526 # handle shell 532 # handle shell
527 local eshell="$1"; shift 533 local eshell="$1"; shift
528 if [ ! -z "${eshell}" ] ; then 534 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
535 then
529 if [ ! -e ${eshell} ] ; then 536 if [ ! -e "${eshell}" ]
537 then
530 eerror "A shell was specified but it does not exist !" 538 eerror "A shell was specified but it does not exist !"
531 die "${eshell} does not exist" 539 die "${eshell} does not exist"
532 fi 540 fi
533 else 541 else
534 eshell=/bin/false 542 eshell="/bin/false"
535 fi 543 fi
536 einfo " - Shell: ${eshell}" 544 einfo " - Shell: ${eshell}"
537 opts="${opts} -s ${eshell}" 545 opts="${opts} -s ${eshell}"
538 546
539 # handle homedir 547 # handle homedir
540 local ehome="$1"; shift 548 local ehome="$1"; shift
541 if [ -z "${ehome}" ] ; then 549 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
550 then
542 ehome=/dev/null 551 ehome="/dev/null"
543 fi 552 fi
544 einfo " - Home: ${ehome}" 553 einfo " - Home: ${ehome}"
545 opts="${opts} -d ${ehome}" 554 opts="${opts} -d ${ehome}"
546 555
547 # handle groups 556 # handle groups
548 local egroups="$1"; shift 557 local egroups="$1"; shift
549 if [ ! -z "${egroups}" ] ; then 558 if [ ! -z "${egroups}" ]
559 then
550 local realgroup 560 local realgroup=
551 local oldifs="${IFS}" 561 local oldifs="${IFS}"
552 export IFS="," 562 export IFS=","
553 for g in ${egroups} ; do 563 for g in ${egroups}
564 do
554 chgrp ${g} ${tmpfile} >& /dev/null 565 chgrp ${g} ${tmpfile} >& /dev/null
555 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
556 if [ "${g}" != "${realgroup}" ] ; then 567 if [ "${g}" != "${realgroup}" ]
568 then
557 eerror "You must add ${g} to the system first" 569 eerror "You must add ${g} to the system first"
558 die "${g} is not a valid GID" 570 die "${g} is not a valid GID"
559 fi 571 fi
560 done 572 done
561 export IFS="${oldifs}" 573 export IFS="${oldifs}"
565 fi 577 fi
566 einfo " - Groups: ${egroups}" 578 einfo " - Groups: ${egroups}"
567 579
568 # handle extra and add the user 580 # handle extra and add the user
569 local eextra="$@" 581 local eextra="$@"
570 local oldsandbox=${SANDBOX_ON} 582 local oldsandbox="${SANDBOX_ON}"
571 export SANDBOX_ON="0" 583 export SANDBOX_ON="0"
572 if [ -z "${eextra}" ] ; then 584 if [ -z "${eextra}" ]
585 then
573 useradd ${opts} ${euser} \ 586 useradd ${opts} ${euser} \
574 -c "added by portage for ${PN}" \ 587 -c "added by portage for ${PN}" \
575 || die "enewuser failed" 588 || die "enewuser failed"
576 else 589 else
577 einfo " - Extra: ${eextra}" 590 einfo " - Extra: ${eextra}"
578 useradd ${opts} ${euser} ${eextra} \ 591 useradd ${opts} ${euser} ${eextra} \
579 || die "enewuser failed" 592 || die "enewuser failed"
580 fi 593 fi
581 export SANDBOX_ON="${oldsandbox}" 594 export SANDBOX_ON="${oldsandbox}"
582 595
583 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then
584 einfo " - Creating ${ehome} in ${D}" 598 einfo " - Creating ${ehome} in ${D}"
585 dodir ${ehome} 599 dodir ${ehome}
586 fowners ${euser} ${ehome} 600 fowners ${euser} ${ehome}
587 fperms 755 ${ehome} 601 fperms 755 ${ehome}
588 fi 602 fi
598# gid: next available (see groupadd(8)) 612# gid: next available (see groupadd(8))
599# extra: none 613# extra: none
600enewgroup() { 614enewgroup() {
601 # get the group 615 # get the group
602 local egroup="$1"; shift 616 local egroup="$1"; shift
603 if [ -z "${egroup}" ] ; then 617 if [ -z "${egroup}" ]
618 then
604 eerror "No group specified !" 619 eerror "No group specified !"
605 die "Cannot call enewgroup without a group" 620 die "Cannot call enewgroup without a group"
606 fi 621 fi
607 622
608 # setup a file for testing groupname 623 # setup a file for testing groupname
609 local tmpfile="`mymktemp ${T}`" 624 local tmpfile="`mymktemp ${T}`"
610 chgrp ${egroup} ${tmpfile} >& /dev/null 625 chgrp ${egroup} ${tmpfile} >& /dev/null
611 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
612 627
613 # see if group already exists 628 # see if group already exists
614 if [ "${egroup}" == "${realgroup}" ] ; then 629 if [ "${egroup}" == "${realgroup}" ]
630 then
615 return 0 631 return 0
616 fi 632 fi
617 einfo "Adding group '${egroup}' to your system ..." 633 einfo "Adding group '${egroup}' to your system ..."
618 634
619 # options to pass to useradd 635 # options to pass to useradd
620 local opts="" 636 local opts=
621 637
622 # handle gid 638 # handle gid
623 local egid="$1"; shift 639 local egid="$1"; shift
624 if [ ! -z "${egid}" ] ; then 640 if [ ! -z "${egid}" ]
641 then
625 if [ ${egid} -gt 0 ] ; then 642 if [ "${egid}" -gt 0 ]
643 then
626 opts="${opts} -g ${egid}" 644 opts="${opts} -g ${egid}"
627 else 645 else
628 eerror "Groupid given but is not greater than 0 !" 646 eerror "Groupid given but is not greater than 0 !"
629 die "${egid} is not a valid GID" 647 die "${egid} is not a valid GID"
630 fi 648 fi
636 # handle extra 654 # handle extra
637 local eextra="$@" 655 local eextra="$@"
638 opts="${opts} ${eextra}" 656 opts="${opts} ${eextra}"
639 657
640 # add the group 658 # add the group
641 local oldsandbox=${SANDBOX_ON} 659 local oldsandbox="${SANDBOX_ON}"
642 export SANDBOX_ON="0" 660 export SANDBOX_ON="0"
643 groupadd ${opts} ${egroup} || die "enewgroup failed" 661 groupadd ${opts} ${egroup} || die "enewgroup failed"
644 export SANDBOX_ON="${oldsandbox}" 662 export SANDBOX_ON="${oldsandbox}"
645} 663}
646 664
647# Simple script to replace 'dos2unix' binaries 665# Simple script to replace 'dos2unix' binaries
648# vapier@gentoo.org 666# vapier@gentoo.org
649# 667#
650# edos2unix(file, <more files>...) 668# edos2unix(file, <more files>...)
651edos2unix() { 669edos2unix() {
652 for f in $@ ; do 670 for f in "$@"
671 do
653 cp ${f} ${T}/edos2unix 672 cp "${f}" ${T}/edos2unix
654 sed 's/\r$//' ${T}/edos2unix > ${f} 673 sed 's/\r$//' ${T}/edos2unix > "${f}"
655 done 674 done
656} 675}
657 676
658# Make a desktop file ! 677# Make a desktop file !
659# Great for making those icons in kde/gnome startmenu ! 678# Great for making those icons in kde/gnome startmenu !
673# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html 692# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
674# path: if your app needs to startup in a specific dir 693# path: if your app needs to startup in a specific dir
675make_desktop_entry() { 694make_desktop_entry() {
676 [ -z "$1" ] && eerror "You must specify the executable" && return 1 695 [ -z "$1" ] && eerror "You must specify the executable" && return 1
677 696
678 local exec=${1} 697 local exec="${1}"
679 local name=${2:-${PN}} 698 local name="${2:-${PN}}"
680 local icon=${3:-${PN}.png} 699 local icon="${3:-${PN}.png}"
681 local type=${4} 700 local type="${4}"
682 local path=${5:-${GAMES_PREFIX}} 701 local path="${5:-${GAMES_PREFIX}}"
683 if [ -z "${type}" ] ; then 702 if [ -z "${type}" ]
703 then
684 case ${CATEGORY} in 704 case ${CATEGORY} in
685 app-emulation) type=Emulator ;; 705 "app-emulation")
686 games-*) type=Game ;; 706 type=Emulator
687 *) type="" ;; 707 ;;
708 "games-"*)
709 type=Game
710 ;;
711 "net-"*)
712 type=Network;
713 ;;
714 *)
715 type=
716 ;;
688 esac 717 esac
689 fi 718 fi
690 local desktop=${T}/${exec}.desktop 719 local desktop="${T}/${exec}.desktop"
691 720
692echo "[Desktop Entry] 721echo "[Desktop Entry]
693Encoding=UTF-8 722Encoding=UTF-8
694Version=0.9.2 723Version=0.9.2
695Name=${name} 724Name=${name}
698Exec=${exec} 727Exec=${exec}
699Path=${path} 728Path=${path}
700Icon=${icon} 729Icon=${icon}
701Categories=Application;${type};" > ${desktop} 730Categories=Application;${type};" > ${desktop}
702 731
703 if [ -d /usr/share/applications ] ; then 732 if [ -d "/usr/share/applications" ]
733 then
704 insinto /usr/share/applications 734 insinto /usr/share/applications
705 doins ${desktop} 735 doins ${desktop}
706 fi 736 fi
707 737
708 #if [ -d /usr/share/gnome/apps ] ; then 738 #if [ -d "/usr/share/gnome/apps" ]
739 #then
709 # insinto /usr/share/gnome/apps/Games 740 # insinto /usr/share/gnome/apps/Games
710 # doins ${desktop} 741 # doins ${desktop}
711 #fi 742 #fi
712 743
713 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ] ; then 744 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
745 #then
714 # for ver in /usr/kde/* ; do 746 # for ver in /usr/kde/*
747 # do
715 # insinto ${ver}/share/applnk/Games 748 # insinto ${ver}/share/applnk/Games
716 # doins ${desktop} 749 # doins ${desktop}
717 # done 750 # done
718 #fi 751 #fi
719 752
720 if [ -d /usr/share/applnk ] ; then 753 if [ -d "/usr/share/applnk" ]
754 then
721 insinto /usr/share/applnk/${type} 755 insinto /usr/share/applnk/${type}
722 doins ${desktop} 756 doins ${desktop}
723 fi 757 fi
724 758
725 return 0 759 return 0
749# writing the ebuild, it'll always work for the users, and if it doesn't, 783# writing the ebuild, it'll always work for the users, and if it doesn't,
750# then we'll fix it :-) 784# then we'll fix it :-)
751# - no support as yet for patches applying outside $S (and not directly in $WORKDIR). 785# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
752xpatch() { 786xpatch() {
753 787
754 debug-print-function $FUNCNAME $* 788 debug-print-function ${FUNCNAME} $*
755 789
756 local list="" 790 local list=
757 local list2="" 791 local list2=
758 declare -i plevel 792 declare -i plevel
759 793
760 # parse patch sources 794 # parse patch sources
761 for x in $*; do 795 for x in $*
796 do
762 debug-print "$FUNCNAME: parsing parameter $x" 797 debug-print "${FUNCNAME}: parsing parameter ${x}"
763 if [ -f "$x" ]; then 798 if [ -f "${x}" ]
799 then
764 list="$list $x" 800 list="${list} ${x}"
765 elif [ -d "$x" ]; then 801 elif [ -d "${x}" ]
802 then
766 # handles patchdirs like epatch() for now: no recursion. 803 # handles patchdirs like epatch() for now: no recursion.
767 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order. 804 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
768 # only patches with _$ARCH_ or _all_ in their filenames are applied. 805 # only patches with _$ARCH_ or _all_ in their filenames are applied.
769 for file in `ls -A $x`; do 806 for file in `ls -A ${x}`
807 do
770 debug-print "$FUNCNAME: parsing in subdir: file $file" 808 debug-print "${FUNCNAME}: parsing in subdir: file ${file}"
771 if [ -f "$x/$file" ] && [ "${file}" != "${file/_all_}" -o "${file}" != "${file/_$ARCH_}" ]; then 809 if [ -f "${x}/${file}" -a "${file}" != "${file/_all_}" -o \
810 "${file}" != "${file/_$ARCH_}" ]
811 then
772 list2="$list2 $x/$file" 812 list2="${list2} ${x}/${file}"
773 fi 813 fi
774 done 814 done
775 list="`echo $list2 | sort` $list" 815 list="`echo ${list2} | sort` ${list}"
776 else 816 else
777 die "Couldn't find $x" 817 die "Couldn't find ${x}"
778 fi 818 fi
779 done 819 done
780 820
781 debug-print "$FUNCNAME: final list of patches: $list" 821 debug-print "${FUNCNAME}: final list of patches: ${list}"
782 822
783 for x in $list; do 823 for x in ${list};
824 do
784 debug-print "$FUNCNAME: processing $x" 825 debug-print "${FUNCNAME}: processing ${x}"
785 # deal with compressed files. /usr/bin/file is in the system profile, or should be. 826 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
786 case "`/usr/bin/file -b $x`" in 827 case "`/usr/bin/file -b ${x}`" in
787 *gzip*) patchfile="${T}/current.patch"; ungzip -c "$x" > "${patchfile}";; 828 *gzip*)
788 *bzip2*) patchfile="${T}/current.patch"; bunzip2 -c "$x" > "${patchfile}";; 829 patchfile="${T}/current.patch"
789 *text*) patchfile="$x";; 830 ungzip -c "${x}" > "${patchfile}"
831 ;;
832 *bzip2*)
833 patchfile="${T}/current.patch"
834 bunzip2 -c "${x}" > "${patchfile}"
835 ;;
836 *text*)
837 patchfile="${x}"
838 ;;
839 *)
790 *) die "Could not determine filetype of patch $x";; 840 die "Could not determine filetype of patch ${x}"
841 ;;
791 esac 842 esac
792 debug-print "$FUNCNAME: patchfile=$patchfile" 843 debug-print "${FUNCNAME}: patchfile=${patchfile}"
793 844
794 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base. 845 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
795 target="`/bin/grep -m 1 '^+++ ' $patchfile`" 846 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
796 debug-print "$FUNCNAME: raw target=$target" 847 debug-print "${FUNCNAME}: raw target=${target}"
797 # strip target down to the path/filename, remove leading +++ 848 # strip target down to the path/filename, remove leading +++
798 target="${target/+++ }"; target="${target%% *}" 849 target="${target/+++ }"; target="${target%% *}"
799 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need 850 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
800 # to discard them as well to calculate the correct patchlevel. 851 # to discard them as well to calculate the correct patchlevel.
801 target="${target//\/\//\/}" 852 target="${target//\/\//\/}"
802 debug-print "$FUNCNAME: stripped target=$target" 853 debug-print "${FUNCNAME}: stripped target=${target}"
803 854
804 # look for target 855 # look for target
805 for basedir in "$S" "$WORKDIR" "${PWD}"; do 856 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
806 debug-print "$FUNCNAME: looking in basedir=$basedir" 857 debug-print "${FUNCNAME}: looking in basedir=${basedir}"
807 cd "$basedir" 858 cd "${basedir}"
808 859
809 # try stripping leading directories 860 # try stripping leading directories
810 target2="$target" 861 target2="${target}"
811 plevel=0 862 plevel=0
812 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel" 863 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
813 while [ ! -f "$target2" ]; do 864 while [ ! -f "${target2}" ]
865 do
814 target2="${target2#*/}" # removes piece of target2 upto the first occurence of / 866 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
815 plevel=plevel+1 867 plevel=$((plevel+1))
816 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel" 868 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
817 [ "$target2" == "${target2/\/}" ] && break 869 [ "${target2}" == "${target2/\/}" ] && break
818 done 870 done
819 test -f "$target2" && break 871 test -f "${target2}" && break
820 872
821 # try stripping filename - needed to support patches creating new files 873 # try stripping filename - needed to support patches creating new files
822 target2="${target%/*}" 874 target2="${target%/*}"
823 plevel=0 875 plevel=0
824 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel" 876 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
825 while [ ! -d "$target2" ]; do 877 while [ ! -d "${target2}" ]
878 do
826 target2="${target2#*/}" # removes piece of target2 upto the first occurence of / 879 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
827 plevel=plevel+1 880 plevel=$((plevel+1))
828 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel" 881 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
829 [ "$target2" == "${target2/\/}" ] && break 882 [ "${target2}" == "${target2/\/}" ] && break
830 done 883 done
831 test -d "$target2" && break 884 test -d "${target2}" && break
832 885
833 done 886 done
834 887
835 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" || die "Could not determine patchlevel for $x" 888 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
889 || die "Could not determine patchlevel for ${x}"
836 debug-print "$FUNCNAME: determined plevel=$plevel" 890 debug-print "${FUNCNAME}: determined plevel=${plevel}"
837 # do the patching 891 # do the patching
838 ebegin "Applying patch ${x##*/}..." 892 ebegin "Applying patch ${x##*/}..."
839 /usr/bin/patch -p$plevel < "$patchfile" > /dev/null || die "Failed to apply patch $x" 893 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
894 || die "Failed to apply patch ${x}"
840 eend $? 895 eend $?
841 896
842 done 897 done
843 898
899}
900
901# for internal use only (unpack_pdv and unpack_makeself)
902find_unpackable_file() {
903 local src="$1"
904 if [ -z "${src}" ]
905 then
906 src="${DISTDIR}/${A}"
907 else
908 if [ -e "${DISTDIR}/${src}" ]
909 then
910 src="${DISTDIR}/${src}"
911 elif [ -e "${PWD}/${src}" ]
912 then
913 src="${PWD}/${src}"
914 elif [ -e "${src}" ]
915 then
916 src="${src}"
917 fi
918 fi
919 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
920 echo "${src}"
921}
922
923# Unpack those pesky pdv generated files ...
924# They're self-unpacking programs with the binary package stuffed in
925# the middle of the archive. Valve seems to use it a lot ... too bad
926# it seems to like to segfault a lot :(. So lets take it apart ourselves.
927#
928# Usage: unpack_pdv [file to unpack] [size of off_t]
929# - you have to specify the off_t size ... i have no idea how to extract that
930# information out of the binary executable myself. basically you pass in
931# the size of the off_t type (in bytes) on the machine that built the pdv
932# archive. one way to determine this is by running the following commands:
933# strings <pdv archive> | grep lseek
934# strace -elseek <pdv archive>
935# basically look for the first lseek command (we do the strings/grep because
936# sometimes the function call is _llseek or something) and steal the 2nd
937# parameter. here is an example:
938# root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
939# lseek
940# root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
941# lseek(3, -4, SEEK_END) = 2981250
942# thus we would pass in the value of '4' as the second parameter.
943unpack_pdv() {
944 local src="`find_unpackable_file $1`"
945 local sizeoff_t="$2"
946
947 [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
948
949 local shrtsrc="`basename ${src}`"
950 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
951 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
952 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
953
954 # grab metadata for debug reasons
955 local metafile="`mymktemp ${T}`"
956 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
957
958 # rip out the final file name from the metadata
959 local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
960 datafile="`basename ${datafile}`"
961
962 # now lets uncompress/untar the file if need be
963 local tmpfile="`mymktemp ${T}`"
964 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
965
966 local iscompressed="`file -b ${tmpfile}`"
967 if [ "${iscompressed:0:8}" == "compress" ] ; then
968 iscompressed=1
969 mv ${tmpfile}{,.Z}
970 gunzip ${tmpfile}
971 else
972 iscompressed=0
973 fi
974 local istar="`file -b ${tmpfile}`"
975 if [ "${istar:0:9}" == "POSIX tar" ] ; then
976 istar=1
977 else
978 istar=0
979 fi
980
981 #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
982 #dd if=${src} ibs=${metaskip} count=1 \
983 # | dd ibs=${tailskip} skip=1 \
984 # | gzip -dc \
985 # > ${datafile}
986 if [ ${iscompressed} -eq 1 ] ; then
987 if [ ${istar} -eq 1 ] ; then
988 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
989 | head -c $((${metaskip}-${tailskip})) \
990 | tar -xzf -
991 else
992 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
993 | head -c $((${metaskip}-${tailskip})) \
994 | gzip -dc \
995 > ${datafile}
996 fi
997 else
998 if [ ${istar} -eq 1 ] ; then
999 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1000 | head -c $((${metaskip}-${tailskip})) \
1001 | tar --no-same-owner -xf -
1002 else
1003 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1004 | head -c $((${metaskip}-${tailskip})) \
1005 > ${datafile}
1006 fi
1007 fi
1008 true
1009 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1010 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
844} 1011}
845 1012
846# Unpack those pesky makeself generated files ... 1013# Unpack those pesky makeself generated files ...
847# They're shell scripts with the binary package tagged onto 1014# They're shell scripts with the binary package tagged onto
848# the end of the archive. Loki utilized the format as does 1015# the end of the archive. Loki utilized the format as does
851# Usage: unpack_makeself [file to unpack] [offset] 1018# Usage: unpack_makeself [file to unpack] [offset]
852# - If the file is not specified then unpack will utilize ${A}. 1019# - If the file is not specified then unpack will utilize ${A}.
853# - If the offset is not specified then we will attempt to extract 1020# - If the offset is not specified then we will attempt to extract
854# the proper offset from the script itself. 1021# the proper offset from the script itself.
855unpack_makeself() { 1022unpack_makeself() {
856 local src=$1 1023 local src="`find_unpackable_file $1`"
857 local skip=$2 1024 local skip="$2"
858 1025
859 if [ -z "${src}" ] ; then
860 src="${DISTDIR}/${A}"
861 else
862 if [ -e "${DISTDIR}/${src}" ] ; then
863 src="${DISTDIR}/${src}"
864 elif [ -e "${PWD}/${src}" ] ; then
865 src="${PWD}/${src}"
866 elif [ -e "${src}" ] ; then
867 src="${src}"
868 fi
869 fi
870 [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}"
871
872 local shrtsrc=`basename ${src}` 1026 local shrtsrc="`basename ${src}`"
873 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1027 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
874 if [ -z "${skip}" ] ; then 1028 if [ -z "${skip}" ]
1029 then
875 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`" 1030 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
876 local skip=0 1031 local skip=0
877 case ${ver} in 1032 case ${ver} in
878 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1033 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
879 skip=`grep -a ^skip= ${src} | cut -d= -f2` 1034 skip=`grep -a ^skip= ${src} | cut -d= -f2`
902 ;; 1057 ;;
903 esac 1058 esac
904 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" 1059 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
905 fi 1060 fi
906 1061
907 # we do this because otherwise a failure in gzip will cause 0 bytes to be sent 1062 # lets grab the first few bytes of the file to figure out what kind of archive it is
908 # to tar which will make tar not extract anything and exit with 0 1063 local tmpfile="`mymktemp ${T}`"
909 tail -n +${skip} ${src} | gzip -cd | tar -x --no-same-owner -f - 2>/dev/null 1064 tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
910 local pipestatus="${PIPESTATUS[*]}" 1065 local filetype="`file -b ${tmpfile}`"
911 pipestatus="${pipestatus// }" 1066 case ${filetype} in
912 if [ "${pipestatus//0}" != "" ] ; then 1067 *tar\ archive)
913 # maybe it isnt gzipped ... they usually are, but not always ...
914 tail -n +${skip} ${src} | tar -x --no-same-owner -f - \ 1068 tail -n +${skip} ${src} | tar --no-same-owner -xf -
1069 ;;
1070 bzip2*)
1071 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
1072 ;;
1073 gzip*)
1074 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
1075 ;;
1076 *)
1077 false
1078 ;;
1079 esac
915 || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})" 1080 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1081}
1082
1083# Display a license for user to accept.
1084#
1085# Usage: check_license [license]
1086# - If the file is not specified then ${LICENSE} is used.
1087check_license() {
1088 local lic=$1
1089 if [ -z "${lic}" ] ; then
1090 lic="${PORTDIR}/licenses/${LICENSE}"
1091 else
1092 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1093 lic="${PORTDIR}/licenses/${src}"
1094 elif [ -e "${PWD}/${src}" ] ; then
1095 lic="${PWD}/${src}"
1096 elif [ -e "${src}" ] ; then
1097 lic="${src}"
916 fi 1098 fi
1099 fi
1100 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1101 local l="`basename ${lic}`"
1102
1103 # here is where we check for the licenses the user already
1104 # accepted ... if we don't find a match, we make the user accept
1105 local alic
1106 for alic in ${ACCEPT_LICENSE} ; do
1107 [ "${alic}" == "*" ] && return 0
1108 [ "${alic}" == "${l}" ] && return 0
1109 done
1110
1111 local licmsg="`mymktemp ${T}`"
1112 cat << EOF > ${licmsg}
1113**********************************************************
1114The following license outlines the terms of use of this
1115package. You MUST accept this license for installation to
1116continue. When you are done viewing, hit 'q'. If you
1117CTRL+C out of this, the install will not run!
1118**********************************************************
1119
1120EOF
1121 cat ${lic} >> ${licmsg}
1122 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1123 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1124 read alic
1125 case ${alic} in
1126 yes|Yes|y|Y)
1127 return 0
1128 ;;
1129 *)
1130 echo;echo;echo
1131 eerror "You MUST accept the license to continue! Exiting!"
1132 die "Failed to accept license"
1133 ;;
1134 esac
917} 1135}

Legend:
Removed from v.1.55  
changed lines
  Added in v.1.73

  ViewVC Help
Powered by ViewVC 1.1.20