| 1 | # Copyright 1999-2006 Gentoo Foundation |
1 | # Copyright 1999-2006 Gentoo Foundation |
| 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.248 2006/08/19 13:52:02 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.261 2006/11/11 15:13:46 kanaka Exp $ |
| 4 | # |
4 | # |
| 5 | # This eclass is for general purpose functions that most ebuilds |
5 | # This eclass is for general purpose functions that most ebuilds |
| 6 | # have to implement themselves. |
6 | # have to implement themselves. |
| 7 | # |
7 | # |
| 8 | # NB: If you add anything, please comment it! |
8 | # NB: If you add anything, please comment it! |
| … | |
… | |
| 454 | eerror "No username specified !" |
454 | eerror "No username specified !" |
| 455 | die "Cannot call enewuser without a username" |
455 | die "Cannot call enewuser without a username" |
| 456 | fi |
456 | fi |
| 457 | |
457 | |
| 458 | # lets see if the username already exists |
458 | # lets see if the username already exists |
| 459 | if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then |
459 | if [[ -n $(egetent passwd "${euser}") ]] ; then |
| 460 | return 0 |
460 | return 0 |
| 461 | fi |
461 | fi |
| 462 | einfo "Adding user '${euser}' to your system ..." |
462 | einfo "Adding user '${euser}' to your system ..." |
| 463 | |
463 | |
| 464 | # options to pass to useradd |
464 | # options to pass to useradd |
| 465 | local opts= |
465 | local opts= |
| 466 | |
466 | |
| 467 | # handle uid |
467 | # handle uid |
| 468 | local euid=$1; shift |
468 | local euid=$1; shift |
| 469 | if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then |
469 | if [[ -n ${euid} && ${euid} != -1 ]] ; then |
| 470 | if [[ ${euid} -gt 0 ]] ; then |
470 | if [[ ${euid} -gt 0 ]] ; then |
| 471 | if [[ ! -z $(egetent passwd ${euid}) ]] ; then |
471 | if [[ -n $(egetent passwd ${euid}) ]] ; then |
| 472 | euid="next" |
472 | euid="next" |
| 473 | fi |
473 | fi |
| 474 | else |
474 | else |
| 475 | eerror "Userid given but is not greater than 0 !" |
475 | eerror "Userid given but is not greater than 0 !" |
| 476 | die "${euid} is not a valid UID" |
476 | die "${euid} is not a valid UID" |
| 477 | fi |
477 | fi |
| 478 | else |
478 | else |
| 479 | euid="next" |
479 | euid="next" |
| 480 | fi |
480 | fi |
| 481 | if [[ ${euid} == "next" ]] ; then |
481 | if [[ ${euid} == "next" ]] ; then |
| 482 | for euid in $(seq 101 999) ; do |
482 | for ((euid = 101; euid <= 999; euid++)); do |
| 483 | [[ -z $(egetent passwd ${euid}) ]] && break |
483 | [[ -z $(egetent passwd ${euid}) ]] && break |
| 484 | done |
484 | done |
| 485 | fi |
485 | fi |
| 486 | opts="${opts} -u ${euid}" |
486 | opts="${opts} -u ${euid}" |
| 487 | einfo " - Userid: ${euid}" |
487 | einfo " - Userid: ${euid}" |
| … | |
… | |
| 501 | for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do |
501 | for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do |
| 502 | [[ -x ${ROOT}${shell} ]] && break |
502 | [[ -x ${ROOT}${shell} ]] && break |
| 503 | done |
503 | done |
| 504 | |
504 | |
| 505 | if [[ ${shell} == "/dev/null" ]] ; then |
505 | if [[ ${shell} == "/dev/null" ]] ; then |
| 506 | eerror "Unable to identify the shell to use" |
506 | eerror "Unable to identify the shell to use, proceeding with userland default." |
| 507 | die "Unable to identify the shell to use" |
507 | case ${USERLAND} in |
|
|
508 | GNU) shell="/bin/false" ;; |
|
|
509 | BSD) shell="/sbin/nologin" ;; |
|
|
510 | Darwin) shell="/usr/sbin/nologin" ;; |
|
|
511 | *) die "Unable to identify the default shell for userland ${USERLAND}" |
|
|
512 | esac |
| 508 | fi |
513 | fi |
| 509 | |
514 | |
| 510 | eshell=${shell} |
515 | eshell=${shell} |
| 511 | fi |
516 | fi |
| 512 | einfo " - Shell: ${eshell}" |
517 | einfo " - Shell: ${eshell}" |
| … | |
… | |
| 657 | eerror "No group specified !" |
662 | eerror "No group specified !" |
| 658 | die "Cannot call enewgroup without a group" |
663 | die "Cannot call enewgroup without a group" |
| 659 | fi |
664 | fi |
| 660 | |
665 | |
| 661 | # see if group already exists |
666 | # see if group already exists |
| 662 | if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ] |
667 | if [[ -n $(egetent group "${egroup}") ]]; then |
| 663 | then |
|
|
| 664 | return 0 |
668 | return 0 |
| 665 | fi |
669 | fi |
| 666 | einfo "Adding group '${egroup}' to your system ..." |
670 | einfo "Adding group '${egroup}' to your system ..." |
| 667 | |
671 | |
| 668 | # options to pass to useradd |
672 | # options to pass to useradd |
| … | |
… | |
| 711 | fi |
715 | fi |
| 712 | |
716 | |
| 713 | # If we need the next available |
717 | # If we need the next available |
| 714 | case ${egid} in |
718 | case ${egid} in |
| 715 | *[!0-9]*) # Non numeric |
719 | *[!0-9]*) # Non numeric |
| 716 | for egid in $(seq 101 999); do |
720 | for ((egid = 101; egid <= 999; egid++)); do |
| 717 | [ -z "`egetent group ${egid}`" ] && break |
721 | [[ -z $(egetent group ${egid}) ]] && break |
| 718 | done |
722 | done |
| 719 | esac |
723 | esac |
| 720 | dscl . create /groups/${egroup} gid ${egid} |
724 | dscl . create /groups/${egroup} gid ${egid} |
| 721 | dscl . create /groups/${egroup} passwd '*' |
725 | dscl . create /groups/${egroup} passwd '*' |
| 722 | ;; |
726 | ;; |
| 723 | |
727 | |
| 724 | *-freebsd*|*-dragonfly*) |
728 | *-freebsd*|*-dragonfly*) |
| 725 | case ${egid} in |
729 | case ${egid} in |
| 726 | *[!0-9]*) # Non numeric |
730 | *[!0-9]*) # Non numeric |
| 727 | for egid in $(seq 101 999); do |
731 | for ((egid = 101; egid <= 999; egid++)); do |
| 728 | [ -z "`egetent group ${egid}`" ] && break |
732 | [[ -z $(egetent group ${egid}) ]] && break |
| 729 | done |
733 | done |
| 730 | esac |
734 | esac |
| 731 | pw groupadd ${egroup} -g ${egid} || die "enewgroup failed" |
735 | pw groupadd ${egroup} -g ${egid} || die "enewgroup failed" |
| 732 | ;; |
736 | ;; |
| 733 | |
737 | |
| 734 | *-netbsd*) |
738 | *-netbsd*) |
| 735 | case ${egid} in |
739 | case ${egid} in |
| 736 | *[!0-9]*) # Non numeric |
740 | *[!0-9]*) # Non numeric |
| 737 | for egid in $(seq 101 999); do |
741 | for ((egid = 101; egid <= 999; egid++)); do |
| 738 | [ -z "`egetent group ${egid}`" ] && break |
742 | [[ -z $(egetent group ${egid}) ]] && break |
| 739 | done |
743 | done |
| 740 | esac |
744 | esac |
| 741 | groupadd -g ${egid} ${egroup} || die "enewgroup failed" |
745 | groupadd -g ${egid} ${egroup} || die "enewgroup failed" |
| 742 | ;; |
746 | ;; |
| 743 | |
747 | |
| … | |
… | |
| 817 | games) |
821 | games) |
| 818 | case ${catmin} in |
822 | case ${catmin} in |
| 819 | action) type=ActionGame;; |
823 | action) type=ActionGame;; |
| 820 | arcade) type=ArcadeGame;; |
824 | arcade) type=ArcadeGame;; |
| 821 | board) type=BoardGame;; |
825 | board) type=BoardGame;; |
| 822 | kid) type=KidsGame;; |
826 | kids) type=KidsGame;; |
| 823 | emulation) type=Emulator;; |
827 | emulation) type=Emulator;; |
| 824 | puzzle) type=LogicGame;; |
828 | puzzle) type=LogicGame;; |
| 825 | rpg) type=RolePlaying;; |
829 | rpg) type=RolePlaying;; |
| 826 | roguelike) type=RolePlaying;; |
830 | roguelike) type=RolePlaying;; |
| 827 | simulation) type=Simulation;; |
831 | simulation) type=Simulation;; |
| … | |
… | |
| 917 | ) |
921 | ) |
| 918 | } |
922 | } |
| 919 | |
923 | |
| 920 | # Make a GDM/KDM Session file |
924 | # Make a GDM/KDM Session file |
| 921 | # |
925 | # |
| 922 | # make_desktop_entry(<title>, <command>) |
926 | # make_session_desktop(<title>, <command>) |
| 923 | # title: File to execute to start the Window Manager |
927 | # title: File to execute to start the Window Manager |
| 924 | # command: Name of the Window Manager |
928 | # command: Name of the Window Manager |
| 925 | |
929 | |
| 926 | make_session_desktop() { |
930 | make_session_desktop() { |
| 927 | [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1 |
931 | [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1 |
| … | |
… | |
| 1159 | # lets grab the first few bytes of the file to figure out what kind of archive it is |
1163 | # lets grab the first few bytes of the file to figure out what kind of archive it is |
| 1160 | local tmpfile="$(emktemp)" |
1164 | local tmpfile="$(emktemp)" |
| 1161 | eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}" |
1165 | eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}" |
| 1162 | local filetype="$(file -b "${tmpfile}")" |
1166 | local filetype="$(file -b "${tmpfile}")" |
| 1163 | case ${filetype} in |
1167 | case ${filetype} in |
| 1164 | *tar\ archive) |
1168 | *tar\ archive*) |
| 1165 | eval ${exe} | tar --no-same-owner -xf - |
1169 | eval ${exe} | tar --no-same-owner -xf - |
| 1166 | ;; |
1170 | ;; |
| 1167 | bzip2*) |
1171 | bzip2*) |
| 1168 | eval ${exe} | bzip2 -dc | tar --no-same-owner -xf - |
1172 | eval ${exe} | bzip2 -dc | tar --no-same-owner -xf - |
| 1169 | ;; |
1173 | ;; |
| … | |
… | |
| 1205 | # accepted ... if we don't find a match, we make the user accept |
1209 | # accepted ... if we don't find a match, we make the user accept |
| 1206 | local shopts=$- |
1210 | local shopts=$- |
| 1207 | local alic |
1211 | local alic |
| 1208 | set -o noglob #so that bash doesn't expand "*" |
1212 | set -o noglob #so that bash doesn't expand "*" |
| 1209 | for alic in ${ACCEPT_LICENSE} ; do |
1213 | for alic in ${ACCEPT_LICENSE} ; do |
| 1210 | if [[ ${alic} == * || ${alic} == ${l} ]]; then |
1214 | if [[ ${alic} == ${l} ]]; then |
| 1211 | set +o noglob; set -${shopts} #reset old shell opts |
1215 | set +o noglob; set -${shopts} #reset old shell opts |
| 1212 | return 0 |
1216 | return 0 |
| 1213 | fi |
1217 | fi |
| 1214 | done |
1218 | done |
| 1215 | set +o noglob; set -$shopts #reset old shell opts |
1219 | set +o noglob; set -$shopts #reset old shell opts |
| … | |
… | |
| 1398 | |
1402 | |
| 1399 | while [[ -n ${cdset[${i}]} ]] ; do |
1403 | while [[ -n ${cdset[${i}]} ]] ; do |
| 1400 | local dir=$(dirname ${cdset[${i}]}) |
1404 | local dir=$(dirname ${cdset[${i}]}) |
| 1401 | local file=$(basename ${cdset[${i}]}) |
1405 | local file=$(basename ${cdset[${i}]}) |
| 1402 | |
1406 | |
| 1403 | for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do |
1407 | local point= node= fs= foo= |
| 1404 | [[ -d ${mline}/${dir} ]] || continue |
1408 | while read point node fs foo ; do |
|
|
1409 | [[ *" ${fs} "* != " cd9660 iso9660 " ]] && continue |
|
|
1410 | point=${point//\040/ } |
| 1405 | if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then |
1411 | [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue |
| 1406 | export CDROM_ROOT=${mline} |
1412 | export CDROM_ROOT=${point} |
| 1407 | export CDROM_SET=${i} |
1413 | export CDROM_SET=${i} |
| 1408 | export CDROM_MATCH=${cdset[${i}]} |
1414 | export CDROM_MATCH=${cdset[${i}]} |
| 1409 | return |
1415 | return |
| 1410 | fi |
1416 | done < <(get_mounts) |
| 1411 | done |
|
|
| 1412 | |
1417 | |
| 1413 | ((++i)) |
1418 | ((++i)) |
| 1414 | done |
1419 | done |
| 1415 | |
1420 | |
| 1416 | echo |
1421 | echo |
| … | |
… | |
| 1593 | local PKG=$(best_version $1) |
1598 | local PKG=$(best_version $1) |
| 1594 | [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package" |
1599 | [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package" |
| 1595 | shift |
1600 | shift |
| 1596 | |
1601 | |
| 1597 | local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE |
1602 | local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE |
|
|
1603 | local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE |
| 1598 | |
1604 | |
| 1599 | # if the USE file doesnt exist, assume the $PKG is either |
1605 | # if the USE file doesnt exist, assume the $PKG is either |
| 1600 | # injected or package.provided |
1606 | # injected or package.provided |
| 1601 | [[ ! -e ${USEFILE} ]] && die "Unable to determine what USE flags $PKG was built with" |
1607 | [[ ! -e ${USEFILE} ]] && die "Unable to determine what USE flags $PKG was built with" |
|
|
1608 | |
|
|
1609 | local IUSE_BUILT=$(<${IUSEFILE}) |
|
|
1610 | # Don't check USE_EXPAND #147237 |
|
|
1611 | local expand |
|
|
1612 | for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do |
|
|
1613 | if [[ $1 == ${expand}_* ]] ; then |
|
|
1614 | expand="" |
|
|
1615 | break |
|
|
1616 | fi |
|
|
1617 | done |
|
|
1618 | if [[ -n ${expand} ]] ; then |
|
|
1619 | has $1 ${IUSE_BUILT} || die "$PKG does not actually support the $1 USE flag!" |
|
|
1620 | fi |
| 1602 | |
1621 | |
| 1603 | local USE_BUILT=$(<${USEFILE}) |
1622 | local USE_BUILT=$(<${USEFILE}) |
| 1604 | while [[ $# -gt 0 ]] ; do |
1623 | while [[ $# -gt 0 ]] ; do |
| 1605 | if [[ ${opt} = "-o" ]] ; then |
1624 | if [[ ${opt} = "-o" ]] ; then |
| 1606 | has $1 ${USE_BUILT} && return 0 |
1625 | has $1 ${USE_BUILT} && return 0 |