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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.236 - (hide annotations) (download)
Sun Jun 4 13:25:04 2006 UTC (8 years, 6 months ago) by vapier
Branch: MAIN
Changes since 1.235: +8 -12 lines
some fixes by Harald van Dijk to use hasq() and some minor touchups #134600

1 vapier 1.236 # Copyright 1999-2006 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.236 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.235 2006/05/24 16:01:59 wolf31o2 Exp $
4 vapier 1.18 #
5 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
6 vapier 1.7 # have to implement themselves.
7 azarah 1.1 #
8     # NB: If you add anything, please comment it!
9    
10 flameeyes 1.197 inherit multilib portability
11 azarah 1.1
12 azarah 1.185 DEPEND="!bootstrap? ( sys-devel/patch )"
13 flameeyes 1.232 RDEPEND=""
14 azarah 1.181 # sys-apps/shadow is needed for useradd, etc, bug #94745.
15 azarah 1.1
16 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
17 azarah 1.1
18 ciaranm 1.98 # Wait for the supplied number of seconds. If no argument is supplied, defaults
19     # to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
20     # outputting to a terminal, don't wait. For compatability purposes, the argument
21     # must be an integer greater than zero.
22     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
23     epause() {
24     if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
25     sleep ${1:-5}
26     fi
27     }
28    
29     # Beep the specified number of times (defaults to five). If our output
30     # is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
31     # don't beep.
32     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
33     ebeep() {
34     local n
35     if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
36     for ((n=1 ; n <= ${1:-5} ; n++)) ; do
37     echo -ne "\a"
38     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
39     echo -ne "\a"
40     sleep 1
41     done
42     fi
43     }
44    
45 azarah 1.1 # This function generate linker scripts in /usr/lib for dynamic
46     # libs in /lib. This is to fix linking problems when you have
47     # the .so in /lib, and the .a in /usr/lib. What happens is that
48     # in some cases when linking dynamic, the .a in /usr/lib is used
49     # instead of the .so in /lib due to gcc/libtool tweaking ld's
50     # library search path. This cause many builds to fail.
51     # See bug #4411 for more info.
52     #
53     # To use, simply call:
54     #
55     # gen_usr_ldscript libfoo.so
56     #
57     # Note that you should in general use the unversioned name of
58     # the library, as ldconfig should usually update it correctly
59     # to point to the latest version of the library present.
60     #
61     # <azarah@gentoo.org> (26 Oct 2002)
62     #
63     gen_usr_ldscript() {
64 vapier 1.219 local lib libdir=$(get_libdir)
65 azarah 1.1 # Just make sure it exists
66 vapier 1.109 dodir /usr/${libdir}
67 danarmak 1.32
68 eradicator 1.163 for lib in "${@}" ; do
69     cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
70 vapier 1.161 /* GNU ld script
71 swegener 1.190 Since Gentoo has critical dynamic libraries
72     in /lib, and the static versions in /usr/lib,
73 vapier 1.161 we need to have a "fake" dynamic lib in /usr/lib,
74     otherwise we run into linking problems.
75 swegener 1.190
76 vapier 1.161 See bug http://bugs.gentoo.org/4411 for more info.
77     */
78 eradicator 1.163 GROUP ( /${libdir}/${lib} )
79 vapier 1.161 END_LDSCRIPT
80 vapier 1.219 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
81 vapier 1.161 done
82 azarah 1.2 }
83    
84    
85     # Default directory where patches are located
86     EPATCH_SOURCE="${WORKDIR}/patch"
87     # Default extension for patches
88     EPATCH_SUFFIX="patch.bz2"
89     # Default options for patch
90 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
91 vapier 1.170 # Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
92 vapier 1.230 # Set -E to automatically remove empty files.
93     EPATCH_OPTS="-g0 -E --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 swegener 1.231 _epatch_draw_line() {
142 agriffis 1.229 [[ -z $1 ]] && set "$(printf "%65s" '')"
143     echo "${1//?/=}"
144 vapier 1.219 }
145 vapier 1.208 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
146 azarah 1.2 local PIPE_CMD=""
147     local STDERR_TARGET="${T}/$$.out"
148 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
149     local PATCH_SUFFIX=""
150 azarah 1.3 local SINGLE_PATCH="no"
151 azarah 1.4 local x=""
152 azarah 1.3
153 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
154    
155 azarah 1.3 if [ "$#" -gt 1 ]
156     then
157 vapier 1.94 local m=""
158     for m in "$@" ; do
159     epatch "${m}"
160     done
161     return 0
162 azarah 1.3 fi
163    
164     if [ -n "$1" -a -f "$1" ]
165     then
166     SINGLE_PATCH="yes"
167 danarmak 1.32
168 azarah 1.4 local EPATCH_SOURCE="$1"
169     local EPATCH_SUFFIX="${1##*\.}"
170 danarmak 1.32
171 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
172     then
173 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
174     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
175     then
176     local EPATCH_SOURCE="$1/*"
177     else
178     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
179     fi
180 azarah 1.3 else
181 vapier 1.123 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
182 azarah 1.8 then
183 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
184     then
185     EPATCH_SOURCE="$1"
186     fi
187    
188 azarah 1.8 echo
189 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
190     eerror
191     eerror " ${EPATCH_SOURCE}"
192 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
193 azarah 1.8 echo
194     die "Cannot find \$EPATCH_SOURCE!"
195     fi
196 danarmak 1.32
197 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
198 azarah 1.3 fi
199 azarah 1.2
200     case ${EPATCH_SUFFIX##*\.} in
201     bz2)
202     PIPE_CMD="bzip2 -dc"
203 azarah 1.8 PATCH_SUFFIX="bz2"
204 azarah 1.2 ;;
205 azarah 1.6 gz|Z|z)
206 azarah 1.2 PIPE_CMD="gzip -dc"
207 azarah 1.8 PATCH_SUFFIX="gz"
208 azarah 1.2 ;;
209 azarah 1.6 ZIP|zip)
210 azarah 1.2 PIPE_CMD="unzip -p"
211 azarah 1.8 PATCH_SUFFIX="zip"
212 azarah 1.2 ;;
213     *)
214     PIPE_CMD="cat"
215 azarah 1.8 PATCH_SUFFIX="patch"
216 azarah 1.2 ;;
217     esac
218    
219 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
220     then
221 vapier 1.173 einfo "${EPATCH_MULTI_MSG}"
222 azarah 1.3 fi
223     for x in ${EPATCH_SOURCE}
224 azarah 1.2 do
225 vapier 1.121 # New ARCH dependant patch naming scheme ...
226 azarah 1.2 #
227     # ???_arch_foo.patch
228     #
229     if [ -f ${x} ] && \
230 vapier 1.178 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
231 azarah 1.29 [ "${EPATCH_FORCE}" = "yes" ])
232 azarah 1.2 then
233     local count=0
234     local popts="${EPATCH_OPTS}"
235 eradicator 1.150 local patchname=${x##*/}
236 azarah 1.6
237     if [ -n "${EPATCH_EXCLUDE}" ]
238     then
239 eradicator 1.150 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
240 azarah 1.6 then
241     continue
242     fi
243     fi
244 danarmak 1.32
245 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
246     then
247 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
248     then
249     einfo "${EPATCH_SINGLE_MSG}"
250     else
251 eradicator 1.150 einfo "Applying ${patchname} ..."
252 azarah 1.9 fi
253 azarah 1.3 else
254 eradicator 1.150 einfo " ${patchname} ..."
255 azarah 1.3 fi
256 azarah 1.2
257 eradicator 1.150 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
258     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
259 azarah 1.2
260     # Allow for prefix to differ ... im lazy, so shoot me :/
261     while [ "${count}" -lt 5 ]
262     do
263 azarah 1.5 # Generate some useful debug info ...
264 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
265 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
266 azarah 1.8
267     if [ "${PATCH_SUFFIX}" != "patch" ]
268     then
269 eradicator 1.150 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
270     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
271 azarah 1.8 else
272     PATCH_TARGET="${x}"
273     fi
274 danarmak 1.32
275 eradicator 1.150 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
276     echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
277 danarmak 1.32
278 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
279 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
280 azarah 1.8
281     if [ "${PATCH_SUFFIX}" != "patch" ]
282     then
283 eradicator 1.150 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
284 azarah 1.8 then
285     echo
286     eerror "Could not extract patch!"
287     #die "Could not extract patch!"
288     count=5
289     break
290     fi
291     fi
292 danarmak 1.32
293 vapier 1.208 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
294 azarah 1.2 then
295 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
296 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
297     echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
298     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
299 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
300 azarah 1.8
301 eradicator 1.150 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
302 vapier 1.208 _epatch_assert
303 azarah 1.8
304     if [ "$?" -ne 0 ]
305     then
306 eradicator 1.150 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
307 azarah 1.8 echo
308     eerror "A dry-run of patch command succeeded, but actually"
309     eerror "applying the patch failed!"
310     #die "Real world sux compared to the dreamworld!"
311     count=5
312     fi
313    
314 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
315 danarmak 1.32
316 azarah 1.2 break
317     fi
318    
319     count=$((count + 1))
320     done
321    
322 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
323     then
324     rm -f ${PATCH_TARGET}
325     fi
326    
327 azarah 1.2 if [ "${count}" -eq 5 ]
328     then
329 azarah 1.8 echo
330 vapier 1.158 eerror "Failed Patch: ${patchname} !"
331     eerror " ( ${PATCH_TARGET} )"
332 azarah 1.2 eerror
333     eerror "Include in your bugreport the contents of:"
334     eerror
335 eradicator 1.150 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
336 azarah 1.8 echo
337 eradicator 1.150 die "Failed Patch: ${patchname}!"
338 azarah 1.2 fi
339 azarah 1.8
340 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
341 azarah 1.3
342     eend 0
343 azarah 1.2 fi
344     done
345 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
346     then
347     einfo "Done with patching"
348 azarah 1.10 fi
349 azarah 1.26 }
350    
351 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
352 vapier 1.80 # does not exist on the users system
353 vapier 1.52 # vapier@gentoo.org
354     #
355 vapier 1.117 # Takes just 1 optional parameter (the directory to create tmpfile in)
356     emktemp() {
357 vapier 1.119 local exe="touch"
358 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
359     local topdir=$1
360 mr_bones_ 1.100
361 vapier 1.194 if [[ -z ${topdir} ]] ; then
362     [[ -z ${T} ]] \
363 vapier 1.117 && topdir="/tmp" \
364 vapier 1.194 || topdir=${T}
365 vapier 1.117 fi
366    
367 vapier 1.194 if [[ -z $(type -p mktemp) ]] ; then
368 vapier 1.117 local tmp=/
369 vapier 1.194 while [[ -e ${tmp} ]] ; do
370     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
371 vapier 1.117 done
372 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
373 vapier 1.117 echo "${tmp}"
374 vapier 1.52 else
375 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
376     [[ ${USERLAND} == "GNU" ]] \
377 flameeyes 1.225 && mktemp -p "${topdir}" \
378     || TMPDIR="${topdir}" mktemp -t tmp
379 flameeyes 1.223 else
380     [[ ${USERLAND} == "GNU" ]] \
381 flameeyes 1.225 && mktemp -d "${topdir}" \
382     || TMPDIR="${topdir}" mktemp -dt tmp
383 flameeyes 1.223 fi
384 vapier 1.52 fi
385     }
386    
387 ka0ttic 1.108 # Small wrapper for getent (Linux), nidump (Mac OS X),
388     # and pw (FreeBSD) used in enewuser()/enewgroup()
389 usata 1.91 # Joe Jezak <josejx@gmail.com> and usata@gentoo.org
390 ka0ttic 1.108 # FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
391 usata 1.91 #
392     # egetent(database, key)
393     egetent() {
394 flameeyes 1.205 case ${CHOST} in
395     *-darwin*)
396 usata 1.91 case "$2" in
397 flameeyes 1.205 *[!0-9]*) # Non numeric
398 usata 1.91 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
399     ;;
400 flameeyes 1.205 *) # Numeric
401 usata 1.91 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
402     ;;
403     esac
404 flameeyes 1.205 ;;
405 flameeyes 1.220 *-freebsd*|*-dragonfly*)
406 ka0ttic 1.203 local opts action="user"
407     [[ $1 == "passwd" ]] || action="group"
408    
409     # lookup by uid/gid
410     if [[ $2 == [[:digit:]]* ]] ; then
411     [[ ${action} == "user" ]] && opts="-u" || opts="-g"
412 ka0ttic 1.108 fi
413 ka0ttic 1.203
414     pw show ${action} ${opts} "$2" -q
415 flameeyes 1.205 ;;
416 flameeyes 1.218 *-netbsd*|*-openbsd*)
417 flameeyes 1.206 grep "$2:\*:" /etc/$1
418     ;;
419 flameeyes 1.205 *)
420     type -p nscd >& /dev/null && nscd -i "$1"
421 vapier 1.107 getent "$1" "$2"
422 flameeyes 1.205 ;;
423     esac
424 usata 1.91 }
425    
426 vapier 1.23 # Simplify/standardize adding users to the system
427     # vapier@gentoo.org
428     #
429     # enewuser(username, uid, shell, homedir, groups, extra options)
430     #
431     # Default values if you do not specify any:
432     # username: REQUIRED !
433     # uid: next available (see useradd(8))
434 vapier 1.27 # note: pass -1 to get default behavior
435 vapier 1.23 # shell: /bin/false
436     # homedir: /dev/null
437     # groups: none
438     # extra: comment of 'added by portage for ${PN}'
439     enewuser() {
440 vapier 1.233 case ${EBUILD_PHASE} in
441     unpack|compile|test|install)
442     eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
443     eerror "Package fails at QA and at life. Please file a bug."
444     die "Bad package! enewuser is only for use in pkg_* functions!"
445     esac
446    
447 vapier 1.23 # get the username
448 vapier 1.182 local euser=$1; shift
449     if [[ -z ${euser} ]] ; then
450 vapier 1.23 eerror "No username specified !"
451     die "Cannot call enewuser without a username"
452     fi
453    
454 vapier 1.84 # lets see if the username already exists
455 vapier 1.182 if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then
456 vapier 1.23 return 0
457     fi
458 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
459 vapier 1.23
460     # options to pass to useradd
461 azarah 1.59 local opts=
462 vapier 1.23
463     # handle uid
464 vapier 1.182 local euid=$1; shift
465     if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then
466     if [[ ${euid} -gt 0 ]] ; then
467     if [[ ! -z $(egetent passwd ${euid}) ]] ; then
468 vapier 1.84 euid="next"
469 vapier 1.82 fi
470 vapier 1.23 else
471     eerror "Userid given but is not greater than 0 !"
472     die "${euid} is not a valid UID"
473     fi
474     else
475 vapier 1.84 euid="next"
476     fi
477 vapier 1.182 if [[ ${euid} == "next" ]] ; then
478 flameeyes 1.197 for euid in $(seq 101 999) ; do
479 vapier 1.182 [[ -z $(egetent passwd ${euid}) ]] && break
480 vapier 1.84 done
481 vapier 1.23 fi
482 vapier 1.84 opts="${opts} -u ${euid}"
483 vapier 1.23 einfo " - Userid: ${euid}"
484    
485     # handle shell
486 vapier 1.182 local eshell=$1; shift
487     if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
488 vapier 1.221 if [[ ! -e ${ROOT}${eshell} ]] ; then
489 vapier 1.23 eerror "A shell was specified but it does not exist !"
490 vapier 1.221 die "${eshell} does not exist in ${ROOT}"
491     fi
492     if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
493     eerror "Do not specify ${eshell} yourself, use -1"
494     die "Pass '-1' as the shell parameter"
495 vapier 1.23 fi
496     else
497 vapier 1.204 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
498     [[ -x ${ROOT}${shell} ]] && break
499 flameeyes 1.198 done
500    
501 vapier 1.204 if [[ ${shell} == "/dev/null" ]] ; then
502 flameeyes 1.198 eerror "Unable to identify the shell to use"
503     die "Unable to identify the shell to use"
504     fi
505    
506     eshell=${shell}
507 vapier 1.23 fi
508     einfo " - Shell: ${eshell}"
509     opts="${opts} -s ${eshell}"
510    
511     # handle homedir
512 vapier 1.182 local ehome=$1; shift
513     if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
514 azarah 1.59 ehome="/dev/null"
515 vapier 1.23 fi
516     einfo " - Home: ${ehome}"
517     opts="${opts} -d ${ehome}"
518    
519     # handle groups
520 vapier 1.182 local egroups=$1; shift
521     if [[ ! -z ${egroups} ]] ; then
522     local oldifs=${IFS}
523 vapier 1.107 local defgroup="" exgroups=""
524    
525 vapier 1.23 export IFS=","
526 vapier 1.182 for g in ${egroups} ; do
527     export IFS=${oldifs}
528     if [[ -z $(egetent group "${g}") ]] ; then
529 vapier 1.85 eerror "You must add group ${g} to the system first"
530 vapier 1.23 die "${g} is not a valid GID"
531     fi
532 vapier 1.182 if [[ -z ${defgroup} ]] ; then
533     defgroup=${g}
534 vapier 1.107 else
535     exgroups="${exgroups},${g}"
536     fi
537 usata 1.115 export IFS=","
538 vapier 1.23 done
539 vapier 1.182 export IFS=${oldifs}
540 vapier 1.107
541     opts="${opts} -g ${defgroup}"
542 vapier 1.182 if [[ ! -z ${exgroups} ]] ; then
543 vapier 1.107 opts="${opts} -G ${exgroups:1}"
544     fi
545 vapier 1.23 else
546     egroups="(none)"
547     fi
548     einfo " - Groups: ${egroups}"
549    
550     # handle extra and add the user
551 vapier 1.182 local oldsandbox=${SANDBOX_ON}
552 vapier 1.23 export SANDBOX_ON="0"
553 flameeyes 1.205 case ${CHOST} in
554     *-darwin*)
555 usata 1.91 ### Make the user
556 vapier 1.182 if [[ -z $@ ]] ; then
557 usata 1.91 dscl . create /users/${euser} uid ${euid}
558     dscl . create /users/${euser} shell ${eshell}
559     dscl . create /users/${euser} home ${ehome}
560     dscl . create /users/${euser} realname "added by portage for ${PN}"
561     ### Add the user to the groups specified
562 vapier 1.182 local oldifs=${IFS}
563 usata 1.115 export IFS=","
564 vapier 1.182 for g in ${egroups} ; do
565 usata 1.91 dscl . merge /groups/${g} users ${euser}
566     done
567 vapier 1.182 export IFS=${oldifs}
568 usata 1.91 else
569 vapier 1.182 einfo "Extra options are not supported on Darwin yet"
570 usata 1.91 einfo "Please report the ebuild along with the info below"
571 vapier 1.182 einfo "eextra: $@"
572 usata 1.91 die "Required function missing"
573     fi
574 vapier 1.182 ;;
575 flameeyes 1.220 *-freebsd*|*-dragonfly*)
576 vapier 1.182 if [[ -z $@ ]] ; then
577 ka0ttic 1.108 pw useradd ${euser} ${opts} \
578     -c "added by portage for ${PN}" \
579     die "enewuser failed"
580     else
581 vapier 1.182 einfo " - Extra: $@"
582 ka0ttic 1.108 pw useradd ${euser} ${opts} \
583 vapier 1.182 "$@" || die "enewuser failed"
584 ka0ttic 1.108 fi
585 vapier 1.182 ;;
586 flameeyes 1.207
587     *-netbsd*)
588     if [[ -z $@ ]] ; then
589     useradd ${opts} ${euser} || die "enewuser failed"
590     else
591     einfo " - Extra: $@"
592     useradd ${opts} ${euser} "$@" || die "enewuser failed"
593     fi
594     ;;
595 flameeyes 1.218
596     *-openbsd*)
597     if [[ -z $@ ]] ; then
598     useradd -u ${euid} -s ${eshell} \
599     -d ${ehome} -c "Added by portage for ${PN}" \
600     -g ${egroups} ${euser} || die "enewuser failed"
601     else
602     einfo " - Extra: $@"
603     useradd -u ${euid} -s ${eshell} \
604     -d ${ehome} -c "Added by portage for ${PN}" \
605     -g ${egroups} ${euser} "$@" || die "enewuser failed"
606     fi
607     ;;
608    
609 vapier 1.182 *)
610     if [[ -z $@ ]] ; then
611 usata 1.91 useradd ${opts} ${euser} \
612     -c "added by portage for ${PN}" \
613     || die "enewuser failed"
614     else
615 vapier 1.182 einfo " - Extra: $@"
616     useradd ${opts} ${euser} "$@" \
617 usata 1.91 || die "enewuser failed"
618     fi
619 vapier 1.182 ;;
620     esac
621 vapier 1.23
622 vapier 1.193 if [[ ! -e ${ROOT}/${ehome} ]] ; then
623     einfo " - Creating ${ehome} in ${ROOT}"
624     mkdir -p "${ROOT}/${ehome}"
625     chown ${euser} "${ROOT}/${ehome}"
626     chmod 755 "${ROOT}/${ehome}"
627 vapier 1.23 fi
628 vapier 1.193
629     export SANDBOX_ON=${oldsandbox}
630 vapier 1.23 }
631    
632     # Simplify/standardize adding groups to the system
633     # vapier@gentoo.org
634     #
635     # enewgroup(group, gid)
636     #
637     # Default values if you do not specify any:
638     # groupname: REQUIRED !
639     # gid: next available (see groupadd(8))
640     # extra: none
641     enewgroup() {
642 vapier 1.233 case ${EBUILD_PHASE} in
643     unpack|compile|test|install)
644     eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
645     eerror "Package fails at QA and at life. Please file a bug."
646     die "Bad package! enewgroup is only for use in pkg_* functions!"
647     esac
648    
649 vapier 1.23 # 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 wolf31o2 1.235 # local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
895 vapier 1.39
896     echo "[Desktop Entry]
897     Encoding=UTF-8
898     Version=0.9.2
899     Name=${name}
900     Type=Application
901     Comment=${DESCRIPTION}
902     Exec=${exec}
903 wolf31o2 1.234 TryExec=${exec}
904 vapier 1.39 Path=${path}
905     Icon=${icon}
906 vapier 1.99 Categories=Application;${type};" > "${desktop}"
907 vapier 1.39
908 vapier 1.204 (
909     # wrap the env here so that the 'insinto' call
910     # doesn't corrupt the env of the caller
911     insinto /usr/share/applications
912     doins "${desktop}"
913     )
914 danarmak 1.32 }
915    
916 lanius 1.133 # Make a GDM/KDM Session file
917     #
918     # make_desktop_entry(<title>, <command>)
919     # title: File to execute to start the Window Manager
920     # command: Name of the Window Manager
921    
922     make_session_desktop() {
923 vapier 1.167 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
924     [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
925 lanius 1.133
926 vapier 1.167 local title=$1
927     local command=$2
928     local desktop=${T}/${wm}.desktop
929 lanius 1.133
930     echo "[Desktop Entry]
931     Encoding=UTF-8
932     Name=${title}
933     Comment=This session logs you into ${title}
934     Exec=${command}
935     TryExec=${command}
936     Type=Application" > "${desktop}"
937    
938     insinto /usr/share/xsessions
939     doins "${desktop}"
940     }
941    
942     domenu() {
943 vapier 1.167 local i j
944 lanius 1.133 insinto /usr/share/applications
945 vapier 1.167 for i in "$@" ; do
946     if [[ -f ${i} ]] ; then
947     doins "${i}"
948     elif [[ -d ${i} ]] ; then
949     for j in "${i}"/*.desktop ; do
950     doins "${j}"
951 lanius 1.133 done
952 swegener 1.190 fi
953 lanius 1.133 done
954     }
955 vapier 1.167 newmenu() {
956     insinto /usr/share/applications
957     newins "$1" "$2"
958     }
959 lanius 1.133
960     doicon() {
961 vapier 1.167 local i j
962 lanius 1.133 insinto /usr/share/pixmaps
963 vapier 1.167 for i in "$@" ; do
964     if [[ -f ${i} ]] ; then
965     doins "${i}"
966     elif [[ -d ${i} ]] ; then
967     for j in "${i}"/*.png ; do
968     doins "${j}"
969 lanius 1.133 done
970 swegener 1.190 fi
971 lanius 1.133 done
972     }
973 vapier 1.167 newicon() {
974     insinto /usr/share/pixmaps
975     newins "$1" "$2"
976     }
977 lanius 1.133
978     ##############################################################
979     # END: Handle .desktop files and menu entries #
980     ##############################################################
981    
982    
983 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
984     find_unpackable_file() {
985 vapier 1.196 local src=$1
986     if [[ -z ${src} ]] ; then
987     src=${DISTDIR}/${A}
988 vapier 1.50 else
989 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
990     src=${DISTDIR}/${src}
991     elif [[ -e ${PWD}/${src} ]] ; then
992     src=${PWD}/${src}
993     elif [[ -e ${src} ]] ; then
994     src=${src}
995 vapier 1.50 fi
996     fi
997 vapier 1.196 [[ ! -e ${src} ]] && return 1
998 vapier 1.70 echo "${src}"
999     }
1000    
1001     # Unpack those pesky pdv generated files ...
1002     # They're self-unpacking programs with the binary package stuffed in
1003     # the middle of the archive. Valve seems to use it a lot ... too bad
1004     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1005     #
1006     # Usage: unpack_pdv [file to unpack] [size of off_t]
1007     # - you have to specify the off_t size ... i have no idea how to extract that
1008     # information out of the binary executable myself. basically you pass in
1009     # the size of the off_t type (in bytes) on the machine that built the pdv
1010     # archive. one way to determine this is by running the following commands:
1011     # strings <pdv archive> | grep lseek
1012     # strace -elseek <pdv archive>
1013     # basically look for the first lseek command (we do the strings/grep because
1014     # sometimes the function call is _llseek or something) and steal the 2nd
1015     # parameter. here is an example:
1016     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1017     # lseek
1018     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1019     # lseek(3, -4, SEEK_END) = 2981250
1020     # thus we would pass in the value of '4' as the second parameter.
1021     unpack_pdv() {
1022 vapier 1.196 local src=$(find_unpackable_file $1)
1023     local sizeoff_t=$2
1024 vapier 1.70
1025 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1026     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1027 vapier 1.70
1028 vapier 1.212 local shrtsrc=$(basename "${src}")
1029 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1030     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1031     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1032    
1033     # grab metadata for debug reasons
1034 vapier 1.117 local metafile="$(emktemp)"
1035 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1036    
1037     # rip out the final file name from the metadata
1038     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1039     datafile="`basename ${datafile}`"
1040    
1041 vapier 1.71 # now lets uncompress/untar the file if need be
1042 vapier 1.117 local tmpfile="$(emktemp)"
1043 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1044 vapier 1.71
1045     local iscompressed="`file -b ${tmpfile}`"
1046     if [ "${iscompressed:0:8}" == "compress" ] ; then
1047     iscompressed=1
1048     mv ${tmpfile}{,.Z}
1049     gunzip ${tmpfile}
1050     else
1051     iscompressed=0
1052     fi
1053     local istar="`file -b ${tmpfile}`"
1054     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1055     istar=1
1056     else
1057     istar=0
1058     fi
1059    
1060     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1061     #dd if=${src} ibs=${metaskip} count=1 \
1062     # | dd ibs=${tailskip} skip=1 \
1063     # | gzip -dc \
1064     # > ${datafile}
1065     if [ ${iscompressed} -eq 1 ] ; then
1066     if [ ${istar} -eq 1 ] ; then
1067     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1068     | head -c $((${metaskip}-${tailskip})) \
1069     | tar -xzf -
1070     else
1071 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1072     | head -c $((${metaskip}-${tailskip})) \
1073     | gzip -dc \
1074     > ${datafile}
1075 vapier 1.71 fi
1076     else
1077     if [ ${istar} -eq 1 ] ; then
1078     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1079     | head -c $((${metaskip}-${tailskip})) \
1080 vapier 1.73 | tar --no-same-owner -xf -
1081 vapier 1.71 else
1082 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1083     | head -c $((${metaskip}-${tailskip})) \
1084     > ${datafile}
1085 vapier 1.71 fi
1086     fi
1087     true
1088     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1089 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1090     }
1091    
1092     # Unpack those pesky makeself generated files ...
1093     # They're shell scripts with the binary package tagged onto
1094     # the end of the archive. Loki utilized the format as does
1095     # many other game companies.
1096     #
1097 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1098 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1099     # - If the offset is not specified then we will attempt to extract
1100     # the proper offset from the script itself.
1101     unpack_makeself() {
1102 vapier 1.217 local src_input=${1:-${A}}
1103     local src=$(find_unpackable_file "${src_input}")
1104 vapier 1.196 local skip=$2
1105     local exe=$3
1106    
1107 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1108 vapier 1.50
1109 vapier 1.196 local shrtsrc=$(basename "${src}")
1110 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1111 vapier 1.212 if [[ -z ${skip} ]] ; then
1112     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1113 vapier 1.41 local skip=0
1114 vapier 1.112 exe=tail
1115 vapier 1.41 case ${ver} in
1116     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1117 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1118 vapier 1.41 ;;
1119     2.0|2.0.1)
1120 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1121 vapier 1.41 ;;
1122 wolf31o2 1.48 2.1.1)
1123 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1124 wolf31o2 1.48 let skip="skip + 1"
1125     ;;
1126 vapier 1.49 2.1.2)
1127 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1128 vapier 1.49 let skip="skip + 1"
1129     ;;
1130 wolf31o2 1.48 2.1.3)
1131 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1132 vapier 1.41 let skip="skip + 1"
1133     ;;
1134 wolf31o2 1.211 2.1.4|2.1.5)
1135 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1136     skip=$(head -n ${skip} "${src}" | wc -c)
1137     exe="dd"
1138     ;;
1139 vapier 1.41 *)
1140     eerror "I'm sorry, but I was unable to support the Makeself file."
1141     eerror "The version I detected was '${ver}'."
1142     eerror "Please file a bug about the file ${shrtsrc} at"
1143     eerror "http://bugs.gentoo.org/ so that support can be added."
1144     die "makeself version '${ver}' not supported"
1145     ;;
1146     esac
1147     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1148     fi
1149 vapier 1.112 case ${exe} in
1150     tail) exe="tail -n +${skip} '${src}'";;
1151     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1152     *) die "makeself cant handle exe '${exe}'"
1153     esac
1154 vapier 1.41
1155 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1156 vapier 1.117 local tmpfile="$(emktemp)"
1157 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1158     local filetype="$(file -b "${tmpfile}")"
1159 vapier 1.68 case ${filetype} in
1160     *tar\ archive)
1161 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1162 vapier 1.68 ;;
1163     bzip2*)
1164 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1165 mr_bones_ 1.69 ;;
1166 vapier 1.68 gzip*)
1167 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1168 vapier 1.68 ;;
1169 vapier 1.93 compress*)
1170 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1171 vapier 1.93 ;;
1172 vapier 1.68 *)
1173 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1174 vapier 1.68 false
1175     ;;
1176     esac
1177     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1178 wolf31o2 1.56 }
1179    
1180     # Display a license for user to accept.
1181     #
1182     # Usage: check_license [license]
1183     # - If the file is not specified then ${LICENSE} is used.
1184     check_license() {
1185 vapier 1.60 local lic=$1
1186     if [ -z "${lic}" ] ; then
1187     lic="${PORTDIR}/licenses/${LICENSE}"
1188 wolf31o2 1.56 else
1189 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1190     lic="${PORTDIR}/licenses/${lic}"
1191     elif [ -e "${PWD}/${lic}" ] ; then
1192     lic="${PWD}/${lic}"
1193     elif [ -e "${lic}" ] ; then
1194     lic="${lic}"
1195 wolf31o2 1.56 fi
1196     fi
1197 wolf31o2 1.200 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1198 vapier 1.64 local l="`basename ${lic}`"
1199 wolf31o2 1.56
1200 vapier 1.60 # here is where we check for the licenses the user already
1201     # accepted ... if we don't find a match, we make the user accept
1202 wolf31o2 1.106 local shopts=$-
1203 vapier 1.60 local alic
1204 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1205 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1206 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1207     set +o noglob; set -${shopts} #reset old shell opts
1208     return 0
1209     fi
1210 vapier 1.60 done
1211 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1212 vapier 1.60
1213 vapier 1.117 local licmsg="$(emktemp)"
1214 vapier 1.60 cat << EOF > ${licmsg}
1215     **********************************************************
1216     The following license outlines the terms of use of this
1217     package. You MUST accept this license for installation to
1218     continue. When you are done viewing, hit 'q'. If you
1219     CTRL+C out of this, the install will not run!
1220     **********************************************************
1221    
1222     EOF
1223     cat ${lic} >> ${licmsg}
1224     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1225 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1226 vapier 1.60 read alic
1227     case ${alic} in
1228     yes|Yes|y|Y)
1229     return 0
1230     ;;
1231     *)
1232     echo;echo;echo
1233     eerror "You MUST accept the license to continue! Exiting!"
1234     die "Failed to accept license"
1235     ;;
1236     esac
1237 vapier 1.23 }
1238 vapier 1.75
1239     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1240     # the whole 'non-interactive' policy, but damnit I want CD support !
1241     #
1242     # with these cdrom functions we handle all the user interaction and
1243     # standardize everything. all you have to do is call cdrom_get_cds()
1244     # and when the function returns, you can assume that the cd has been
1245     # found at CDROM_ROOT.
1246     #
1247     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1248     # etc... if you want to give the cds better names, then just export
1249     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1250     #
1251     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1252     #
1253     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1254     # - this will attempt to locate a cd based upon a file that is on
1255     # the cd ... the more files you give this function, the more cds
1256     # the cdrom functions will handle
1257     cdrom_get_cds() {
1258     # first we figure out how many cds we're dealing with by
1259     # the # of files they gave us
1260     local cdcnt=0
1261     local f=
1262     for f in "$@" ; do
1263 vapier 1.214 ((++cdcnt))
1264 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1265     done
1266     export CDROM_TOTAL_CDS=${cdcnt}
1267     export CDROM_CURRENT_CD=1
1268    
1269     # now we see if the user gave use CD_ROOT ...
1270     # if they did, let's just believe them that it's correct
1271 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1272 vapier 1.75 local var=
1273     cdcnt=0
1274 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1275 vapier 1.214 ((++cdcnt))
1276 vapier 1.75 var="CD_ROOT_${cdcnt}"
1277 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1278 vapier 1.131 if [[ -z ${!var} ]] ; then
1279 vapier 1.75 eerror "You must either use just the CD_ROOT"
1280     eerror "or specify ALL the CD_ROOT_X variables."
1281     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1282     die "could not locate CD_ROOT_${cdcnt}"
1283     fi
1284     done
1285 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1286 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1287 vapier 1.215 export CDROM_SET=-1
1288     for f in ${CDROM_CHECK_1//:/ } ; do
1289     ((++CDROM_SET))
1290     [[ -e ${CD_ROOT}/${f} ]] && break
1291     done
1292     export CDROM_MATCH=${f}
1293 vapier 1.75 return
1294     fi
1295    
1296 vapier 1.215 # User didn't help us out so lets make sure they know they can
1297     # simplify the whole process ...
1298 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1299 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1300 vapier 1.75 echo
1301     einfo "If you do not have the CD, but have the data files"
1302     einfo "mounted somewhere on your filesystem, just export"
1303     einfo "the variable CD_ROOT so that it points to the"
1304     einfo "directory containing the files."
1305     echo
1306 vapier 1.132 einfo "For example:"
1307     einfo "export CD_ROOT=/mnt/cdrom"
1308     echo
1309 vapier 1.75 else
1310     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1311     cdcnt=0
1312 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1313 vapier 1.214 ((++cdcnt))
1314 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1315 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1316 vapier 1.75 done
1317     echo
1318     einfo "If you do not have the CDs, but have the data files"
1319     einfo "mounted somewhere on your filesystem, just export"
1320     einfo "the following variables so they point to the right place:"
1321     einfon ""
1322     cdcnt=0
1323 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1324 vapier 1.214 ((++cdcnt))
1325 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1326     done
1327     echo
1328     einfo "Or, if you have all the files in the same place, or"
1329     einfo "you only have one cdrom, you can export CD_ROOT"
1330     einfo "and that place will be used as the same data source"
1331     einfo "for all the CDs."
1332     echo
1333 vapier 1.132 einfo "For example:"
1334     einfo "export CD_ROOT_1=/mnt/cdrom"
1335     echo
1336 vapier 1.75 fi
1337 vapier 1.215
1338 vapier 1.214 export CDROM_SET=""
1339 vapier 1.75 export CDROM_CURRENT_CD=0
1340     cdrom_load_next_cd
1341     }
1342    
1343     # this is only used when you need access to more than one cd.
1344     # when you have finished using the first cd, just call this function.
1345     # when it returns, CDROM_ROOT will be pointing to the second cd.
1346     # remember, you can only go forward in the cd chain, you can't go back.
1347     cdrom_load_next_cd() {
1348 vapier 1.215 local var
1349     ((++CDROM_CURRENT_CD))
1350 vapier 1.79
1351 vapier 1.75 unset CDROM_ROOT
1352 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1353     [[ -z ${!var} ]] && var="CD_ROOT"
1354 vapier 1.131 if [[ -z ${!var} ]] ; then
1355 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1356 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1357 vapier 1.75 else
1358 vapier 1.131 export CDROM_ROOT=${!var}
1359 vapier 1.75 fi
1360    
1361     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1362     }
1363    
1364     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1365     # functions. this should *never* be called from an ebuild.
1366     # all it does is try to locate a give file on a cd ... if the cd isn't
1367     # found, then a message asking for the user to insert the cdrom will be
1368     # displayed and we'll hang out here until:
1369     # (1) the file is found on a mounted cdrom
1370     # (2) the user hits CTRL+C
1371 vapier 1.215 _cdrom_locate_file_on_cd() {
1372 vapier 1.214 local mline=""
1373     local showedmsg=0
1374    
1375 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1376 vapier 1.214 local i=0
1377     local -a cdset=(${*//:/ })
1378     if [[ -n ${CDROM_SET} ]] ; then
1379     cdset=(${cdset[${CDROM_SET}]})
1380     fi
1381    
1382     while [[ -n ${cdset[${i}]} ]] ; do
1383     local dir=$(dirname ${cdset[${i}]})
1384     local file=$(basename ${cdset[${i}]})
1385    
1386     for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do
1387     [[ -d ${mline}/${dir} ]] || continue
1388     if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then
1389     export CDROM_ROOT=${mline}
1390     export CDROM_SET=${i}
1391     export CDROM_MATCH=${cdset[${i}]}
1392     return
1393     fi
1394     done
1395    
1396     ((++i))
1397 vapier 1.75 done
1398    
1399 vapier 1.214 echo
1400     if [[ ${showedmsg} -eq 0 ]] ; then
1401     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1402     if [[ -z ${CDROM_NAME} ]] ; then
1403     einfo "Please insert+mount the cdrom for ${PN} now !"
1404     else
1405     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1406     fi
1407     else
1408     if [[ -z ${CDROM_NAME_1} ]] ; then
1409     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1410 vapier 1.75 else
1411 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1412     einfo "Please insert+mount the ${!var} cdrom now !"
1413 vapier 1.75 fi
1414     fi
1415 vapier 1.214 showedmsg=1
1416 vapier 1.75 fi
1417 vapier 1.214 einfo "Press return to scan for the cd again"
1418     einfo "or hit CTRL+C to abort the emerge."
1419     echo
1420     einfo "If you are having trouble with the detection"
1421     einfo "of your CD, it is possible that you do not have"
1422     einfo "Joliet support enabled in your kernel. Please"
1423     einfo "check that CONFIG_JOLIET is enabled in your kernel."
1424 vapier 1.222 read || die "something is screwed with your system"
1425 vapier 1.75 done
1426     }
1427 vapier 1.92
1428 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1429 vapier 1.92 # a package can support
1430     #
1431     # usage: strip-linguas <allow LINGUAS>
1432     # strip-linguas -i <directories of .po files>
1433     # strip-linguas -u <directories of .po files>
1434     #
1435     # The first form allows you to specify a list of LINGUAS.
1436 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1437 vapier 1.92 # directories and uses the intersection of the lists.
1438 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1439 vapier 1.92 # directories and uses the union of the lists.
1440     strip-linguas() {
1441     local ls newls
1442 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1443     local op=$1; shift
1444 vapier 1.236 ls=$(find "$1" -name '*.po' -exec basename {} .po \;); shift
1445 vapier 1.92 local d f
1446     for d in "$@" ; do
1447 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1448     newls=${ls}
1449 vapier 1.92 else
1450     newls=""
1451     fi
1452 vapier 1.236 for f in $(find "$d" -name '*.po' -exec basename {} .po \;) ; do
1453 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1454 vapier 1.236 hasq ${f} ${ls} && newls="${newls} ${f}"
1455 vapier 1.92 else
1456 vapier 1.236 hasq ${f} ${ls} || newls="${newls} ${f}"
1457 vapier 1.92 fi
1458     done
1459 vapier 1.154 ls=${newls}
1460 vapier 1.92 done
1461     else
1462 vapier 1.236 ls="$@"
1463 vapier 1.92 fi
1464    
1465     newls=""
1466     for f in ${LINGUAS} ; do
1467 vapier 1.236 if hasq ${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 carlo 1.227 # These functions are useful when a lib in your package changes --library. Such
1517 eradicator 1.111 # 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 carlo 1.227 ewarn " revdep-rebuild --library ${SONAME}"
1558 eradicator 1.191 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