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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.84 - (hide annotations) (download)
Sun Feb 29 07:17:27 2004 UTC (10 years, 8 months ago) by vapier
Branch: MAIN
Changes since 1.83: +17 -26 lines
use getent to query passwd/group database and have enewuser add new accounts as system accounts #42612

1 vapier 1.76 # Copyright 1999-2004 Gentoo Technologies, Inc.
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.84 # $Header: /home/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.83 2004/02/27 20:39:19 vapier Exp $
4 vapier 1.18 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 vapier 1.18 #
7 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
8 vapier 1.7 # have to implement themselves.
9 azarah 1.1 #
10     # NB: If you add anything, please comment it!
11    
12     ECLASS=eutils
13     INHERITED="$INHERITED $ECLASS"
14    
15 vapier 1.83 DEPEND="!bootstrap? ( sys-devel/patch )"
16 azarah 1.1
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19     # This function generate linker scripts in /usr/lib for dynamic
20     # libs in /lib. This is to fix linking problems when you have
21     # the .so in /lib, and the .a in /usr/lib. What happens is that
22     # in some cases when linking dynamic, the .a in /usr/lib is used
23     # instead of the .so in /lib due to gcc/libtool tweaking ld's
24     # library search path. This cause many builds to fail.
25     # See bug #4411 for more info.
26     #
27     # To use, simply call:
28     #
29     # gen_usr_ldscript libfoo.so
30     #
31     # Note that you should in general use the unversioned name of
32     # the library, as ldconfig should usually update it correctly
33     # to point to the latest version of the library present.
34     #
35     # <azarah@gentoo.org> (26 Oct 2002)
36     #
37     gen_usr_ldscript() {
38    
39     # Just make sure it exists
40     dodir /usr/lib
41 danarmak 1.32
42 azarah 1.1 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43     /* GNU ld script
44     Because Gentoo have critical dynamic libraries
45     in /lib, and the static versions in /usr/lib, we
46     need to have a "fake" dynamic lib in /usr/lib,
47     otherwise we run into linking problems.
48     See bug #4411 on http://bugs.gentoo.org/ for
49     more info. */
50     GROUP ( /lib/libxxx )
51     END_LDSCRIPT
52    
53     dosed "s:libxxx:$1:" /usr/lib/$1
54 azarah 1.5
55     return 0
56 azarah 1.2 }
57    
58 azarah 1.5 # Simple function to draw a line consisting of '=' the same length as $*
59     #
60     # <azarah@gentoo.org> (11 Nov 2002)
61     #
62     draw_line() {
63     local i=0
64     local str_length=""
65    
66     # Handle calls that do not have args, or wc not being installed ...
67     if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
68     then
69     echo "==============================================================="
70     return 0
71     fi
72    
73     # Get the length of $*
74     str_length="$(echo -n "$*" | wc -m)"
75 danarmak 1.32
76 azarah 1.5 while [ "$i" -lt "${str_length}" ]
77     do
78     echo -n "="
79 danarmak 1.32
80 azarah 1.5 i=$((i + 1))
81     done
82    
83     echo
84    
85     return 0
86     }
87 azarah 1.2
88     # Default directory where patches are located
89     EPATCH_SOURCE="${WORKDIR}/patch"
90     # Default extension for patches
91     EPATCH_SUFFIX="patch.bz2"
92     # Default options for patch
93 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
94     EPATCH_OPTS="-g0"
95 azarah 1.6 # List of patches not to apply. Not this is only file names,
96     # and not the full path ..
97     EPATCH_EXCLUDE=""
98 azarah 1.9 # Change the printed message for a single patch.
99     EPATCH_SINGLE_MSG=""
100 azarah 1.29 # Force applying bulk patches even if not following the style:
101     #
102     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
103     #
104     EPATCH_FORCE="no"
105 azarah 1.2
106     # This function is for bulk patching, or in theory for just one
107     # or two patches.
108     #
109     # It should work with .bz2, .gz, .zip and plain text patches.
110     # Currently all patches should be the same format.
111     #
112     # You do not have to specify '-p' option to patch, as it will
113     # try with -p0 to -p5 until it succeed, or fail at -p5.
114     #
115     # Above EPATCH_* variables can be used to control various defaults,
116     # bug they should be left as is to ensure an ebuild can rely on
117     # them for.
118     #
119 azarah 1.3 # Patches are applied in current directory.
120     #
121     # Bulk Patches should preferibly have the form of:
122 azarah 1.2 #
123     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
124     #
125     # For example:
126     #
127     # 01_all_misc-fix.patch.bz2
128     # 02_sparc_another-fix.patch.bz2
129     #
130     # This ensures that there are a set order, and you can have ARCH
131     # specific patches.
132     #
133 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
134     # single patch that need to be applied if its a file. If on the other
135     # hand its a directory, it will set EPATCH_SOURCE to this.
136     #
137 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
138     #
139     epatch() {
140     local PIPE_CMD=""
141     local STDERR_TARGET="${T}/$$.out"
142 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
143     local PATCH_SUFFIX=""
144 azarah 1.3 local SINGLE_PATCH="no"
145 azarah 1.4 local x=""
146 azarah 1.3
147     if [ "$#" -gt 1 ]
148     then
149     eerror "Invalid arguments to epatch()"
150     die "Invalid arguments to epatch()"
151     fi
152    
153     if [ -n "$1" -a -f "$1" ]
154     then
155     SINGLE_PATCH="yes"
156 danarmak 1.32
157 azarah 1.4 local EPATCH_SOURCE="$1"
158     local EPATCH_SUFFIX="${1##*\.}"
159 danarmak 1.32
160 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
161     then
162 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
163     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
164     then
165     local EPATCH_SOURCE="$1/*"
166     else
167     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168     fi
169 azarah 1.3 else
170 azarah 1.8 if [ ! -d ${EPATCH_SOURCE} ]
171     then
172 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
173     then
174     EPATCH_SOURCE="$1"
175     fi
176    
177 azarah 1.8 echo
178 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
179     eerror
180     eerror " ${EPATCH_SOURCE}"
181 azarah 1.8 echo
182     die "Cannot find \$EPATCH_SOURCE!"
183     fi
184 danarmak 1.32
185 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
186 azarah 1.3 fi
187 azarah 1.2
188     case ${EPATCH_SUFFIX##*\.} in
189     bz2)
190     PIPE_CMD="bzip2 -dc"
191 azarah 1.8 PATCH_SUFFIX="bz2"
192 azarah 1.2 ;;
193 azarah 1.6 gz|Z|z)
194 azarah 1.2 PIPE_CMD="gzip -dc"
195 azarah 1.8 PATCH_SUFFIX="gz"
196 azarah 1.2 ;;
197 azarah 1.6 ZIP|zip)
198 azarah 1.2 PIPE_CMD="unzip -p"
199 azarah 1.8 PATCH_SUFFIX="zip"
200 azarah 1.2 ;;
201     *)
202     PIPE_CMD="cat"
203 azarah 1.8 PATCH_SUFFIX="patch"
204 azarah 1.2 ;;
205     esac
206    
207 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
208     then
209     einfo "Applying various patches (bugfixes/updates)..."
210     fi
211     for x in ${EPATCH_SOURCE}
212 azarah 1.2 do
213     # New ARCH dependant patch naming scheme...
214     #
215     # ???_arch_foo.patch
216     #
217     if [ -f ${x} ] && \
218 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219     [ "${EPATCH_FORCE}" = "yes" ])
220 azarah 1.2 then
221     local count=0
222     local popts="${EPATCH_OPTS}"
223 azarah 1.6
224     if [ -n "${EPATCH_EXCLUDE}" ]
225     then
226 azarah 1.9 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
227 azarah 1.6 then
228     continue
229     fi
230     fi
231 danarmak 1.32
232 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
233     then
234 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
235     then
236     einfo "${EPATCH_SINGLE_MSG}"
237     else
238     einfo "Applying ${x##*/}..."
239     fi
240 azarah 1.3 else
241     einfo " ${x##*/}..."
242     fi
243 azarah 1.2
244 azarah 1.8 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 azarah 1.2
247     # Allow for prefix to differ ... im lazy, so shoot me :/
248     while [ "${count}" -lt 5 ]
249     do
250 azarah 1.5 # Generate some useful debug info ...
251 azarah 1.8 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
252     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253    
254     if [ "${PATCH_SUFFIX}" != "patch" ]
255     then
256     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
258     else
259     PATCH_TARGET="${x}"
260     fi
261 danarmak 1.32
262 azarah 1.8 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263     echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 danarmak 1.32
265 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267    
268     if [ "${PATCH_SUFFIX}" != "patch" ]
269     then
270     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
271     then
272     echo
273     eerror "Could not extract patch!"
274     #die "Could not extract patch!"
275     count=5
276     break
277     fi
278     fi
279 danarmak 1.32
280 azarah 1.19 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 azarah 1.2 then
282 azarah 1.8 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284     echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287    
288 azarah 1.19 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289 azarah 1.8
290     if [ "$?" -ne 0 ]
291     then
292     cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293     echo
294     eerror "A dry-run of patch command succeeded, but actually"
295     eerror "applying the patch failed!"
296     #die "Real world sux compared to the dreamworld!"
297     count=5
298     fi
299    
300     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
301 danarmak 1.32
302 azarah 1.2 break
303     fi
304    
305     count=$((count + 1))
306     done
307    
308 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
309     then
310     rm -f ${PATCH_TARGET}
311     fi
312    
313 azarah 1.2 if [ "${count}" -eq 5 ]
314     then
315 azarah 1.8 echo
316 azarah 1.2 eerror "Failed Patch: ${x##*/}!"
317     eerror
318     eerror "Include in your bugreport the contents of:"
319     eerror
320 azarah 1.8 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
321     echo
322 azarah 1.2 die "Failed Patch: ${x##*/}!"
323     fi
324 azarah 1.8
325     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
326 azarah 1.3
327     eend 0
328 azarah 1.2 fi
329     done
330 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
331     then
332     einfo "Done with patching"
333 azarah 1.10 fi
334 azarah 1.26 }
335    
336     # This function return true if we are using the NPTL pthreads
337     # implementation.
338     #
339     # <azarah@gentoo.org> (06 March 2003)
340     #
341    
342     have_NPTL() {
343    
344     cat > ${T}/test-nptl.c <<-"END"
345     #define _XOPEN_SOURCE
346     #include <unistd.h>
347     #include <stdio.h>
348    
349     int main()
350     {
351     char buf[255];
352     char *str = buf;
353    
354     confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355     if (NULL != str) {
356     printf("%s\n", str);
357     if (NULL != strstr(str, "NPTL"))
358     return 0;
359     }
360    
361     return 1;
362     }
363     END
364    
365     einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366     if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367     then
368     echo "yes"
369     einfon "Checking what PTHREADS implementation we have ... "
370     if ${T}/nptl
371     then
372     return 0
373     else
374     return 1
375     fi
376     else
377     echo "no"
378     fi
379    
380     return 1
381 azarah 1.10 }
382    
383     # This function check how many cpu's are present, and then set
384     # -j in MAKEOPTS accordingly.
385     #
386     # Thanks to nall <nall@gentoo.org> for this.
387     #
388     get_number_of_jobs() {
389 azarah 1.13 local jobs=0
390    
391 azarah 1.10 if [ ! -r /proc/cpuinfo ]
392     then
393     return 1
394     fi
395    
396 azarah 1.14 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
397     if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
398     then
399     ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
400 azarah 1.17 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
401     ADMINPARAM="${ADMINPARAM/-j}"
402 azarah 1.14 fi
403    
404 azarah 1.17 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
405 danarmak 1.32
406 drobbins 1.35 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
407 avenj 1.54 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
408 azarah 1.10 then
409 zwelch 1.21 # these archs will always have "[Pp]rocessor"
410     jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
411 danarmak 1.32
412 azarah 1.10 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
413     then
414     # sparc always has "ncpus active"
415 azarah 1.13 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
416 danarmak 1.32
417 azarah 1.10 elif [ "${ARCH}" = "alpha" ]
418     then
419     # alpha has "cpus active", but only when compiled with SMP
420 azarah 1.13 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
421 azarah 1.10 then
422 azarah 1.13 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 azarah 1.10 else
424 azarah 1.13 jobs=2
425 azarah 1.10 fi
426 danarmak 1.32
427 brad_mssw 1.78 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
428 azarah 1.10 then
429     # ppc has "processor", but only when compiled with SMP
430 azarah 1.13 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 azarah 1.10 then
432 azarah 1.13 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 azarah 1.10 else
434 azarah 1.13 jobs=2
435 azarah 1.10 fi
436     else
437 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
439 azarah 1.3 fi
440 azarah 1.13
441     # Make sure the number is valid ...
442     if [ "${jobs}" -lt 1 ]
443     then
444     jobs=1
445     fi
446 danarmak 1.32
447 azarah 1.15 if [ -n "${ADMINPARAM}" ]
448 azarah 1.14 then
449 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
450     then
451     einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
452     export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
453     else
454     einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
455     export MAKEOPTS="${MAKEOPTS} -j${jobs}"
456     fi
457 azarah 1.14 fi
458 azarah 1.1 }
459    
460 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
461 vapier 1.80 # does not exist on the users system
462 vapier 1.52 # vapier@gentoo.org
463     #
464     # Takes just 1 parameter (the directory to create tmpfile in)
465     mymktemp() {
466 azarah 1.59 local topdir="$1"
467    
468 vapier 1.52 [ -z "${topdir}" ] && topdir=/tmp
469 azarah 1.59 if [ "`which mktemp 2>/dev/null`" ]
470     then
471 vapier 1.52 mktemp -p ${topdir}
472     else
473     local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474     touch ${tmp}
475     echo ${tmp}
476     fi
477     }
478    
479 vapier 1.23 # Simplify/standardize adding users to the system
480     # vapier@gentoo.org
481     #
482     # enewuser(username, uid, shell, homedir, groups, extra options)
483     #
484     # Default values if you do not specify any:
485     # username: REQUIRED !
486     # uid: next available (see useradd(8))
487 vapier 1.27 # note: pass -1 to get default behavior
488 vapier 1.23 # shell: /bin/false
489     # homedir: /dev/null
490     # groups: none
491     # extra: comment of 'added by portage for ${PN}'
492     enewuser() {
493     # get the username
494     local euser="$1"; shift
495 azarah 1.59 if [ -z "${euser}" ]
496     then
497 vapier 1.23 eerror "No username specified !"
498     die "Cannot call enewuser without a username"
499     fi
500    
501 vapier 1.84 # lets see if the username already exists
502     if [ "${euser}" == "`getent passwd \"${euser}\" | cut -d: -f1`" ]
503 azarah 1.59 then
504 vapier 1.23 return 0
505     fi
506 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
507 vapier 1.23
508     # options to pass to useradd
509 azarah 1.59 local opts=
510 vapier 1.23
511     # handle uid
512     local euid="$1"; shift
513 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
514     then
515     if [ "${euid}" -gt 0 ]
516     then
517 vapier 1.84 if [ ! -z "`getent passwd ${euid}`" ]
518 vapier 1.82 then
519 vapier 1.84 euid="next"
520 vapier 1.82 fi
521 vapier 1.23 else
522     eerror "Userid given but is not greater than 0 !"
523     die "${euid} is not a valid UID"
524     fi
525     else
526 vapier 1.84 euid="next"
527     fi
528     if [ "${euid}" == "next" ]
529     then
530     for euid in `seq 101 999` ; do
531     [ -z "`getent passwd ${euid}`" ] && break
532     done
533 vapier 1.23 fi
534 vapier 1.84 opts="${opts} -u ${euid}"
535 vapier 1.23 einfo " - Userid: ${euid}"
536    
537     # handle shell
538     local eshell="$1"; shift
539 vapier 1.67 if [ ! -z "${eshell}" ] && [ "${eshell}" != "-1" ]
540 azarah 1.59 then
541     if [ ! -e "${eshell}" ]
542     then
543 vapier 1.23 eerror "A shell was specified but it does not exist !"
544     die "${eshell} does not exist"
545     fi
546     else
547 azarah 1.59 eshell="/bin/false"
548 vapier 1.23 fi
549     einfo " - Shell: ${eshell}"
550     opts="${opts} -s ${eshell}"
551    
552     # handle homedir
553     local ehome="$1"; shift
554 vapier 1.67 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ]
555 azarah 1.59 then
556     ehome="/dev/null"
557 vapier 1.23 fi
558     einfo " - Home: ${ehome}"
559     opts="${opts} -d ${ehome}"
560    
561     # handle groups
562     local egroups="$1"; shift
563 azarah 1.59 if [ ! -z "${egroups}" ]
564     then
565     local realgroup=
566 vapier 1.23 local oldifs="${IFS}"
567     export IFS=","
568 azarah 1.59 for g in ${egroups}
569     do
570 vapier 1.23 chgrp ${g} ${tmpfile} >& /dev/null
571     realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
572 azarah 1.59 if [ "${g}" != "${realgroup}" ]
573     then
574 vapier 1.23 eerror "You must add ${g} to the system first"
575     die "${g} is not a valid GID"
576     fi
577     done
578     export IFS="${oldifs}"
579     opts="${opts} -g ${egroups}"
580     else
581     egroups="(none)"
582     fi
583     einfo " - Groups: ${egroups}"
584    
585     # handle extra and add the user
586     local eextra="$@"
587 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
588 vapier 1.23 export SANDBOX_ON="0"
589 azarah 1.59 if [ -z "${eextra}" ]
590     then
591 vapier 1.23 useradd ${opts} ${euser} \
592     -c "added by portage for ${PN}" \
593     || die "enewuser failed"
594     else
595     einfo " - Extra: ${eextra}"
596     useradd ${opts} ${euser} ${eextra} \
597 danarmak 1.32 || die "enewuser failed"
598 vapier 1.23 fi
599     export SANDBOX_ON="${oldsandbox}"
600    
601 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
602     then
603 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
604     dodir ${ehome}
605 vapier 1.37 fowners ${euser} ${ehome}
606 vapier 1.38 fperms 755 ${ehome}
607 vapier 1.23 fi
608     }
609    
610     # Simplify/standardize adding groups to the system
611     # vapier@gentoo.org
612     #
613     # enewgroup(group, gid)
614     #
615     # Default values if you do not specify any:
616     # groupname: REQUIRED !
617     # gid: next available (see groupadd(8))
618     # extra: none
619     enewgroup() {
620     # get the group
621     local egroup="$1"; shift
622 azarah 1.59 if [ -z "${egroup}" ]
623     then
624 vapier 1.23 eerror "No group specified !"
625     die "Cannot call enewgroup without a group"
626     fi
627    
628     # see if group already exists
629 vapier 1.84 if [ "${egroup}" == "`getent group \"${egroup}\" | cut -d: -f1`" ]
630 azarah 1.59 then
631 vapier 1.23 return 0
632     fi
633 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
634 vapier 1.23
635     # options to pass to useradd
636 azarah 1.59 local opts=
637 vapier 1.23
638     # handle gid
639     local egid="$1"; shift
640 azarah 1.59 if [ ! -z "${egid}" ]
641     then
642     if [ "${egid}" -gt 0 ]
643     then
644 vapier 1.84 if [ -z "`getent group ${egid}`" ]
645 vapier 1.83 then
646 vapier 1.84 opts="${opts} -g ${egid}"
647 vapier 1.83 else
648 vapier 1.84 egid="next available; requested gid taken"
649 vapier 1.83 fi
650 vapier 1.23 else
651     eerror "Groupid given but is not greater than 0 !"
652     die "${egid} is not a valid GID"
653     fi
654     else
655     egid="next available"
656     fi
657     einfo " - Groupid: ${egid}"
658    
659     # handle extra
660     local eextra="$@"
661     opts="${opts} ${eextra}"
662    
663     # add the group
664 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
665 vapier 1.23 export SANDBOX_ON="0"
666     groupadd ${opts} ${egroup} || die "enewgroup failed"
667     export SANDBOX_ON="${oldsandbox}"
668 vapier 1.24 }
669    
670     # Simple script to replace 'dos2unix' binaries
671     # vapier@gentoo.org
672     #
673     # edos2unix(file, <more files>...)
674     edos2unix() {
675 vapier 1.61 for f in "$@"
676 azarah 1.59 do
677 vapier 1.61 cp "${f}" ${T}/edos2unix
678     sed 's/\r$//' ${T}/edos2unix > "${f}"
679 vapier 1.24 done
680 vapier 1.39 }
681    
682     # Make a desktop file !
683     # Great for making those icons in kde/gnome startmenu !
684     # Amaze your friends ! Get the women ! Join today !
685     # gnome2 /usr/share/applications
686     # gnome1 /usr/share/gnome/apps/
687     # KDE ${KDEDIR}/share/applnk /usr/share/applnk
688     #
689     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
690     #
691     # binary: what binary does the app run with ?
692     # name: the name that will show up in the menu
693     # icon: give your little like a pretty little icon ...
694     # this can be relative (to /usr/share/pixmaps) or
695     # a full path to an icon
696     # type: what kind of application is this ? for categories:
697     # http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
698     # path: if your app needs to startup in a specific dir
699     make_desktop_entry() {
700     [ -z "$1" ] && eerror "You must specify the executable" && return 1
701    
702 azarah 1.59 local exec="${1}"
703     local name="${2:-${PN}}"
704     local icon="${3:-${PN}.png}"
705     local type="${4}"
706 vapier 1.81 local subdir="${6}"
707 azarah 1.59 local path="${5:-${GAMES_PREFIX}}"
708     if [ -z "${type}" ]
709     then
710 vapier 1.39 case ${CATEGORY} in
711 azarah 1.59 "app-emulation")
712     type=Emulator
713 vapier 1.81 subdir="Games"
714 azarah 1.59 ;;
715     "games-"*)
716     type=Game
717 vapier 1.81 subdir="Games"
718 wolf31o2 1.65 ;;
719     "net-"*)
720 vapier 1.81 type=Network
721     subdir="${type}"
722 azarah 1.59 ;;
723     *)
724     type=
725 vapier 1.81 subdir=
726 azarah 1.59 ;;
727 vapier 1.39 esac
728     fi
729 azarah 1.59 local desktop="${T}/${exec}.desktop"
730 vapier 1.39
731     echo "[Desktop Entry]
732     Encoding=UTF-8
733     Version=0.9.2
734     Name=${name}
735     Type=Application
736     Comment=${DESCRIPTION}
737     Exec=${exec}
738     Path=${path}
739     Icon=${icon}
740 vapier 1.40 Categories=Application;${type};" > ${desktop}
741 vapier 1.39
742 azarah 1.59 if [ -d "/usr/share/applications" ]
743     then
744 vapier 1.39 insinto /usr/share/applications
745 vapier 1.40 doins ${desktop}
746 vapier 1.39 fi
747    
748 azarah 1.59 #if [ -d "/usr/share/gnome/apps" ]
749     #then
750 vapier 1.40 # insinto /usr/share/gnome/apps/Games
751     # doins ${desktop}
752     #fi
753    
754 azarah 1.59 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
755     #then
756     # for ver in /usr/kde/*
757     # do
758 vapier 1.40 # insinto ${ver}/share/applnk/Games
759     # doins ${desktop}
760     # done
761     #fi
762 vapier 1.39
763 azarah 1.59 if [ -d "/usr/share/applnk" ]
764     then
765 vapier 1.81 insinto /usr/share/applnk/${subdir}
766 vapier 1.40 doins ${desktop}
767 vapier 1.39 fi
768    
769     return 0
770 danarmak 1.32 }
771    
772 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
773     find_unpackable_file() {
774 azarah 1.59 local src="$1"
775     if [ -z "${src}" ]
776     then
777 vapier 1.50 src="${DISTDIR}/${A}"
778     else
779 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
780     then
781 vapier 1.50 src="${DISTDIR}/${src}"
782 azarah 1.59 elif [ -e "${PWD}/${src}" ]
783     then
784 vapier 1.50 src="${PWD}/${src}"
785 azarah 1.59 elif [ -e "${src}" ]
786     then
787 vapier 1.50 src="${src}"
788     fi
789     fi
790 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
791     echo "${src}"
792     }
793    
794     # Unpack those pesky pdv generated files ...
795     # They're self-unpacking programs with the binary package stuffed in
796     # the middle of the archive. Valve seems to use it a lot ... too bad
797     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
798     #
799     # Usage: unpack_pdv [file to unpack] [size of off_t]
800     # - you have to specify the off_t size ... i have no idea how to extract that
801     # information out of the binary executable myself. basically you pass in
802     # the size of the off_t type (in bytes) on the machine that built the pdv
803     # archive. one way to determine this is by running the following commands:
804     # strings <pdv archive> | grep lseek
805     # strace -elseek <pdv archive>
806     # basically look for the first lseek command (we do the strings/grep because
807     # sometimes the function call is _llseek or something) and steal the 2nd
808     # parameter. here is an example:
809     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
810     # lseek
811     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
812     # lseek(3, -4, SEEK_END) = 2981250
813     # thus we would pass in the value of '4' as the second parameter.
814     unpack_pdv() {
815     local src="`find_unpackable_file $1`"
816     local sizeoff_t="$2"
817    
818     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
819    
820     local shrtsrc="`basename ${src}`"
821     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
822     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
823     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
824    
825     # grab metadata for debug reasons
826     local metafile="`mymktemp ${T}`"
827     tail -c +$((${metaskip}+1)) ${src} > ${metafile}
828    
829     # rip out the final file name from the metadata
830     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
831     datafile="`basename ${datafile}`"
832    
833 vapier 1.71 # now lets uncompress/untar the file if need be
834 vapier 1.70 local tmpfile="`mymktemp ${T}`"
835     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
836 vapier 1.71
837     local iscompressed="`file -b ${tmpfile}`"
838     if [ "${iscompressed:0:8}" == "compress" ] ; then
839     iscompressed=1
840     mv ${tmpfile}{,.Z}
841     gunzip ${tmpfile}
842     else
843     iscompressed=0
844     fi
845     local istar="`file -b ${tmpfile}`"
846     if [ "${istar:0:9}" == "POSIX tar" ] ; then
847     istar=1
848     else
849     istar=0
850     fi
851    
852     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
853     #dd if=${src} ibs=${metaskip} count=1 \
854     # | dd ibs=${tailskip} skip=1 \
855     # | gzip -dc \
856     # > ${datafile}
857     if [ ${iscompressed} -eq 1 ] ; then
858     if [ ${istar} -eq 1 ] ; then
859     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
860     | head -c $((${metaskip}-${tailskip})) \
861     | tar -xzf -
862     else
863 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
864     | head -c $((${metaskip}-${tailskip})) \
865     | gzip -dc \
866     > ${datafile}
867 vapier 1.71 fi
868     else
869     if [ ${istar} -eq 1 ] ; then
870     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
871     | head -c $((${metaskip}-${tailskip})) \
872 vapier 1.73 | tar --no-same-owner -xf -
873 vapier 1.71 else
874 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
875     | head -c $((${metaskip}-${tailskip})) \
876     > ${datafile}
877 vapier 1.71 fi
878     fi
879     true
880     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
881 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
882     }
883    
884     # Unpack those pesky makeself generated files ...
885     # They're shell scripts with the binary package tagged onto
886     # the end of the archive. Loki utilized the format as does
887     # many other game companies.
888     #
889     # Usage: unpack_makeself [file to unpack] [offset]
890     # - If the file is not specified then unpack will utilize ${A}.
891     # - If the offset is not specified then we will attempt to extract
892     # the proper offset from the script itself.
893     unpack_makeself() {
894     local src="`find_unpackable_file $1`"
895     local skip="$2"
896 vapier 1.50
897 azarah 1.59 local shrtsrc="`basename ${src}`"
898 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
899 azarah 1.59 if [ -z "${skip}" ]
900     then
901 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
902     local skip=0
903     case ${ver} in
904     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
905     skip=`grep -a ^skip= ${src} | cut -d= -f2`
906     ;;
907     2.0|2.0.1)
908     skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
909     ;;
910 wolf31o2 1.48 2.1.1)
911 vapier 1.41 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
912 wolf31o2 1.48 let skip="skip + 1"
913     ;;
914 vapier 1.49 2.1.2)
915     skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
916     let skip="skip + 1"
917     ;;
918 wolf31o2 1.48 2.1.3)
919     skip=`grep -a ^offset= ${src} | awk '{print $3}'`
920 vapier 1.41 let skip="skip + 1"
921     ;;
922     *)
923     eerror "I'm sorry, but I was unable to support the Makeself file."
924     eerror "The version I detected was '${ver}'."
925     eerror "Please file a bug about the file ${shrtsrc} at"
926     eerror "http://bugs.gentoo.org/ so that support can be added."
927     die "makeself version '${ver}' not supported"
928     ;;
929     esac
930     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
931     fi
932    
933 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
934     local tmpfile="`mymktemp ${T}`"
935     tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile}
936     local filetype="`file -b ${tmpfile}`"
937     case ${filetype} in
938     *tar\ archive)
939 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xf -
940 vapier 1.68 ;;
941     bzip2*)
942 vapier 1.73 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf -
943 mr_bones_ 1.69 ;;
944 vapier 1.68 gzip*)
945 vapier 1.73 tail -n +${skip} ${src} | tar --no-same-owner -xzf -
946 vapier 1.68 ;;
947     *)
948     false
949     ;;
950     esac
951     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
952 wolf31o2 1.56 }
953    
954     # Display a license for user to accept.
955     #
956     # Usage: check_license [license]
957     # - If the file is not specified then ${LICENSE} is used.
958     check_license() {
959 vapier 1.60 local lic=$1
960     if [ -z "${lic}" ] ; then
961     lic="${PORTDIR}/licenses/${LICENSE}"
962 wolf31o2 1.56 else
963 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
964     lic="${PORTDIR}/licenses/${src}"
965     elif [ -e "${PWD}/${src}" ] ; then
966     lic="${PWD}/${src}"
967     elif [ -e "${src}" ] ; then
968     lic="${src}"
969 wolf31o2 1.56 fi
970     fi
971 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
972 vapier 1.64 local l="`basename ${lic}`"
973 wolf31o2 1.56
974 vapier 1.60 # here is where we check for the licenses the user already
975     # accepted ... if we don't find a match, we make the user accept
976     local alic
977 vapier 1.74 for alic in "${ACCEPT_LICENSE}" ; do
978 vapier 1.60 [ "${alic}" == "*" ] && return 0
979 vapier 1.64 [ "${alic}" == "${l}" ] && return 0
980 vapier 1.60 done
981    
982     local licmsg="`mymktemp ${T}`"
983     cat << EOF > ${licmsg}
984     **********************************************************
985     The following license outlines the terms of use of this
986     package. You MUST accept this license for installation to
987     continue. When you are done viewing, hit 'q'. If you
988     CTRL+C out of this, the install will not run!
989     **********************************************************
990    
991     EOF
992     cat ${lic} >> ${licmsg}
993     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
994 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
995 vapier 1.60 read alic
996     case ${alic} in
997     yes|Yes|y|Y)
998     return 0
999     ;;
1000     *)
1001     echo;echo;echo
1002     eerror "You MUST accept the license to continue! Exiting!"
1003     die "Failed to accept license"
1004     ;;
1005     esac
1006 vapier 1.23 }
1007 vapier 1.75
1008     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1009     # the whole 'non-interactive' policy, but damnit I want CD support !
1010     #
1011     # with these cdrom functions we handle all the user interaction and
1012     # standardize everything. all you have to do is call cdrom_get_cds()
1013     # and when the function returns, you can assume that the cd has been
1014     # found at CDROM_ROOT.
1015     #
1016     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1017     # etc... if you want to give the cds better names, then just export
1018     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1019     #
1020     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1021     #
1022     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1023     # - this will attempt to locate a cd based upon a file that is on
1024     # the cd ... the more files you give this function, the more cds
1025     # the cdrom functions will handle
1026     cdrom_get_cds() {
1027     # first we figure out how many cds we're dealing with by
1028     # the # of files they gave us
1029     local cdcnt=0
1030     local f=
1031     for f in "$@" ; do
1032     cdcnt=$((cdcnt + 1))
1033     export CDROM_CHECK_${cdcnt}="$f"
1034     done
1035     export CDROM_TOTAL_CDS=${cdcnt}
1036     export CDROM_CURRENT_CD=1
1037    
1038     # now we see if the user gave use CD_ROOT ...
1039     # if they did, let's just believe them that it's correct
1040     if [ ! -z "${CD_ROOT}" ] ; then
1041     export CDROM_ROOT="${CD_ROOT}"
1042     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1043     return
1044     fi
1045     # do the same for CD_ROOT_X
1046     if [ ! -z "${CD_ROOT_1}" ] ; then
1047     local var=
1048     cdcnt=0
1049     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1050     cdcnt=$((cdcnt + 1))
1051     var="CD_ROOT_${cdcnt}"
1052     if [ -z "${!var}" ] ; then
1053     eerror "You must either use just the CD_ROOT"
1054     eerror "or specify ALL the CD_ROOT_X variables."
1055     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1056     die "could not locate CD_ROOT_${cdcnt}"
1057     fi
1058     export CDROM_ROOTS_${cdcnt}="${!var}"
1059     done
1060     export CDROM_ROOT=${CDROM_ROOTS_1}
1061     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1062     return
1063     fi
1064    
1065     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1066     einfon "This ebuild will need the "
1067     if [ -z "${CDROM_NAME}" ] ; then
1068     echo "cdrom for ${PN}."
1069     else
1070     echo "${CDROM_NAME}."
1071     fi
1072     echo
1073     einfo "If you do not have the CD, but have the data files"
1074     einfo "mounted somewhere on your filesystem, just export"
1075     einfo "the variable CD_ROOT so that it points to the"
1076     einfo "directory containing the files."
1077     echo
1078     else
1079     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1080     cdcnt=0
1081     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1082     cdcnt=$((cdcnt + 1))
1083     var="CDROM_NAME_${cdcnt}"
1084     [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}"
1085     done
1086     echo
1087     einfo "If you do not have the CDs, but have the data files"
1088     einfo "mounted somewhere on your filesystem, just export"
1089     einfo "the following variables so they point to the right place:"
1090     einfon ""
1091     cdcnt=0
1092     while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do
1093     cdcnt=$((cdcnt + 1))
1094     echo -n " CD_ROOT_${cdcnt}"
1095     done
1096     echo
1097     einfo "Or, if you have all the files in the same place, or"
1098     einfo "you only have one cdrom, you can export CD_ROOT"
1099     einfo "and that place will be used as the same data source"
1100     einfo "for all the CDs."
1101     echo
1102     fi
1103     export CDROM_CURRENT_CD=0
1104     cdrom_load_next_cd
1105     }
1106    
1107     # this is only used when you need access to more than one cd.
1108     # when you have finished using the first cd, just call this function.
1109     # when it returns, CDROM_ROOT will be pointing to the second cd.
1110     # remember, you can only go forward in the cd chain, you can't go back.
1111     cdrom_load_next_cd() {
1112     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1113     local var=
1114    
1115 vapier 1.79 if [ ! -z "${CD_ROOT}" ] ; then
1116     einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1117     return
1118     fi
1119    
1120 vapier 1.75 unset CDROM_ROOT
1121     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1122     if [ -z "${!var}" ] ; then
1123     var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1124     cdrom_locate_file_on_cd ${!var}
1125     else
1126     export CDROM_ROOT="${!var}"
1127     fi
1128    
1129     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1130     }
1131    
1132     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1133     # functions. this should *never* be called from an ebuild.
1134     # all it does is try to locate a give file on a cd ... if the cd isn't
1135     # found, then a message asking for the user to insert the cdrom will be
1136     # displayed and we'll hang out here until:
1137     # (1) the file is found on a mounted cdrom
1138     # (2) the user hits CTRL+C
1139     cdrom_locate_file_on_cd() {
1140     while [ -z "${CDROM_ROOT}" ] ; do
1141     local dir="$(dirname ${@})"
1142     local file="$(basename ${@})"
1143     local mline=""
1144     local showedmsg=0
1145    
1146     for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do
1147     [ -d "${mline}/${dir}" ] || continue
1148     [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \
1149     && export CDROM_ROOT=${mline}
1150     done
1151    
1152     if [ -z "${CDROM_ROOT}" ] ; then
1153     echo
1154     if [ ${showedmsg} -eq 0 ] ; then
1155     if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then
1156     if [ -z "${CDROM_NAME}" ] ; then
1157     einfo "Please insert the cdrom for ${PN} now !"
1158     else
1159     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1160     fi
1161     else
1162     if [ -z "${CDROM_NAME_1}" ] ; then
1163     einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1164     else
1165     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1166     einfo "Please insert+mount the ${!var} cdrom now !"
1167     fi
1168     fi
1169     showedmsg=1
1170     fi
1171     einfo "Press return to scan for the cd again"
1172     einfo "or hit CTRL+C to abort the emerge."
1173     read
1174     fi
1175     done
1176     }

  ViewVC Help
Powered by ViewVC 1.1.20