summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
Diffstat (limited to 'eclass')
-rw-r--r--eclass/cdrom.eclass126
1 files changed, 46 insertions, 80 deletions
diff --git a/eclass/cdrom.eclass b/eclass/cdrom.eclass
index a56ec62b7859..7d552f919967 100644
--- a/eclass/cdrom.eclass
+++ b/eclass/cdrom.eclass
@@ -48,44 +48,16 @@ fi
#
# For those multi cd ebuilds, see the cdrom_load_next_cd() function.
cdrom_get_cds() {
- # first we figure out how many cds we're dealing with by
- # the # of files they gave us
- local cdcnt=0
- local f=
- export CDROM_CURRENT_CD=1 CDROM_CHECKS=( "${@}" )
+ unset CDROM_SET
+ export CDROM_CURRENT_CD=0 CDROM_CHECKS=( "${@}" )
- # now we see if the user gave use CD_ROOT ...
- # if they did, let's just believe them that it's correct
+ # If the user has set CD_ROOT or CD_ROOT_1, don't bother informing
+ # them about which discs are needed as they presumably already know.
if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
- local var=
- cdcnt=0
- while [[ ${cdcnt} -lt ${#} ]] ; do
- ((++cdcnt))
- var="CD_ROOT_${cdcnt}"
- [[ -z ${!var} ]] && var="CD_ROOT"
- if [[ -z ${!var} ]] ; then
- eerror "You must either use just the CD_ROOT"
- eerror "or specify ALL the CD_ROOT_X variables."
- eerror "In this case, you will need" \
- "${#} CD_ROOT_X variables."
- die "could not locate CD_ROOT_${cdcnt}"
- fi
- done
- export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
- einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
- export CDROM_SET=-1
- local IFS=:
- for f in ${CDROM_CHECKS[0]} ; do
- unset IFS
- ((++CDROM_SET))
- export CDROM_MATCH=$(_cdrom_glob_match "${CDROM_ROOT}" "${f}")
- [[ -n ${CDROM_MATCH} ]] && return
- done
- fi
+ :
- # User didn't help us out so lets make sure they know they can
- # simplify the whole process ...
- if [[ ${#} -eq 1 ]] ; then
+ # Single disc info.
+ elif [[ ${#} -eq 1 ]] ; then
einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
echo
einfo "If you do not have the CD, but have the data files"
@@ -96,6 +68,8 @@ cdrom_get_cds() {
einfo "For example:"
einfo "export CD_ROOT=/mnt/cdrom"
echo
+
+ # Multi disc info.
else
_cdrom_set_names
einfo "This package may need access to ${#} cds."
@@ -120,8 +94,7 @@ cdrom_get_cds() {
echo
fi
- export CDROM_SET=""
- export CDROM_CURRENT_CD=0
+ # Scan for the first disc.
cdrom_load_next_cd
}
@@ -135,57 +108,48 @@ cdrom_get_cds() {
# in the CD list, so make sure you only call this function when you're
# done using the current CD.
cdrom_load_next_cd() {
- local var
- ((++CDROM_CURRENT_CD))
-
- _cdrom_set_names
+ local showedmsg=0 showjolietmsg=0
unset CDROM_ROOT
- var=CD_ROOT_${CDROM_CURRENT_CD}
- [[ -z ${!var} ]] && var="CD_ROOT"
- if [[ -z ${!var} ]] ; then
- _cdrom_locate_file_on_cd "${CDROM_CHECKS[${CDROM_CURRENT_CD}]}"
- else
- export CDROM_ROOT=${!var}
- fi
-
- einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
-}
-
-# this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
-# functions. this should *never* be called from an ebuild.
-# all it does is try to locate a give file on a cd ... if the cd isn't
-# found, then a message asking for the user to insert the cdrom will be
-# displayed and we'll hang out here until:
-# (1) the file is found on a mounted cdrom
-# (2) the user hits CTRL+C
-_cdrom_locate_file_on_cd() {
- local mline=""
- local showedmsg=0 showjolietmsg=0
+ ((++CDROM_CURRENT_CD))
- while [[ -z ${CDROM_ROOT} ]] ; do
- local i=0 cdset
- IFS=: read -r -a cdset -d "" <<< "${*}"
+ _cdrom_set_names
- if [[ -n ${CDROM_SET} ]] ; then
- cdset=( "${cdset[${CDROM_SET}]}" )
- fi
+ while true ; do
+ local i cdset
+ : CD_ROOT_${CDROM_CURRENT_CD}
+ export CDROM_ROOT=${CD_ROOT:-${!_}}
+ IFS=: read -r -a cdset -d "" <<< "${CDROM_CHECKS[$((${CDROM_CURRENT_CD} - 1))]}"
+
+ for i in $(seq ${CDROM_SET:-0} ${CDROM_SET:-$((${#cdset[@]} - 1))}); do
+ local f=${cdset[${i}]} point= node= fs= opts=
+
+ if [[ -z ${CDROM_ROOT} ]] ; then
+ while read point node fs opts ; do
+ has "${fs}" cd9660 iso9660 udf || continue
+ point=${point//\040/ }
+ export CDROM_MATCH=$(_cdrom_glob_match "${point}" "${f}")
+ [[ -z ${CDROM_MATCH} ]] && continue
+ export CDROM_ROOT=${point}
+ done <<< "$(get_mounts)"
+ else
+ export CDROM_MATCH=$(_cdrom_glob_match "${CDROM_ROOT}" "${f}")
+ fi
- while [[ -n ${cdset[${i}]} ]] ; do
- local point= node= fs= foo=
- while read point node fs foo ; do
- [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && continue
- point=${point//\040/ }
- export CDROM_MATCH=$(_cdrom_glob_match "${point}" "${cdset[${i}]}")
- [[ -z ${CDROM_MATCH} ]] && continue
- export CDROM_ROOT=${point}
+ if [[ -n ${CDROM_MATCH} ]] ; then
+ export CDROM_ABSMATCH=${CDROM_ROOT}/${CDROM_MATCH}
export CDROM_SET=${i}
- return
- done <<< "$(get_mounts)"
-
- ((++i))
+ break 2
+ fi
done
+ # If we get here then we were unable to locate a match. If
+ # CDROM_ROOT is non-empty then this implies that a CD_ROOT
+ # variable was given and we should therefore abort immediately.
+ if [[ -n ${CDROM_ROOT} ]] ; then
+ die "unable to locate CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
+ fi
+
echo
if [[ ${showedmsg} -eq 0 ]] ; then
if [[ ${#CDROM_CHECKS[@]} -eq 1 ]] ; then
@@ -218,6 +182,8 @@ _cdrom_locate_file_on_cd() {
fi
read || die "something is screwed with your system"
done
+
+ einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
}
# @FUNCTION: _cdrom_glob_match