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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.223 - (hide annotations) (download)
Wed Feb 15 23:40:16 2006 UTC (8 years, 10 months ago) by flameeyes
Branch: MAIN
Changes since 1.222: +11 -5 lines
Fix mktemp call for non-GNU userlands, thanks to Benigno B. Junior. Finally closes bug #88079.

1 vapier 1.154 # Copyright 1999-2005 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 flameeyes 1.223 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.222 2006/01/11 01:00:43 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 flameeyes 1.197 inherit multilib portability
13 azarah 1.1
14 azarah 1.185 DEPEND="!bootstrap? ( sys-devel/patch )"
15 azarah 1.181 # sys-apps/shadow is needed for useradd, etc, bug #94745.
16 azarah 1.1
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19 ciaranm 1.98 # Wait for the supplied number of seconds. If no argument is supplied, defaults
20     # to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
21     # outputting to a terminal, don't wait. For compatability purposes, the argument
22     # must be an integer greater than zero.
23     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
24     epause() {
25     if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
26     sleep ${1:-5}
27     fi
28     }
29    
30     # Beep the specified number of times (defaults to five). If our output
31     # is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
32     # don't beep.
33     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
34     ebeep() {
35     local n
36     if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
37     for ((n=1 ; n <= ${1:-5} ; n++)) ; do
38     echo -ne "\a"
39     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
40     echo -ne "\a"
41     sleep 1
42     done
43     fi
44     }
45    
46 azarah 1.1 # This function generate linker scripts in /usr/lib for dynamic
47     # libs in /lib. This is to fix linking problems when you have
48     # the .so in /lib, and the .a in /usr/lib. What happens is that
49     # in some cases when linking dynamic, the .a in /usr/lib is used
50     # instead of the .so in /lib due to gcc/libtool tweaking ld's
51     # library search path. This cause many builds to fail.
52     # See bug #4411 for more info.
53     #
54     # To use, simply call:
55     #
56     # gen_usr_ldscript libfoo.so
57     #
58     # Note that you should in general use the unversioned name of
59     # the library, as ldconfig should usually update it correctly
60     # to point to the latest version of the library present.
61     #
62     # <azarah@gentoo.org> (26 Oct 2002)
63     #
64     gen_usr_ldscript() {
65 vapier 1.219 local lib libdir=$(get_libdir)
66 azarah 1.1 # Just make sure it exists
67 vapier 1.109 dodir /usr/${libdir}
68 danarmak 1.32
69 eradicator 1.163 for lib in "${@}" ; do
70     cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
71 vapier 1.161 /* GNU ld script
72 swegener 1.190 Since Gentoo has critical dynamic libraries
73     in /lib, and the static versions in /usr/lib,
74 vapier 1.161 we need to have a "fake" dynamic lib in /usr/lib,
75     otherwise we run into linking problems.
76 swegener 1.190
77 vapier 1.161 See bug http://bugs.gentoo.org/4411 for more info.
78     */
79 eradicator 1.163 GROUP ( /${libdir}/${lib} )
80 vapier 1.161 END_LDSCRIPT
81 vapier 1.219 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
82 vapier 1.161 done
83 azarah 1.2 }
84    
85    
86     # Default directory where patches are located
87     EPATCH_SOURCE="${WORKDIR}/patch"
88     # Default extension for patches
89     EPATCH_SUFFIX="patch.bz2"
90     # Default options for patch
91 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
92 vapier 1.170 # Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
93     EPATCH_OPTS="-g0 --no-backup-if-mismatch"
94 azarah 1.6 # List of patches not to apply. Not this is only file names,
95     # and not the full path ..
96     EPATCH_EXCLUDE=""
97 azarah 1.9 # Change the printed message for a single patch.
98     EPATCH_SINGLE_MSG=""
99 vapier 1.173 # Change the printed message for multiple patches.
100     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
101 azarah 1.29 # Force applying bulk patches even if not following the style:
102     #
103     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
104     #
105     EPATCH_FORCE="no"
106 azarah 1.2
107     # This function is for bulk patching, or in theory for just one
108     # or two patches.
109     #
110     # It should work with .bz2, .gz, .zip and plain text patches.
111     # Currently all patches should be the same format.
112     #
113     # You do not have to specify '-p' option to patch, as it will
114     # try with -p0 to -p5 until it succeed, or fail at -p5.
115     #
116     # Above EPATCH_* variables can be used to control various defaults,
117     # bug they should be left as is to ensure an ebuild can rely on
118     # them for.
119     #
120 azarah 1.3 # Patches are applied in current directory.
121     #
122     # Bulk Patches should preferibly have the form of:
123 azarah 1.2 #
124     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
125     #
126     # For example:
127     #
128     # 01_all_misc-fix.patch.bz2
129     # 02_sparc_another-fix.patch.bz2
130     #
131     # This ensures that there are a set order, and you can have ARCH
132     # specific patches.
133     #
134 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
135     # single patch that need to be applied if its a file. If on the other
136     # hand its a directory, it will set EPATCH_SOURCE to this.
137     #
138 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
139     #
140     epatch() {
141 vapier 1.219 _epatch_draw_line() {
142     local i=0 str_length="" str_out=""
143    
144     # Handle calls that do not have args, or wc not being installed ...
145     if [[ -z $1 ]] || ! type -p wc >/dev/null ; then
146     str_length=65
147     else
148     str_length=$(echo -n "$*" | wc -m)
149     fi
150    
151     while ((i++ < ${str_length})) ; do
152     str_out="${str_out}="
153     done
154     echo ${str_out}
155    
156     return 0
157     }
158 vapier 1.208 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
159 azarah 1.2 local PIPE_CMD=""
160     local STDERR_TARGET="${T}/$$.out"
161 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
162     local PATCH_SUFFIX=""
163 azarah 1.3 local SINGLE_PATCH="no"
164 azarah 1.4 local x=""
165 azarah 1.3
166 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
167    
168 azarah 1.3 if [ "$#" -gt 1 ]
169     then
170 vapier 1.94 local m=""
171     for m in "$@" ; do
172     epatch "${m}"
173     done
174     return 0
175 azarah 1.3 fi
176    
177     if [ -n "$1" -a -f "$1" ]
178     then
179     SINGLE_PATCH="yes"
180 danarmak 1.32
181 azarah 1.4 local EPATCH_SOURCE="$1"
182     local EPATCH_SUFFIX="${1##*\.}"
183 danarmak 1.32
184 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
185     then
186 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
187     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
188     then
189     local EPATCH_SOURCE="$1/*"
190     else
191     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
192     fi
193 azarah 1.3 else
194 vapier 1.123 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
195 azarah 1.8 then
196 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
197     then
198     EPATCH_SOURCE="$1"
199     fi
200    
201 azarah 1.8 echo
202 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
203     eerror
204     eerror " ${EPATCH_SOURCE}"
205 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
206 azarah 1.8 echo
207     die "Cannot find \$EPATCH_SOURCE!"
208     fi
209 danarmak 1.32
210 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
211 azarah 1.3 fi
212 azarah 1.2
213     case ${EPATCH_SUFFIX##*\.} in
214     bz2)
215     PIPE_CMD="bzip2 -dc"
216 azarah 1.8 PATCH_SUFFIX="bz2"
217 azarah 1.2 ;;
218 azarah 1.6 gz|Z|z)
219 azarah 1.2 PIPE_CMD="gzip -dc"
220 azarah 1.8 PATCH_SUFFIX="gz"
221 azarah 1.2 ;;
222 azarah 1.6 ZIP|zip)
223 azarah 1.2 PIPE_CMD="unzip -p"
224 azarah 1.8 PATCH_SUFFIX="zip"
225 azarah 1.2 ;;
226     *)
227     PIPE_CMD="cat"
228 azarah 1.8 PATCH_SUFFIX="patch"
229 azarah 1.2 ;;
230     esac
231    
232 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
233     then
234 vapier 1.173 einfo "${EPATCH_MULTI_MSG}"
235 azarah 1.3 fi
236     for x in ${EPATCH_SOURCE}
237 azarah 1.2 do
238 vapier 1.121 # New ARCH dependant patch naming scheme ...
239 azarah 1.2 #
240     # ???_arch_foo.patch
241     #
242     if [ -f ${x} ] && \
243 vapier 1.178 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
244 azarah 1.29 [ "${EPATCH_FORCE}" = "yes" ])
245 azarah 1.2 then
246     local count=0
247     local popts="${EPATCH_OPTS}"
248 eradicator 1.150 local patchname=${x##*/}
249 azarah 1.6
250     if [ -n "${EPATCH_EXCLUDE}" ]
251     then
252 eradicator 1.150 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
253 azarah 1.6 then
254     continue
255     fi
256     fi
257 danarmak 1.32
258 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
259     then
260 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
261     then
262     einfo "${EPATCH_SINGLE_MSG}"
263     else
264 eradicator 1.150 einfo "Applying ${patchname} ..."
265 azarah 1.9 fi
266 azarah 1.3 else
267 eradicator 1.150 einfo " ${patchname} ..."
268 azarah 1.3 fi
269 azarah 1.2
270 eradicator 1.150 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
271     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
272 azarah 1.2
273     # Allow for prefix to differ ... im lazy, so shoot me :/
274     while [ "${count}" -lt 5 ]
275     do
276 azarah 1.5 # Generate some useful debug info ...
277 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
278 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
279 azarah 1.8
280     if [ "${PATCH_SUFFIX}" != "patch" ]
281     then
282 eradicator 1.150 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
283     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
284 azarah 1.8 else
285     PATCH_TARGET="${x}"
286     fi
287 danarmak 1.32
288 eradicator 1.150 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
289     echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
290 danarmak 1.32
291 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
292 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
293 azarah 1.8
294     if [ "${PATCH_SUFFIX}" != "patch" ]
295     then
296 eradicator 1.150 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
297 azarah 1.8 then
298     echo
299     eerror "Could not extract patch!"
300     #die "Could not extract patch!"
301     count=5
302     break
303     fi
304     fi
305 danarmak 1.32
306 vapier 1.208 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
307 azarah 1.2 then
308 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
309 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
310     echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
311     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
312 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
313 azarah 1.8
314 eradicator 1.150 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
315 vapier 1.208 _epatch_assert
316 azarah 1.8
317     if [ "$?" -ne 0 ]
318     then
319 eradicator 1.150 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
320 azarah 1.8 echo
321     eerror "A dry-run of patch command succeeded, but actually"
322     eerror "applying the patch failed!"
323     #die "Real world sux compared to the dreamworld!"
324     count=5
325     fi
326    
327 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
328 danarmak 1.32
329 azarah 1.2 break
330     fi
331    
332     count=$((count + 1))
333     done
334    
335 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
336     then
337     rm -f ${PATCH_TARGET}
338     fi
339    
340 azarah 1.2 if [ "${count}" -eq 5 ]
341     then
342 azarah 1.8 echo
343 vapier 1.158 eerror "Failed Patch: ${patchname} !"
344     eerror " ( ${PATCH_TARGET} )"
345 azarah 1.2 eerror
346     eerror "Include in your bugreport the contents of:"
347     eerror
348 eradicator 1.150 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
349 azarah 1.8 echo
350 eradicator 1.150 die "Failed Patch: ${patchname}!"
351 azarah 1.2 fi
352 azarah 1.8
353 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
354 azarah 1.3
355     eend 0
356 azarah 1.2 fi
357     done
358 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
359     then
360     einfo "Done with patching"
361 azarah 1.10 fi
362 azarah 1.26 }
363    
364 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
365 vapier 1.80 # does not exist on the users system
366 vapier 1.52 # vapier@gentoo.org
367     #
368 vapier 1.117 # Takes just 1 optional parameter (the directory to create tmpfile in)
369     emktemp() {
370 vapier 1.119 local exe="touch"
371 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
372     local topdir=$1
373 mr_bones_ 1.100
374 vapier 1.194 if [[ -z ${topdir} ]] ; then
375     [[ -z ${T} ]] \
376 vapier 1.117 && topdir="/tmp" \
377 vapier 1.194 || topdir=${T}
378 vapier 1.117 fi
379    
380 vapier 1.194 if [[ -z $(type -p mktemp) ]] ; then
381 vapier 1.117 local tmp=/
382 vapier 1.194 while [[ -e ${tmp} ]] ; do
383     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
384 vapier 1.117 done
385 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
386 vapier 1.117 echo "${tmp}"
387 vapier 1.52 else
388 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
389     [[ ${USERLAND} == "GNU" ]] \
390     && exe="-p" \
391     || exe="-t"
392     else
393     [[ ${USERLAND} == "GNU" ]] \
394     && exe="-d" \
395     || exe="-dt"
396     fi
397     TMPDIR="${topdir}" mktemp ${exe} tmp
398 vapier 1.52 fi
399     }
400    
401 ka0ttic 1.108 # Small wrapper for getent (Linux), nidump (Mac OS X),
402     # and pw (FreeBSD) used in enewuser()/enewgroup()
403 usata 1.91 # Joe Jezak <josejx@gmail.com> and usata@gentoo.org
404 ka0ttic 1.108 # FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
405 usata 1.91 #
406     # egetent(database, key)
407     egetent() {
408 flameeyes 1.205 case ${CHOST} in
409     *-darwin*)
410 usata 1.91 case "$2" in
411 flameeyes 1.205 *[!0-9]*) # Non numeric
412 usata 1.91 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
413     ;;
414 flameeyes 1.205 *) # Numeric
415 usata 1.91 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
416     ;;
417     esac
418 flameeyes 1.205 ;;
419 flameeyes 1.220 *-freebsd*|*-dragonfly*)
420 ka0ttic 1.203 local opts action="user"
421     [[ $1 == "passwd" ]] || action="group"
422    
423     # lookup by uid/gid
424     if [[ $2 == [[:digit:]]* ]] ; then
425     [[ ${action} == "user" ]] && opts="-u" || opts="-g"
426 ka0ttic 1.108 fi
427 ka0ttic 1.203
428     pw show ${action} ${opts} "$2" -q
429 flameeyes 1.205 ;;
430 flameeyes 1.218 *-netbsd*|*-openbsd*)
431 flameeyes 1.206 grep "$2:\*:" /etc/$1
432     ;;
433 flameeyes 1.205 *)
434     type -p nscd >& /dev/null && nscd -i "$1"
435 vapier 1.107 getent "$1" "$2"
436 flameeyes 1.205 ;;
437     esac
438 usata 1.91 }
439    
440 vapier 1.23 # Simplify/standardize adding users to the system
441     # vapier@gentoo.org
442     #
443     # enewuser(username, uid, shell, homedir, groups, extra options)
444     #
445     # Default values if you do not specify any:
446     # username: REQUIRED !
447     # uid: next available (see useradd(8))
448 vapier 1.27 # note: pass -1 to get default behavior
449 vapier 1.23 # shell: /bin/false
450     # homedir: /dev/null
451     # groups: none
452     # extra: comment of 'added by portage for ${PN}'
453     enewuser() {
454     # get the username
455 vapier 1.182 local euser=$1; shift
456     if [[ -z ${euser} ]] ; then
457 vapier 1.23 eerror "No username specified !"
458     die "Cannot call enewuser without a username"
459     fi
460    
461 vapier 1.84 # lets see if the username already exists
462 vapier 1.182 if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then
463 vapier 1.23 return 0
464     fi
465 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
466 vapier 1.23
467     # options to pass to useradd
468 azarah 1.59 local opts=
469 vapier 1.23
470     # handle uid
471 vapier 1.182 local euid=$1; shift
472     if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then
473     if [[ ${euid} -gt 0 ]] ; then
474     if [[ ! -z $(egetent passwd ${euid}) ]] ; then
475 vapier 1.84 euid="next"
476 vapier 1.82 fi
477 vapier 1.23 else
478     eerror "Userid given but is not greater than 0 !"
479     die "${euid} is not a valid UID"
480     fi
481     else
482 vapier 1.84 euid="next"
483     fi
484 vapier 1.182 if [[ ${euid} == "next" ]] ; then
485 flameeyes 1.197 for euid in $(seq 101 999) ; do
486 vapier 1.182 [[ -z $(egetent passwd ${euid}) ]] && break
487 vapier 1.84 done
488 vapier 1.23 fi
489 vapier 1.84 opts="${opts} -u ${euid}"
490 vapier 1.23 einfo " - Userid: ${euid}"
491    
492     # handle shell
493 vapier 1.182 local eshell=$1; shift
494     if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
495 vapier 1.221 if [[ ! -e ${ROOT}${eshell} ]] ; then
496 vapier 1.23 eerror "A shell was specified but it does not exist !"
497 vapier 1.221 die "${eshell} does not exist in ${ROOT}"
498     fi
499     if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
500     eerror "Do not specify ${eshell} yourself, use -1"
501     die "Pass '-1' as the shell parameter"
502 vapier 1.23 fi
503     else
504 vapier 1.204 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
505     [[ -x ${ROOT}${shell} ]] && break
506 flameeyes 1.198 done
507    
508 vapier 1.204 if [[ ${shell} == "/dev/null" ]] ; then
509 flameeyes 1.198 eerror "Unable to identify the shell to use"
510     die "Unable to identify the shell to use"
511     fi
512    
513     eshell=${shell}
514 vapier 1.23 fi
515     einfo " - Shell: ${eshell}"
516     opts="${opts} -s ${eshell}"
517    
518     # handle homedir
519 vapier 1.182 local ehome=$1; shift
520     if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
521 azarah 1.59 ehome="/dev/null"
522 vapier 1.23 fi
523     einfo " - Home: ${ehome}"
524     opts="${opts} -d ${ehome}"
525    
526     # handle groups
527 vapier 1.182 local egroups=$1; shift
528     if [[ ! -z ${egroups} ]] ; then
529     local oldifs=${IFS}
530 vapier 1.107 local defgroup="" exgroups=""
531    
532 vapier 1.23 export IFS=","
533 vapier 1.182 for g in ${egroups} ; do
534     export IFS=${oldifs}
535     if [[ -z $(egetent group "${g}") ]] ; then
536 vapier 1.85 eerror "You must add group ${g} to the system first"
537 vapier 1.23 die "${g} is not a valid GID"
538     fi
539 vapier 1.182 if [[ -z ${defgroup} ]] ; then
540     defgroup=${g}
541 vapier 1.107 else
542     exgroups="${exgroups},${g}"
543     fi
544 usata 1.115 export IFS=","
545 vapier 1.23 done
546 vapier 1.182 export IFS=${oldifs}
547 vapier 1.107
548     opts="${opts} -g ${defgroup}"
549 vapier 1.182 if [[ ! -z ${exgroups} ]] ; then
550 vapier 1.107 opts="${opts} -G ${exgroups:1}"
551     fi
552 vapier 1.23 else
553     egroups="(none)"
554     fi
555     einfo " - Groups: ${egroups}"
556    
557     # handle extra and add the user
558 vapier 1.182 local oldsandbox=${SANDBOX_ON}
559 vapier 1.23 export SANDBOX_ON="0"
560 flameeyes 1.205 case ${CHOST} in
561     *-darwin*)
562 usata 1.91 ### Make the user
563 vapier 1.182 if [[ -z $@ ]] ; then
564 usata 1.91 dscl . create /users/${euser} uid ${euid}
565     dscl . create /users/${euser} shell ${eshell}
566     dscl . create /users/${euser} home ${ehome}
567     dscl . create /users/${euser} realname "added by portage for ${PN}"
568     ### Add the user to the groups specified
569 vapier 1.182 local oldifs=${IFS}
570 usata 1.115 export IFS=","
571 vapier 1.182 for g in ${egroups} ; do
572 usata 1.91 dscl . merge /groups/${g} users ${euser}
573     done
574 vapier 1.182 export IFS=${oldifs}
575 usata 1.91 else
576 vapier 1.182 einfo "Extra options are not supported on Darwin yet"
577 usata 1.91 einfo "Please report the ebuild along with the info below"
578 vapier 1.182 einfo "eextra: $@"
579 usata 1.91 die "Required function missing"
580     fi
581 vapier 1.182 ;;
582 flameeyes 1.220 *-freebsd*|*-dragonfly*)
583 vapier 1.182 if [[ -z $@ ]] ; then
584 ka0ttic 1.108 pw useradd ${euser} ${opts} \
585     -c "added by portage for ${PN}" \
586     die "enewuser failed"
587     else
588 vapier 1.182 einfo " - Extra: $@"
589 ka0ttic 1.108 pw useradd ${euser} ${opts} \
590 vapier 1.182 "$@" || die "enewuser failed"
591 ka0ttic 1.108 fi
592 vapier 1.182 ;;
593 flameeyes 1.207
594     *-netbsd*)
595     if [[ -z $@ ]] ; then
596     useradd ${opts} ${euser} || die "enewuser failed"
597     else
598     einfo " - Extra: $@"
599     useradd ${opts} ${euser} "$@" || die "enewuser failed"
600     fi
601     ;;
602 flameeyes 1.218
603     *-openbsd*)
604     if [[ -z $@ ]] ; then
605     useradd -u ${euid} -s ${eshell} \
606     -d ${ehome} -c "Added by portage for ${PN}" \
607     -g ${egroups} ${euser} || die "enewuser failed"
608     else
609     einfo " - Extra: $@"
610     useradd -u ${euid} -s ${eshell} \
611     -d ${ehome} -c "Added by portage for ${PN}" \
612     -g ${egroups} ${euser} "$@" || die "enewuser failed"
613     fi
614     ;;
615    
616 vapier 1.182 *)
617     if [[ -z $@ ]] ; then
618 usata 1.91 useradd ${opts} ${euser} \
619     -c "added by portage for ${PN}" \
620     || die "enewuser failed"
621     else
622 vapier 1.182 einfo " - Extra: $@"
623     useradd ${opts} ${euser} "$@" \
624 usata 1.91 || die "enewuser failed"
625     fi
626 vapier 1.182 ;;
627     esac
628 vapier 1.23
629 vapier 1.193 if [[ ! -e ${ROOT}/${ehome} ]] ; then
630     einfo " - Creating ${ehome} in ${ROOT}"
631     mkdir -p "${ROOT}/${ehome}"
632     chown ${euser} "${ROOT}/${ehome}"
633     chmod 755 "${ROOT}/${ehome}"
634 vapier 1.23 fi
635 vapier 1.193
636     export SANDBOX_ON=${oldsandbox}
637 vapier 1.23 }
638    
639     # Simplify/standardize adding groups to the system
640     # vapier@gentoo.org
641     #
642     # enewgroup(group, gid)
643     #
644     # Default values if you do not specify any:
645     # groupname: REQUIRED !
646     # gid: next available (see groupadd(8))
647     # extra: none
648     enewgroup() {
649     # get the group
650     local egroup="$1"; shift
651 azarah 1.59 if [ -z "${egroup}" ]
652     then
653 vapier 1.23 eerror "No group specified !"
654     die "Cannot call enewgroup without a group"
655     fi
656    
657     # see if group already exists
658 usata 1.91 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
659 azarah 1.59 then
660 vapier 1.23 return 0
661     fi
662 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
663 vapier 1.23
664     # options to pass to useradd
665 azarah 1.59 local opts=
666 vapier 1.23
667     # handle gid
668     local egid="$1"; shift
669 azarah 1.59 if [ ! -z "${egid}" ]
670     then
671     if [ "${egid}" -gt 0 ]
672     then
673 usata 1.91 if [ -z "`egetent group ${egid}`" ]
674 vapier 1.83 then
675 flameeyes 1.205 if [[ "${CHOST}" == *-darwin* ]]; then
676 usata 1.91 opts="${opts} ${egid}"
677     else
678     opts="${opts} -g ${egid}"
679     fi
680 vapier 1.83 else
681 vapier 1.84 egid="next available; requested gid taken"
682 vapier 1.83 fi
683 vapier 1.23 else
684     eerror "Groupid given but is not greater than 0 !"
685     die "${egid} is not a valid GID"
686     fi
687     else
688     egid="next available"
689     fi
690     einfo " - Groupid: ${egid}"
691    
692     # handle extra
693     local eextra="$@"
694     opts="${opts} ${eextra}"
695    
696     # add the group
697 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
698 vapier 1.23 export SANDBOX_ON="0"
699 flameeyes 1.205 case ${CHOST} in
700     *-darwin*)
701 usata 1.91 if [ ! -z "${eextra}" ];
702     then
703 vapier 1.179 einfo "Extra options are not supported on Darwin/OS X yet"
704 usata 1.91 einfo "Please report the ebuild along with the info below"
705     einfo "eextra: ${eextra}"
706     die "Required function missing"
707     fi
708 mr_bones_ 1.100
709 usata 1.91 # If we need the next available
710     case ${egid} in
711 flameeyes 1.205 *[!0-9]*) # Non numeric
712 flameeyes 1.197 for egid in $(seq 101 999); do
713 usata 1.91 [ -z "`egetent group ${egid}`" ] && break
714     done
715     esac
716     dscl . create /groups/${egroup} gid ${egid}
717 mr_bones_ 1.100 dscl . create /groups/${egroup} passwd '*'
718 flameeyes 1.205 ;;
719    
720 flameeyes 1.220 *-freebsd*|*-dragonfly*)
721 ka0ttic 1.108 case ${egid} in
722     *[!0-9]*) # Non numeric
723 flameeyes 1.197 for egid in $(seq 101 999); do
724 ka0ttic 1.108 [ -z "`egetent group ${egid}`" ] && break
725     done
726     esac
727     pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
728 flameeyes 1.205 ;;
729 flameeyes 1.206
730     *-netbsd*)
731     case ${egid} in
732     *[!0-9]*) # Non numeric
733     for egid in $(seq 101 999); do
734     [ -z "`egetent group ${egid}`" ] && break
735     done
736     esac
737 flameeyes 1.207 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
738 flameeyes 1.206 ;;
739    
740 flameeyes 1.205 *)
741 usata 1.91 groupadd ${opts} ${egroup} || die "enewgroup failed"
742 flameeyes 1.205 ;;
743     esac
744 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
745 vapier 1.24 }
746    
747     # Simple script to replace 'dos2unix' binaries
748     # vapier@gentoo.org
749     #
750 vapier 1.121 # edos2unix(file, <more files> ...)
751 vapier 1.24 edos2unix() {
752 vapier 1.61 for f in "$@"
753 azarah 1.59 do
754 vapier 1.61 cp "${f}" ${T}/edos2unix
755     sed 's/\r$//' ${T}/edos2unix > "${f}"
756 vapier 1.24 done
757 vapier 1.39 }
758    
759 lanius 1.133
760     ##############################################################
761     # START: Handle .desktop files and menu entries #
762     # maybe this should be separated into a new eclass some time #
763     # lanius@gentoo.org #
764     ##############################################################
765    
766 vapier 1.39 # Make a desktop file !
767     # Great for making those icons in kde/gnome startmenu !
768     # Amaze your friends ! Get the women ! Join today !
769     #
770     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
771     #
772     # binary: what binary does the app run with ?
773     # name: the name that will show up in the menu
774     # icon: give your little like a pretty little icon ...
775 vapier 1.118 # this can be relative (to /usr/share/pixmaps) or
776     # a full path to an icon
777 vapier 1.39 # type: what kind of application is this ? for categories:
778 vapier 1.192 # http://www.freedesktop.org/Standards/desktop-entry-spec
779 vapier 1.39 # path: if your app needs to startup in a specific dir
780     make_desktop_entry() {
781 vapier 1.158 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
782 vapier 1.39
783 vapier 1.158 local exec=${1}
784     local name=${2:-${PN}}
785     local icon=${3:-${PN}.png}
786     local type=${4}
787     local path=${5}
788    
789     if [[ -z ${type} ]] ; then
790     local catmaj=${CATEGORY%%-*}
791     local catmin=${CATEGORY##*-}
792     case ${catmaj} in
793     app)
794     case ${catmin} in
795     admin) type=System;;
796     cdr) type=DiscBurning;;
797     dicts) type=Dictionary;;
798     editors) type=TextEditor;;
799     emacs) type=TextEditor;;
800     emulation) type=Emulator;;
801     laptop) type=HardwareSettings;;
802     office) type=Office;;
803     vim) type=TextEditor;;
804     xemacs) type=TextEditor;;
805     *) type=;;
806     esac
807 azarah 1.59 ;;
808 vapier 1.158
809     dev)
810 vapier 1.159 type="Development"
811 vapier 1.158 ;;
812    
813     games)
814     case ${catmin} in
815     action) type=ActionGame;;
816     arcade) type=ArcadeGame;;
817     board) type=BoardGame;;
818     kid) type=KidsGame;;
819     emulation) type=Emulator;;
820     puzzle) type=LogicGame;;
821     rpg) type=RolePlaying;;
822     roguelike) type=RolePlaying;;
823     simulation) type=Simulation;;
824     sports) type=SportsGame;;
825     strategy) type=StrategyGame;;
826     *) type=;;
827     esac
828 vapier 1.159 type="Game;${type}"
829 vapier 1.158 ;;
830    
831     mail)
832 vapier 1.159 type="Network;Email"
833 vapier 1.158 ;;
834    
835     media)
836     case ${catmin} in
837     gfx) type=Graphics;;
838     radio) type=Tuner;;
839     sound) type=Audio;;
840     tv) type=TV;;
841     video) type=Video;;
842     *) type=;;
843     esac
844 vapier 1.159 type="AudioVideo;${type}"
845 wolf31o2 1.65 ;;
846 vapier 1.158
847     net)
848     case ${catmin} in
849     dialup) type=Dialup;;
850     ftp) type=FileTransfer;;
851     im) type=InstantMessaging;;
852     irc) type=IRCClient;;
853     mail) type=Email;;
854     news) type=News;;
855     nntp) type=News;;
856     p2p) type=FileTransfer;;
857     *) type=;;
858     esac
859 vapier 1.159 type="Network;${type}"
860 vapier 1.158 ;;
861    
862     sci)
863     case ${catmin} in
864 mr_bones_ 1.216 astro*) type=Astronomy;;
865 vapier 1.158 bio*) type=Biology;;
866     calc*) type=Calculator;;
867     chem*) type=Chemistry;;
868     geo*) type=Geology;;
869     math*) type=Math;;
870     *) type=;;
871 vapier 1.159 esac
872     type="Science;${type}"
873 vapier 1.158 ;;
874    
875     www)
876     case ${catmin} in
877     client) type=WebBrowser;;
878     *) type=;;
879     esac
880 vapier 1.159 type="Network"
881 azarah 1.59 ;;
882 vapier 1.158
883 azarah 1.59 *)
884     type=
885     ;;
886 vapier 1.39 esac
887     fi
888 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
889     local desktop_name="${PN}"
890     else
891     local desktop_name="${PN}-${SLOT}"
892     fi
893     local desktop=${T}/${exec%% *}-${desktop_name}.desktop
894 vapier 1.39
895     echo "[Desktop Entry]
896     Encoding=UTF-8
897     Version=0.9.2
898     Name=${name}
899     Type=Application
900     Comment=${DESCRIPTION}
901     Exec=${exec}
902     Path=${path}
903     Icon=${icon}
904 vapier 1.99 Categories=Application;${type};" > "${desktop}"
905 vapier 1.39
906 vapier 1.204 (
907     # wrap the env here so that the 'insinto' call
908     # doesn't corrupt the env of the caller
909     insinto /usr/share/applications
910     doins "${desktop}"
911     )
912 danarmak 1.32 }
913    
914 lanius 1.133 # Make a GDM/KDM Session file
915     #
916     # make_desktop_entry(<title>, <command>)
917     # title: File to execute to start the Window Manager
918     # command: Name of the Window Manager
919    
920     make_session_desktop() {
921 vapier 1.167 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
922     [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
923 lanius 1.133
924 vapier 1.167 local title=$1
925     local command=$2
926     local desktop=${T}/${wm}.desktop
927 lanius 1.133
928     echo "[Desktop Entry]
929     Encoding=UTF-8
930     Name=${title}
931     Comment=This session logs you into ${title}
932     Exec=${command}
933     TryExec=${command}
934     Type=Application" > "${desktop}"
935    
936     insinto /usr/share/xsessions
937     doins "${desktop}"
938     }
939    
940     domenu() {
941 vapier 1.167 local i j
942 lanius 1.133 insinto /usr/share/applications
943 vapier 1.167 for i in "$@" ; do
944     if [[ -f ${i} ]] ; then
945     doins "${i}"
946     elif [[ -d ${i} ]] ; then
947     for j in "${i}"/*.desktop ; do
948     doins "${j}"
949 lanius 1.133 done
950 swegener 1.190 fi
951 lanius 1.133 done
952     }
953 vapier 1.167 newmenu() {
954     insinto /usr/share/applications
955     newins "$1" "$2"
956     }
957 lanius 1.133
958     doicon() {
959 vapier 1.167 local i j
960 lanius 1.133 insinto /usr/share/pixmaps
961 vapier 1.167 for i in "$@" ; do
962     if [[ -f ${i} ]] ; then
963     doins "${i}"
964     elif [[ -d ${i} ]] ; then
965     for j in "${i}"/*.png ; do
966     doins "${j}"
967 lanius 1.133 done
968 swegener 1.190 fi
969 lanius 1.133 done
970     }
971 vapier 1.167 newicon() {
972     insinto /usr/share/pixmaps
973     newins "$1" "$2"
974     }
975 lanius 1.133
976     ##############################################################
977     # END: Handle .desktop files and menu entries #
978     ##############################################################
979    
980    
981 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
982     find_unpackable_file() {
983 vapier 1.196 local src=$1
984     if [[ -z ${src} ]] ; then
985     src=${DISTDIR}/${A}
986 vapier 1.50 else
987 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
988     src=${DISTDIR}/${src}
989     elif [[ -e ${PWD}/${src} ]] ; then
990     src=${PWD}/${src}
991     elif [[ -e ${src} ]] ; then
992     src=${src}
993 vapier 1.50 fi
994     fi
995 vapier 1.196 [[ ! -e ${src} ]] && return 1
996 vapier 1.70 echo "${src}"
997     }
998    
999     # Unpack those pesky pdv generated files ...
1000     # They're self-unpacking programs with the binary package stuffed in
1001     # the middle of the archive. Valve seems to use it a lot ... too bad
1002     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1003     #
1004     # Usage: unpack_pdv [file to unpack] [size of off_t]
1005     # - you have to specify the off_t size ... i have no idea how to extract that
1006     # information out of the binary executable myself. basically you pass in
1007     # the size of the off_t type (in bytes) on the machine that built the pdv
1008     # archive. one way to determine this is by running the following commands:
1009     # strings <pdv archive> | grep lseek
1010     # strace -elseek <pdv archive>
1011     # basically look for the first lseek command (we do the strings/grep because
1012     # sometimes the function call is _llseek or something) and steal the 2nd
1013     # parameter. here is an example:
1014     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1015     # lseek
1016     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1017     # lseek(3, -4, SEEK_END) = 2981250
1018     # thus we would pass in the value of '4' as the second parameter.
1019     unpack_pdv() {
1020 vapier 1.196 local src=$(find_unpackable_file $1)
1021     local sizeoff_t=$2
1022 vapier 1.70
1023 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1024     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1025 vapier 1.70
1026 vapier 1.212 local shrtsrc=$(basename "${src}")
1027 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1028     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1029     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1030    
1031     # grab metadata for debug reasons
1032 vapier 1.117 local metafile="$(emktemp)"
1033 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1034    
1035     # rip out the final file name from the metadata
1036     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1037     datafile="`basename ${datafile}`"
1038    
1039 vapier 1.71 # now lets uncompress/untar the file if need be
1040 vapier 1.117 local tmpfile="$(emktemp)"
1041 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1042 vapier 1.71
1043     local iscompressed="`file -b ${tmpfile}`"
1044     if [ "${iscompressed:0:8}" == "compress" ] ; then
1045     iscompressed=1
1046     mv ${tmpfile}{,.Z}
1047     gunzip ${tmpfile}
1048     else
1049     iscompressed=0
1050     fi
1051     local istar="`file -b ${tmpfile}`"
1052     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1053     istar=1
1054     else
1055     istar=0
1056     fi
1057    
1058     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1059     #dd if=${src} ibs=${metaskip} count=1 \
1060     # | dd ibs=${tailskip} skip=1 \
1061     # | gzip -dc \
1062     # > ${datafile}
1063     if [ ${iscompressed} -eq 1 ] ; then
1064     if [ ${istar} -eq 1 ] ; then
1065     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1066     | head -c $((${metaskip}-${tailskip})) \
1067     | tar -xzf -
1068     else
1069 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1070     | head -c $((${metaskip}-${tailskip})) \
1071     | gzip -dc \
1072     > ${datafile}
1073 vapier 1.71 fi
1074     else
1075     if [ ${istar} -eq 1 ] ; then
1076     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1077     | head -c $((${metaskip}-${tailskip})) \
1078 vapier 1.73 | tar --no-same-owner -xf -
1079 vapier 1.71 else
1080 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1081     | head -c $((${metaskip}-${tailskip})) \
1082     > ${datafile}
1083 vapier 1.71 fi
1084     fi
1085     true
1086     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1087 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1088     }
1089    
1090     # Unpack those pesky makeself generated files ...
1091     # They're shell scripts with the binary package tagged onto
1092     # the end of the archive. Loki utilized the format as does
1093     # many other game companies.
1094     #
1095 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1096 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1097     # - If the offset is not specified then we will attempt to extract
1098     # the proper offset from the script itself.
1099     unpack_makeself() {
1100 vapier 1.217 local src_input=${1:-${A}}
1101     local src=$(find_unpackable_file "${src_input}")
1102 vapier 1.196 local skip=$2
1103     local exe=$3
1104    
1105 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1106 vapier 1.50
1107 vapier 1.196 local shrtsrc=$(basename "${src}")
1108 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1109 vapier 1.212 if [[ -z ${skip} ]] ; then
1110     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1111 vapier 1.41 local skip=0
1112 vapier 1.112 exe=tail
1113 vapier 1.41 case ${ver} in
1114     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1115 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1116 vapier 1.41 ;;
1117     2.0|2.0.1)
1118 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1119 vapier 1.41 ;;
1120 wolf31o2 1.48 2.1.1)
1121 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1122 wolf31o2 1.48 let skip="skip + 1"
1123     ;;
1124 vapier 1.49 2.1.2)
1125 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1126 vapier 1.49 let skip="skip + 1"
1127     ;;
1128 wolf31o2 1.48 2.1.3)
1129 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1130 vapier 1.41 let skip="skip + 1"
1131     ;;
1132 wolf31o2 1.211 2.1.4|2.1.5)
1133 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1134     skip=$(head -n ${skip} "${src}" | wc -c)
1135     exe="dd"
1136     ;;
1137 vapier 1.41 *)
1138     eerror "I'm sorry, but I was unable to support the Makeself file."
1139     eerror "The version I detected was '${ver}'."
1140     eerror "Please file a bug about the file ${shrtsrc} at"
1141     eerror "http://bugs.gentoo.org/ so that support can be added."
1142     die "makeself version '${ver}' not supported"
1143     ;;
1144     esac
1145     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1146     fi
1147 vapier 1.112 case ${exe} in
1148     tail) exe="tail -n +${skip} '${src}'";;
1149     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1150     *) die "makeself cant handle exe '${exe}'"
1151     esac
1152 vapier 1.41
1153 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1154 vapier 1.117 local tmpfile="$(emktemp)"
1155 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1156     local filetype="$(file -b "${tmpfile}")"
1157 vapier 1.68 case ${filetype} in
1158     *tar\ archive)
1159 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1160 vapier 1.68 ;;
1161     bzip2*)
1162 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1163 mr_bones_ 1.69 ;;
1164 vapier 1.68 gzip*)
1165 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1166 vapier 1.68 ;;
1167 vapier 1.93 compress*)
1168 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1169 vapier 1.93 ;;
1170 vapier 1.68 *)
1171 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1172 vapier 1.68 false
1173     ;;
1174     esac
1175     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1176 wolf31o2 1.56 }
1177    
1178     # Display a license for user to accept.
1179     #
1180     # Usage: check_license [license]
1181     # - If the file is not specified then ${LICENSE} is used.
1182     check_license() {
1183 vapier 1.60 local lic=$1
1184     if [ -z "${lic}" ] ; then
1185     lic="${PORTDIR}/licenses/${LICENSE}"
1186 wolf31o2 1.56 else
1187 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1188     lic="${PORTDIR}/licenses/${lic}"
1189     elif [ -e "${PWD}/${lic}" ] ; then
1190     lic="${PWD}/${lic}"
1191     elif [ -e "${lic}" ] ; then
1192     lic="${lic}"
1193 wolf31o2 1.56 fi
1194     fi
1195 wolf31o2 1.200 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1196 vapier 1.64 local l="`basename ${lic}`"
1197 wolf31o2 1.56
1198 vapier 1.60 # here is where we check for the licenses the user already
1199     # accepted ... if we don't find a match, we make the user accept
1200 wolf31o2 1.106 local shopts=$-
1201 vapier 1.60 local alic
1202 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1203 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1204 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1205     set +o noglob; set -${shopts} #reset old shell opts
1206     return 0
1207     fi
1208 vapier 1.60 done
1209 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1210 vapier 1.60
1211 vapier 1.117 local licmsg="$(emktemp)"
1212 vapier 1.60 cat << EOF > ${licmsg}
1213     **********************************************************
1214     The following license outlines the terms of use of this
1215     package. You MUST accept this license for installation to
1216     continue. When you are done viewing, hit 'q'. If you
1217     CTRL+C out of this, the install will not run!
1218     **********************************************************
1219    
1220     EOF
1221     cat ${lic} >> ${licmsg}
1222     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1223 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1224 vapier 1.60 read alic
1225     case ${alic} in
1226     yes|Yes|y|Y)
1227     return 0
1228     ;;
1229     *)
1230     echo;echo;echo
1231     eerror "You MUST accept the license to continue! Exiting!"
1232     die "Failed to accept license"
1233     ;;
1234     esac
1235 vapier 1.23 }
1236 vapier 1.75
1237     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1238     # the whole 'non-interactive' policy, but damnit I want CD support !
1239     #
1240     # with these cdrom functions we handle all the user interaction and
1241     # standardize everything. all you have to do is call cdrom_get_cds()
1242     # and when the function returns, you can assume that the cd has been
1243     # found at CDROM_ROOT.
1244     #
1245     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1246     # etc... if you want to give the cds better names, then just export
1247     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1248     #
1249     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1250     #
1251     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1252     # - this will attempt to locate a cd based upon a file that is on
1253     # the cd ... the more files you give this function, the more cds
1254     # the cdrom functions will handle
1255     cdrom_get_cds() {
1256     # first we figure out how many cds we're dealing with by
1257     # the # of files they gave us
1258     local cdcnt=0
1259     local f=
1260     for f in "$@" ; do
1261 vapier 1.214 ((++cdcnt))
1262 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1263     done
1264     export CDROM_TOTAL_CDS=${cdcnt}
1265     export CDROM_CURRENT_CD=1
1266    
1267     # now we see if the user gave use CD_ROOT ...
1268     # if they did, let's just believe them that it's correct
1269 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1270 vapier 1.75 local var=
1271     cdcnt=0
1272 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1273 vapier 1.214 ((++cdcnt))
1274 vapier 1.75 var="CD_ROOT_${cdcnt}"
1275 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1276 vapier 1.131 if [[ -z ${!var} ]] ; then
1277 vapier 1.75 eerror "You must either use just the CD_ROOT"
1278     eerror "or specify ALL the CD_ROOT_X variables."
1279     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1280     die "could not locate CD_ROOT_${cdcnt}"
1281     fi
1282     done
1283 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1284 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1285 vapier 1.215 export CDROM_SET=-1
1286     for f in ${CDROM_CHECK_1//:/ } ; do
1287     ((++CDROM_SET))
1288     [[ -e ${CD_ROOT}/${f} ]] && break
1289     done
1290     export CDROM_MATCH=${f}
1291 vapier 1.75 return
1292     fi
1293    
1294 vapier 1.215 # User didn't help us out so lets make sure they know they can
1295     # simplify the whole process ...
1296 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1297 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1298 vapier 1.75 echo
1299     einfo "If you do not have the CD, but have the data files"
1300     einfo "mounted somewhere on your filesystem, just export"
1301     einfo "the variable CD_ROOT so that it points to the"
1302     einfo "directory containing the files."
1303     echo
1304 vapier 1.132 einfo "For example:"
1305     einfo "export CD_ROOT=/mnt/cdrom"
1306     echo
1307 vapier 1.75 else
1308     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1309     cdcnt=0
1310 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1311 vapier 1.214 ((++cdcnt))
1312 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1313 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1314 vapier 1.75 done
1315     echo
1316     einfo "If you do not have the CDs, but have the data files"
1317     einfo "mounted somewhere on your filesystem, just export"
1318     einfo "the following variables so they point to the right place:"
1319     einfon ""
1320     cdcnt=0
1321 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1322 vapier 1.214 ((++cdcnt))
1323 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1324     done
1325     echo
1326     einfo "Or, if you have all the files in the same place, or"
1327     einfo "you only have one cdrom, you can export CD_ROOT"
1328     einfo "and that place will be used as the same data source"
1329     einfo "for all the CDs."
1330     echo
1331 vapier 1.132 einfo "For example:"
1332     einfo "export CD_ROOT_1=/mnt/cdrom"
1333     echo
1334 vapier 1.75 fi
1335 vapier 1.215
1336 vapier 1.214 export CDROM_SET=""
1337 vapier 1.75 export CDROM_CURRENT_CD=0
1338     cdrom_load_next_cd
1339     }
1340    
1341     # this is only used when you need access to more than one cd.
1342     # when you have finished using the first cd, just call this function.
1343     # when it returns, CDROM_ROOT will be pointing to the second cd.
1344     # remember, you can only go forward in the cd chain, you can't go back.
1345     cdrom_load_next_cd() {
1346 vapier 1.215 local var
1347     ((++CDROM_CURRENT_CD))
1348 vapier 1.79
1349 vapier 1.75 unset CDROM_ROOT
1350 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1351     [[ -z ${!var} ]] && var="CD_ROOT"
1352 vapier 1.131 if [[ -z ${!var} ]] ; then
1353 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1354 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1355 vapier 1.75 else
1356 vapier 1.131 export CDROM_ROOT=${!var}
1357 vapier 1.75 fi
1358    
1359     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1360     }
1361    
1362     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1363     # functions. this should *never* be called from an ebuild.
1364     # all it does is try to locate a give file on a cd ... if the cd isn't
1365     # found, then a message asking for the user to insert the cdrom will be
1366     # displayed and we'll hang out here until:
1367     # (1) the file is found on a mounted cdrom
1368     # (2) the user hits CTRL+C
1369 vapier 1.215 _cdrom_locate_file_on_cd() {
1370 vapier 1.214 local mline=""
1371     local showedmsg=0
1372    
1373 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1374 vapier 1.214 local i=0
1375     local -a cdset=(${*//:/ })
1376     if [[ -n ${CDROM_SET} ]] ; then
1377     cdset=(${cdset[${CDROM_SET}]})
1378     fi
1379    
1380     while [[ -n ${cdset[${i}]} ]] ; do
1381     local dir=$(dirname ${cdset[${i}]})
1382     local file=$(basename ${cdset[${i}]})
1383    
1384     for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do
1385     [[ -d ${mline}/${dir} ]] || continue
1386     if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then
1387     export CDROM_ROOT=${mline}
1388     export CDROM_SET=${i}
1389     export CDROM_MATCH=${cdset[${i}]}
1390     return
1391     fi
1392     done
1393    
1394     ((++i))
1395 vapier 1.75 done
1396    
1397 vapier 1.214 echo
1398     if [[ ${showedmsg} -eq 0 ]] ; then
1399     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1400     if [[ -z ${CDROM_NAME} ]] ; then
1401     einfo "Please insert+mount the cdrom for ${PN} now !"
1402     else
1403     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1404     fi
1405     else
1406     if [[ -z ${CDROM_NAME_1} ]] ; then
1407     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1408 vapier 1.75 else
1409 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1410     einfo "Please insert+mount the ${!var} cdrom now !"
1411 vapier 1.75 fi
1412     fi
1413 vapier 1.214 showedmsg=1
1414 vapier 1.75 fi
1415 vapier 1.214 einfo "Press return to scan for the cd again"
1416     einfo "or hit CTRL+C to abort the emerge."
1417     echo
1418     einfo "If you are having trouble with the detection"
1419     einfo "of your CD, it is possible that you do not have"
1420     einfo "Joliet support enabled in your kernel. Please"
1421     einfo "check that CONFIG_JOLIET is enabled in your kernel."
1422 vapier 1.222 read || die "something is screwed with your system"
1423 vapier 1.75 done
1424     }
1425 vapier 1.92
1426 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1427 vapier 1.92 # a package can support
1428     #
1429     # usage: strip-linguas <allow LINGUAS>
1430     # strip-linguas -i <directories of .po files>
1431     # strip-linguas -u <directories of .po files>
1432     #
1433     # The first form allows you to specify a list of LINGUAS.
1434 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1435 vapier 1.92 # directories and uses the intersection of the lists.
1436 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1437 vapier 1.92 # directories and uses the union of the lists.
1438     strip-linguas() {
1439     local ls newls
1440 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1441     local op=$1; shift
1442 vapier 1.92 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1443     local d f
1444     for d in "$@" ; do
1445 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1446     newls=${ls}
1447 vapier 1.92 else
1448     newls=""
1449     fi
1450     for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1451 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1452     [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1453 vapier 1.92 else
1454 vapier 1.154 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1455 vapier 1.92 fi
1456     done
1457 vapier 1.154 ls=${newls}
1458 vapier 1.92 done
1459 vapier 1.154 ls=${ls//.po}
1460 vapier 1.92 else
1461 vapier 1.154 ls=$@
1462 vapier 1.92 fi
1463    
1464     ls=" ${ls} "
1465     newls=""
1466     for f in ${LINGUAS} ; do
1467 vapier 1.154 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1468 vapier 1.120 newls="${newls} ${f}"
1469 vapier 1.92 else
1470     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1471     fi
1472     done
1473 vapier 1.154 if [[ -z ${newls} ]] ; then
1474 vapier 1.166 export LINGUAS=""
1475 vapier 1.92 else
1476 vapier 1.154 export LINGUAS=${newls:1}
1477 vapier 1.92 fi
1478     }
1479 iggy 1.110
1480     # moved from kernel.eclass since they are generally useful outside of
1481     # kernel.eclass -iggy (20041002)
1482    
1483     # the following functions are useful in kernel module ebuilds, etc.
1484     # for an example see ivtv or drbd ebuilds
1485    
1486     # set's ARCH to match what the kernel expects
1487     set_arch_to_kernel() {
1488 vapier 1.140 i=10
1489     while ((i--)) ; do
1490     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1491     done
1492 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1493     case ${ARCH} in
1494 vapier 1.178 x86) export ARCH="i386";;
1495     amd64) export ARCH="x86_64";;
1496     hppa) export ARCH="parisc";;
1497     mips) export ARCH="mips";;
1498     sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1499     *) export ARCH="${ARCH}";;
1500 iggy 1.110 esac
1501     }
1502    
1503     # set's ARCH back to what portage expects
1504     set_arch_to_portage() {
1505 vapier 1.140 i=10
1506     while ((i--)) ; do
1507     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1508     done
1509 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1510     }
1511 eradicator 1.111
1512     # Jeremy Huddleston <eradicator@gentoo.org>:
1513     # preserve_old_lib /path/to/libblah.so.0
1514     # preserve_old_lib_notify /path/to/libblah.so.0
1515     #
1516     # These functions are useful when a lib in your package changes --soname. Such
1517     # an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1518     # would break packages that link against it. Most people get around this
1519     # by using the portage SLOT mechanism, but that is not always a relevant
1520     # solution, so instead you can add the following to your ebuilds:
1521     #
1522     # src_install() {
1523     # ...
1524     # preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1525     # ...
1526     # }
1527     #
1528     # pkg_postinst() {
1529     # ...
1530     # preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1531     # ...
1532     # }
1533    
1534     preserve_old_lib() {
1535     LIB=$1
1536    
1537     if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1538     SONAME=`basename ${LIB}`
1539     DIRNAME=`dirname ${LIB}`
1540    
1541     dodir ${DIRNAME}
1542     cp ${ROOT}${LIB} ${D}${DIRNAME}
1543     touch ${D}${LIB}
1544     fi
1545     }
1546    
1547     preserve_old_lib_notify() {
1548 seemant 1.134 LIB=$1
1549 eradicator 1.111
1550 seemant 1.134 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1551     SONAME=`basename ${LIB}`
1552 eradicator 1.111
1553 eradicator 1.191 ewarn "An old version of an installed library was detected on your system."
1554     ewarn "In order to avoid breaking packages that link against it, this older version"
1555     ewarn "is not being removed. In order to make full use of this newer version,"
1556     ewarn "you will need to execute the following command:"
1557     ewarn " revdep-rebuild --soname ${SONAME}"
1558     ewarn
1559     ewarn "After doing that, you can safely remove ${LIB}"
1560     ewarn "Note: 'emerge gentoolkit' to get revdep-rebuild"
1561 seemant 1.134 fi
1562 eradicator 1.111 }
1563 vapier 1.125
1564 ka0ttic 1.143 # Hack for people to figure out if a package was built with
1565 vapier 1.125 # certain USE flags
1566     #
1567 vapier 1.130 # Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1568 vapier 1.125 # ex: built_with_use xchat gtk2
1569 vapier 1.130 #
1570     # Flags: -a all USE flags should be utilized
1571     # -o at least one USE flag should be utilized
1572     # Note: the default flag is '-a'
1573 vapier 1.125 built_with_use() {
1574 vapier 1.130 local opt=$1
1575     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1576    
1577     local PKG=$(best_version $1)
1578     shift
1579    
1580 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1581    
1582     # if the USE file doesnt exist, assume the $PKG is either
1583     # injected or package.provided
1584     [[ ! -e ${USEFILE} ]] && return 0
1585 vapier 1.125
1586     local USE_BUILT=$(<${USEFILE})
1587 vapier 1.130 while [[ $# -gt 0 ]] ; do
1588     if [[ ${opt} = "-o" ]] ; then
1589     has $1 ${USE_BUILT} && return 0
1590     else
1591     has $1 ${USE_BUILT} || return 1
1592     fi
1593 vapier 1.125 shift
1594     done
1595 vapier 1.130 [[ ${opt} = "-a" ]]
1596 vapier 1.125 }
1597 vapier 1.126
1598 ka0ttic 1.143 # Many configure scripts wrongly bail when a C++ compiler
1599 vapier 1.126 # could not be detected. #73450
1600     epunt_cxx() {
1601 vapier 1.127 local dir=$1
1602     [[ -z ${dir} ]] && dir=${S}
1603     ebegin "Removing useless C++ checks"
1604     local f
1605     for f in $(find ${dir} -name configure) ; do
1606     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1607     done
1608     eend 0
1609 vapier 1.126 }
1610 ka0ttic 1.143
1611 vapier 1.151 # dopamd <file> [more files]
1612 ka0ttic 1.143 #
1613     # Install pam auth config file in /etc/pam.d
1614 vapier 1.151 dopamd() {
1615     [[ -z $1 ]] && die "dopamd requires at least one argument"
1616    
1617     use pam || return 0
1618    
1619 vapier 1.172 INSDESTTREE=/etc/pam.d \
1620 vapier 1.151 doins "$@" || die "failed to install $@"
1621     }
1622     # newpamd <old name> <new name>
1623 ka0ttic 1.143 #
1624 vapier 1.151 # Install pam file <old name> as <new name> in /etc/pam.d
1625     newpamd() {
1626     [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1627 ka0ttic 1.143
1628     use pam || return 0
1629    
1630 vapier 1.172 INSDESTTREE=/etc/pam.d \
1631 vapier 1.151 newins "$1" "$2" || die "failed to install $1 as $2"
1632 ka0ttic 1.143 }
1633 wolf31o2 1.160
1634     # make a wrapper script ...
1635     # NOTE: this was originally games_make_wrapper, but I noticed other places where
1636     # this could be used, so I have moved it here and made it not games-specific
1637     # -- wolf31o2
1638     # $1 == wrapper name
1639     # $2 == binary to run
1640     # $3 == directory to chdir before running binary
1641     # $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1642 wolf31o2 1.164 # $5 == path for wrapper
1643 wolf31o2 1.160 make_wrapper() {
1644 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1645 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1646 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1647     # things as $bin ... "./someprog --args"
1648 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1649     #!/bin/sh
1650 vapier 1.201 cd "${chdir:-.}"
1651 vapier 1.210 if [ -n "${libdir}" ] ; then
1652     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1653     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1654     else
1655     export LD_LIBRARY_PATH="${libdir}"
1656     fi
1657 vapier 1.201 fi
1658 vapier 1.202 exec ${bin} "\$@"
1659 wolf31o2 1.160 EOF
1660     chmod go+rx "${tmpwrapper}"
1661 vapier 1.201 if [[ -n ${path} ]] ; then
1662     exeinto "${path}"
1663 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1664     else
1665     newbin "${tmpwrapper}" "${wrapper}"
1666     fi
1667 wolf31o2 1.160 }

  ViewVC Help
Powered by ViewVC 1.1.20