| 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.63 2003/10/13 15:00:19 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.71 2003/11/30 11:42:09 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. |
| … | |
… | |
| 529 | fi |
529 | fi |
| 530 | einfo " - Userid: ${euid}" |
530 | einfo " - Userid: ${euid}" |
| 531 | |
531 | |
| 532 | # handle shell |
532 | # handle shell |
| 533 | local eshell="$1"; shift |
533 | local eshell="$1"; shift |
| 534 | if [ ! -z "${eshell}" ] |
534 | if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ] |
| 535 | then |
535 | then |
| 536 | if [ ! -e "${eshell}" ] |
536 | if [ ! -e "${eshell}" ] |
| 537 | then |
537 | then |
| 538 | eerror "A shell was specified but it does not exist !" |
538 | eerror "A shell was specified but it does not exist !" |
| 539 | die "${eshell} does not exist" |
539 | die "${eshell} does not exist" |
| … | |
… | |
| 544 | einfo " - Shell: ${eshell}" |
544 | einfo " - Shell: ${eshell}" |
| 545 | opts="${opts} -s ${eshell}" |
545 | opts="${opts} -s ${eshell}" |
| 546 | |
546 | |
| 547 | # handle homedir |
547 | # handle homedir |
| 548 | local ehome="$1"; shift |
548 | local ehome="$1"; shift |
| 549 | if [ -z "${ehome}" ] |
549 | if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ] |
| 550 | then |
550 | then |
| 551 | ehome="/dev/null" |
551 | ehome="/dev/null" |
| 552 | fi |
552 | fi |
| 553 | einfo " - Home: ${ehome}" |
553 | einfo " - Home: ${ehome}" |
| 554 | opts="${opts} -d ${ehome}" |
554 | opts="${opts} -d ${ehome}" |
| … | |
… | |
| 706 | type=Emulator |
706 | type=Emulator |
| 707 | ;; |
707 | ;; |
| 708 | "games-"*) |
708 | "games-"*) |
| 709 | type=Game |
709 | type=Game |
| 710 | ;; |
710 | ;; |
|
|
711 | "net-"*) |
|
|
712 | type=Network; |
|
|
713 | ;; |
| 711 | *) |
714 | *) |
| 712 | type= |
715 | type= |
| 713 | ;; |
716 | ;; |
| 714 | esac |
717 | esac |
| 715 | fi |
718 | fi |
| … | |
… | |
| 893 | |
896 | |
| 894 | done |
897 | done |
| 895 | |
898 | |
| 896 | } |
899 | } |
| 897 | |
900 | |
|
|
901 | # for internal use only (unpack_pdv and unpack_makeself) |
|
|
902 | find_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. |
|
|
943 | unpack_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 -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}')" |
|
|
1011 | } |
|
|
1012 | |
| 898 | # Unpack those pesky makeself generated files ... |
1013 | # Unpack those pesky makeself generated files ... |
| 899 | # They're shell scripts with the binary package tagged onto |
1014 | # They're shell scripts with the binary package tagged onto |
| 900 | # the end of the archive. Loki utilized the format as does |
1015 | # the end of the archive. Loki utilized the format as does |
| 901 | # many other game companies. |
1016 | # many other game companies. |
| 902 | # |
1017 | # |
| 903 | # Usage: unpack_makeself [file to unpack] [offset] |
1018 | # Usage: unpack_makeself [file to unpack] [offset] |
| 904 | # - If the file is not specified then unpack will utilize ${A}. |
1019 | # - If the file is not specified then unpack will utilize ${A}. |
| 905 | # - 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 |
| 906 | # the proper offset from the script itself. |
1021 | # the proper offset from the script itself. |
| 907 | unpack_makeself() { |
1022 | unpack_makeself() { |
| 908 | local src="$1" |
1023 | local src="`find_unpackable_file $1`" |
| 909 | local skip="$2" |
1024 | local skip="$2" |
| 910 | |
|
|
| 911 | if [ -z "${src}" ] |
|
|
| 912 | then |
|
|
| 913 | src="${DISTDIR}/${A}" |
|
|
| 914 | else |
|
|
| 915 | if [ -e "${DISTDIR}/${src}" ] |
|
|
| 916 | then |
|
|
| 917 | src="${DISTDIR}/${src}" |
|
|
| 918 | elif [ -e "${PWD}/${src}" ] |
|
|
| 919 | then |
|
|
| 920 | src="${PWD}/${src}" |
|
|
| 921 | elif [ -e "${src}" ] |
|
|
| 922 | then |
|
|
| 923 | src="${src}" |
|
|
| 924 | fi |
|
|
| 925 | fi |
|
|
| 926 | [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}" |
|
|
| 927 | |
1025 | |
| 928 | local shrtsrc="`basename ${src}`" |
1026 | local shrtsrc="`basename ${src}`" |
| 929 | echo ">>> Unpacking ${shrtsrc} to ${PWD}" |
1027 | echo ">>> Unpacking ${shrtsrc} to ${PWD}" |
| 930 | if [ -z "${skip}" ] |
1028 | if [ -z "${skip}" ] |
| 931 | then |
1029 | then |
| … | |
… | |
| 959 | ;; |
1057 | ;; |
| 960 | esac |
1058 | esac |
| 961 | debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" |
1059 | debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" |
| 962 | fi |
1060 | fi |
| 963 | |
1061 | |
| 964 | # 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 |
| 965 | # to tar which will make tar not extract anything and exit with 0 |
1063 | local tmpfile="`mymktemp ${T}`" |
| 966 | tail -n +${skip} ${src} 2>/dev/null \ |
1064 | tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile} |
| 967 | | gzip -cd 2>/dev/null \ |
1065 | local filetype="`file -b ${tmpfile}`" |
| 968 | | tar -x --no-same-owner -f - 2>/dev/null |
1066 | case ${filetype} in |
| 969 | local pipestatus="${PIPESTATUS[*]}" |
1067 | *tar\ archive) |
| 970 | pipestatus="${pipestatus// }" |
|
|
| 971 | if [ "${pipestatus//0}" != "" ] |
|
|
| 972 | then |
|
|
| 973 | # maybe it isnt gzipped ... they usually are, but not always ... |
|
|
| 974 | tail -n +${skip} ${src} | tar -x --no-same-owner -f - \ |
1068 | tail -n +${skip} ${src} | tar -xf - |
|
|
1069 | ;; |
|
|
1070 | bzip2*) |
|
|
1071 | tail -n +${skip} ${src} | bzip2 -dc | tar -xf - |
|
|
1072 | ;; |
|
|
1073 | gzip*) |
|
|
1074 | tail -n +${skip} ${src} | tar -xzf - |
|
|
1075 | ;; |
|
|
1076 | *) |
|
|
1077 | false |
|
|
1078 | ;; |
|
|
1079 | esac |
| 975 | || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})" |
1080 | assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" |
| 976 | fi |
|
|
| 977 | } |
1081 | } |
| 978 | |
1082 | |
| 979 | # Display a license for user to accept. |
1083 | # Display a license for user to accept. |
| 980 | # |
1084 | # |
| 981 | # Usage: check_license [license] |
1085 | # Usage: check_license [license] |
| … | |
… | |
| 992 | elif [ -e "${src}" ] ; then |
1096 | elif [ -e "${src}" ] ; then |
| 993 | lic="${src}" |
1097 | lic="${src}" |
| 994 | fi |
1098 | fi |
| 995 | fi |
1099 | fi |
| 996 | [ ! -f "${lic}" ] && die "Could not find requested license ${src}" |
1100 | [ ! -f "${lic}" ] && die "Could not find requested license ${src}" |
|
|
1101 | local l="`basename ${lic}`" |
| 997 | |
1102 | |
| 998 | # here is where we check for the licenses the user already |
1103 | # here is where we check for the licenses the user already |
| 999 | # accepted ... if we don't find a match, we make the user accept |
1104 | # accepted ... if we don't find a match, we make the user accept |
| 1000 | local alic |
1105 | local alic |
| 1001 | for alic in "${ACCEPT_LICENSE}" ; do |
1106 | for alic in ${ACCEPT_LICENSE} ; do |
| 1002 | [ "${alic}" == "*" ] && return 0 |
1107 | [ "${alic}" == "*" ] && return 0 |
| 1003 | [ "${alic}" == "${lic}" ] && return 0 |
1108 | [ "${alic}" == "${l}" ] && return 0 |
| 1004 | done |
1109 | done |
| 1005 | |
1110 | |
| 1006 | local licmsg="`mymktemp ${T}`" |
1111 | local licmsg="`mymktemp ${T}`" |
| 1007 | cat << EOF > ${licmsg} |
1112 | cat << EOF > ${licmsg} |
| 1008 | ********************************************************** |
1113 | ********************************************************** |
| … | |
… | |
| 1013 | ********************************************************** |
1118 | ********************************************************** |
| 1014 | |
1119 | |
| 1015 | EOF |
1120 | EOF |
| 1016 | cat ${lic} >> ${licmsg} |
1121 | cat ${lic} >> ${licmsg} |
| 1017 | ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}" |
1122 | ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}" |
| 1018 | einfon "Do you accept the terms of this license? [yes/no] " |
1123 | einfon "Do you accept the terms of this license (${l})? [yes/no] " |
| 1019 | read alic |
1124 | read alic |
| 1020 | case ${alic} in |
1125 | case ${alic} in |
| 1021 | yes|Yes|y|Y) |
1126 | yes|Yes|y|Y) |
| 1022 | return 0 |
1127 | return 0 |
| 1023 | ;; |
1128 | ;; |