/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to initramfs-unpack

  • Committer: Teddy Hogeborn
  • Date: 2008-08-02 10:48:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080802104824-fx0miwp9o4g9r31e
* plugbasedclient.c (struct process): New fields "eof", "completed",
                                      and "status".
  (handle_sigchld): New function.
  (main): Initialize "dir" to NULL to only closedir() it if necessary.
          Move "process_list" to be a global variable to be accessible
          by "handle_sigchld".  Make "handle_sigchld" handle SIGCHLD.
          Remove redundant check for NULL "dir".  Free "filename" when
          no longer used.  Block SIGCHLD around fork()/exec().
          Restore normal signals in child.  Only loop while running
          processes exist.  Print process buffer when the process is
          done and it has emitted EOF, not when it only emits EOF.
          Remove processes from list which exit non-cleanly.  In
          cleaning up, closedir() if necessary.  Bug fix: set next
          pointer correctly when freeing process list.

* plugins.d/passprompt.c (main): Do not ignore SIGQUIT.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/bash
2
 
3
 
# Initramfs unpacker - unpacks initramfs images into /tmp
4
 
5
 
# Copyright © 2013-2019 Teddy Hogeborn
6
 
# Copyright © 2013-2019 Björn Påhlsson
7
 
8
 
# This file is part of Mandos.
9
 
#
10
 
# Mandos is free software: you can redistribute it and/or modify it
11
 
# under the terms of the GNU General Public License as published by
12
 
# the Free Software Foundation, either version 3 of the License, or
13
 
# (at your option) any later version.
14
 
#
15
 
#     Mandos is distributed in the hope that it will be useful,
16
 
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 
#     GNU General Public License for more details.
19
 
#
20
 
# You should have received a copy of the GNU General Public License
21
 
# along with Mandos.  If not, see
22
 
# <http://www.gnu.org/licenses/>.
23
 
24
 
# Contact the authors at <mandos@recompile.se>.
25
 
 
26
 
cpio="cpio --extract --make-directories --unconditional --preserve-modification-time"
27
 
 
28
 
if [ -z "$*" ]; then
29
 
    set -- /boot/initrd.img-*
30
 
fi
31
 
 
32
 
for imgfile in "$@"; do
33
 
    if ! [ -f "$imgfile" ]; then
34
 
        echo "Error: Not an existing file: $imgfile" >&2
35
 
        continue
36
 
    fi
37
 
    imgdir="${TMPDIR:-/tmp}/${imgfile##*/}"
38
 
    if [ -d "$imgdir" ]; then
39
 
        rm --recursive -- "$imgdir"
40
 
    fi
41
 
    mkdir --parents "$imgdir"
42
 
    # Does this image contain microcode?
43
 
    if $cpio --quiet --list --file="$imgfile" >/dev/null 2>&1; then
44
 
        # Number of bytes to skip to get to the compressed archive
45
 
        skip=$(($(LANG=C $cpio --io-size=1 --list --file="$imgfile" 2>&1 \
46
 
                      | sed --quiet \
47
 
                            --expression='s/^\([0-9]\+\) blocks$/\1/p')+8))
48
 
        if [ -x /usr/lib/dracut/skipcpio ]; then
49
 
            catimg="/usr/lib/dracut/skipcpio $imgfile"
50
 
        else
51
 
            catimg="dd if=$imgfile bs=$skip skip=1 status=noxfer"
52
 
        fi
53
 
    else
54
 
        echo "No microcode detected"
55
 
        catimg="cat -- $imgfile"
56
 
    fi
57
 
    while :; do
58
 
        # Determine the compression method
59
 
        if { $catimg 2>/dev/null | zcat --test >/dev/null 2>&1;
60
 
             [ ${PIPESTATUS[-1]} -eq 0 ]; }; then
61
 
            decomp="zcat"
62
 
        elif { $catimg 2>/dev/null | bzip2 --test >/dev/null 2>&1;
63
 
               [ ${PIPESTATUS[-1]} -eq 0 ]; }; then
64
 
            decomp="bzip2 --stdout --decompress"
65
 
        elif { $catimg 2>/dev/null | lzop --test >/dev/null 2>&1;
66
 
               [ ${PIPESTATUS[-1]} -eq 0 ]; }; then
67
 
            decomp="lzop --stdout --decompress"
68
 
        elif { $catimg 2>/dev/null | zstd --test >/dev/null 2>&1;
69
 
               [ ${PIPESTATUS[-1]} -eq 0 ]; }; then
70
 
            decomp="zstdcat --stdout --decompress"
71
 
        else
72
 
            skip=$((${skip}+1))
73
 
            echo "Could not determine compression of ${imgfile}; trying to skip ${skip} bytes" >&2
74
 
            catimg="dd if=$imgfile bs=$skip skip=1 status=noxfer"
75
 
            continue
76
 
        fi
77
 
        break
78
 
    done
79
 
    case "$catimg" in
80
 
        *skipcpio*) echo "Microcode detected, skipping";;
81
 
        *) echo "Microcode detected, skipping ${skip} bytes";;
82
 
    esac
83
 
    $catimg 2>/dev/null | $decomp | ( cd -- "$imgdir" && $cpio --quiet )
84
 
    if [ ${PIPESTATUS[-1]} -eq 0 ]; then
85
 
        echo "$imgfile unpacked into $imgdir"
86
 
    fi
87
 
done