#!/bin/sh # # Read WHENCE from stdin and install the compressed firmware files into DESTDIR. # The file list for each topic is created as files-xxx under the current dir. # # usage: install-split.sh [-v] topics.list DESTDIR < WHENCE # verbose=: if [ x"$1" = x"-v" ]; then verbose=echo shift fi topics="$1" DESTDIR="$2" fwdir=${3:-/lib/firmware} dest=$DESTDIR/$fwdir do_compress=1 if [ -n "$do_compress" ]; then cext=".xz" else cext="" fi make_dirs () { local f="$1" mkdir -p $(dirname "$dest/$f") local d=$(dirname "$f") if [ "$d" != "." ]; then while true; do if ! grep -q '%dir '"$fwdir/$d"'$' files-$topic; then echo "%dir $fwdir/$d" >> files-$topic fi case "$d" in */*) d=${d%/*};; *) break;; esac done fi } copy_link () { local f="$1" local lf="$2" local src test -f "$dest/$f$cext" && return if [ -z "$lf" ]; then lf=$(readlink "$f") src="$lf" else src="${f%/*}" if [ "$src" = "$f" ]; then src="$lf" else src="$src/$lf" fi fi make_dirs "$f" if [ -d "$dest/$src" ]; then ln -sf "$lf" "$dest/$f" echo "\"$fwdir/$f\"" >> files-$topic $verbose "Link: $lf -> $f (directory) for topic $topic" else ln -sf "$lf$cext" "$dest/$f$cext" echo "\"$fwdir/$f$cext\"" >> files-$topic $verbose "Link: $lf$cext -> $f$cext for topic $topic" fi } copy_file () { local f="$1" test -f "$dest/$f$cext" && return make_dirs "$f" install -c -m 0644 "$f" $(dirname "$dest/$f") test -n "$do_compress" && xz -f -C crc32 --lzma2=dict=2MiB "$dest/$f" echo "\"$fwdir/$f$cext\"" >> files-$topic $verbose "Copy: $f$cext for topic $topic" } sub="xxx" while read l; do test -z "$l" && continue case "$l" in ----*) sub="" topic="" ;; Driver:*) test -n "$sub" && continue sub=$(echo "$l" | sed -e's/Driver: *//' -e's/[ :].*$//') m=$(grep -m1 "^$sub": "$topics" | sed -e's/^.*:[[:space:]]*//') test -z "$m" && continue set -- $m topic="$1" if [ "$topic" = "SKIP" ]; then continue fi $verbose "Switching to topic $topic" if [ -n "$topic" ]; then if [ ! -s files-$topic ]; then echo "%dir $fwdir" > files-$topic fi fi ;; File:*) test "$topic" = "SKIP" && continue if [ -z "$topic" ]; then echo "ERROR: no topic found for $l" exit 1 fi f=$(echo "$l" | sed -e's/^File: *//' -e's/"//g' -e's/\\//g') if [ -L "$f" ]; then copy_link "$f" else copy_file "$f" fi ;; Link:*) test "$topic" = "SKIP" && continue if [ -z "$topic" ]; then echo "ERROR: no topic found for $l" exit 1 fi f=$(echo "$l" | sed -e's/^Link: *//' -e's/ *->.*$//' -es'/\\//g') d=$(echo "$l" | sed -e's/^.*-> *//' -e's/\\//g') copy_link "$f" "$d" ;; esac done exit 0