| 1 | # Copyright 1999-2012 Gentoo Foundation |
1 | # Copyright 1999-2012 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/unpacker.eclass,v 1.2 2012/02/05 05:48:00 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/unpacker.eclass,v 1.8 2012/04/29 00:15:10 vapier Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: unpacker.eclass |
5 | # @ECLASS: unpacker.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # base-system@gentoo.org |
7 | # base-system@gentoo.org |
| 8 | # @BLURB: helpers for extraneous file formats and consistent behavior across EAPIs |
8 | # @BLURB: helpers for extraneous file formats and consistent behavior across EAPIs |
| … | |
… | |
| 194 | ;; |
194 | ;; |
| 195 | 2.1.3) |
195 | 2.1.3) |
| 196 | skip=`grep -a ^offset= "${src}" | awk '{print $3}'` |
196 | skip=`grep -a ^offset= "${src}" | awk '{print $3}'` |
| 197 | (( skip++ )) |
197 | (( skip++ )) |
| 198 | ;; |
198 | ;; |
| 199 | 2.1.4|2.1.5) |
199 | 2.1.4|2.1.5|2.1.6) |
| 200 | skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) |
200 | skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) |
| 201 | skip=$(head -n ${skip} "${src}" | wc -c) |
201 | skip=$(head -n ${skip} "${src}" | wc -c) |
| 202 | exe="dd" |
202 | exe="dd" |
| 203 | ;; |
203 | ;; |
| 204 | *) |
204 | *) |
| … | |
… | |
| 251 | |
251 | |
| 252 | local deb=$(find_unpackable_file "$1") |
252 | local deb=$(find_unpackable_file "$1") |
| 253 | |
253 | |
| 254 | unpack_banner "${deb}" |
254 | unpack_banner "${deb}" |
| 255 | |
255 | |
|
|
256 | # on AIX ar doesn't work out as their ar used a different format |
|
|
257 | # from what GNU ar (and thus what .deb files) produce |
|
|
258 | if [[ -n ${EPREFIX} ]] ; then |
|
|
259 | { |
|
|
260 | read # global header |
|
|
261 | [[ ${REPLY} = "!<arch>" ]] || die "${deb} does not seem to be a deb archive" |
|
|
262 | local f timestamp uid gid mode size magic |
|
|
263 | while read f timestamp uid gid mode size magic ; do |
|
|
264 | [[ -n ${f} && -n ${size} ]] || continue # ignore empty lines |
|
|
265 | if [[ ${f} = "data.tar"* ]] ; then |
|
|
266 | head -c "${size}" > "${f}" |
|
|
267 | else |
|
|
268 | head -c "${size}" > /dev/null # trash it |
|
|
269 | fi |
|
|
270 | done |
|
|
271 | } < "${deb}" |
|
|
272 | else |
| 256 | ar x "${deb}" |
273 | ar x "${deb}" |
|
|
274 | fi |
|
|
275 | |
| 257 | unpack ./data.tar* |
276 | unpacker ./data.tar* |
| 258 | } |
277 | } |
| 259 | |
278 | |
| 260 | # @FUNCTION: _unpacker |
279 | # @FUNCTION: _unpacker |
| 261 | # @USAGE: <one archive to unpack> |
280 | # @USAGE: <one archive to unpack> |
| 262 | # @INTERNAL |
281 | # @INTERNAL |
| … | |
… | |
| 271 | a=$(find_unpackable_file "${a}") |
290 | a=$(find_unpackable_file "${a}") |
| 272 | |
291 | |
| 273 | # first figure out the decompression method |
292 | # first figure out the decompression method |
| 274 | case ${m} in |
293 | case ${m} in |
| 275 | *.bz2|*.tbz|*.tbz2) |
294 | *.bz2|*.tbz|*.tbz2) |
| 276 | local bzcmd=${PORTAGE_BZIP2_COMMAND:-$(type -P pbzip2 || bzip2)} |
295 | local bzcmd=${PORTAGE_BZIP2_COMMAND:-$(type -P pbzip2 || type -P bzip2)} |
| 277 | local bzuncmd=${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d} |
296 | local bzuncmd=${PORTAGE_BUNZIP2_COMMAND:-${bzcmd} -d} |
| 278 | : ${UNPACKER_BZ2:=${bzuncmd}} |
297 | : ${UNPACKER_BZ2:=${bzuncmd}} |
| 279 | comp="${UNPACKER_BZ2} -c" |
298 | comp="${UNPACKER_BZ2} -c" |
| 280 | ;; |
299 | ;; |
| 281 | *.z|*.gz|*.tgz) |
300 | *.z|*.gz|*.tgz) |
| 282 | comp="gzip -dc" ;; |
301 | comp="gzip -dc" ;; |
| … | |
… | |
| 284 | comp="xz -dc" ;; |
303 | comp="xz -dc" ;; |
| 285 | *) comp="" ;; |
304 | *) comp="" ;; |
| 286 | esac |
305 | esac |
| 287 | |
306 | |
| 288 | # then figure out if there are any archiving aspects |
307 | # then figure out if there are any archiving aspects |
|
|
308 | arch="" |
| 289 | case ${m} in |
309 | case ${m} in |
| 290 | *.tgz|*.tbz|*.tbz2|*.txz|*.tar.*|*.tar) |
310 | *.tgz|*.tbz|*.tbz2|*.txz|*.tar.*|*.tar) |
| 291 | arch="tar --no-same-owner -xof" ;; |
311 | arch="tar --no-same-owner -xof" ;; |
| 292 | *.deb) |
312 | *.deb) |
| 293 | arch="unpack_deb" ;; |
313 | arch="unpack_deb" ;; |
| 294 | *.run) |
314 | *.run) |
| 295 | arch="unpack_makeself" ;; |
315 | arch="unpack_makeself" ;; |
| 296 | *) arch="" ;; |
316 | *.bin) |
|
|
317 | # Makeself archives can be annoyingly named |
|
|
318 | if head -c 100 "${a}" | grep -qs '#.*Makeself' ; then |
|
|
319 | arch="unpack_makeself" |
|
|
320 | fi |
|
|
321 | ;; |
| 297 | esac |
322 | esac |
| 298 | |
323 | |
| 299 | # finally do the unpack |
324 | # finally do the unpack |
| 300 | if [[ -z ${arch}${comp} ]] ; then |
325 | if [[ -z ${arch}${comp} ]] ; then |
| 301 | unpack "${a}" |
326 | unpack "$1" |
| 302 | return $? |
327 | return $? |
| 303 | fi |
328 | fi |
| 304 | |
329 | |
| 305 | [[ ${arch} != unpack_* ]] && unpack_banner "${a}" |
330 | [[ ${arch} != unpack_* ]] && unpack_banner "${a}" |
| 306 | |
331 | |
| 307 | if [[ -z ${arch} ]] ; then |
332 | if [[ -z ${arch} ]] ; then |
|
|
333 | # Need to decompress the file into $PWD #408801 |
|
|
334 | local _a=${a%.*} |
| 308 | ${comp} "${a}" > "${a%.*}" |
335 | ${comp} "${a}" > "${_a##*/}" |
| 309 | elif [[ -z ${comp} ]] ; then |
336 | elif [[ -z ${comp} ]] ; then |
| 310 | ${arch} "${a}" |
337 | ${arch} "${a}" |
| 311 | else |
338 | else |
| 312 | ${comp} "${a}" | ${arch} - |
339 | ${comp} "${a}" | ${arch} - |
| 313 | fi |
340 | fi |