~alpine/aports

main/mkinitfs: Bugfixes, speedup, data/code separation, new syntax, cleanup. v1 PROPOSED

Linus Swälas: 1
 main/mkinitfs: Bugfixes, speedup, data/code separation, new syntax, cleanup.

 4 files changed, 685 insertions(+), 15 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.alpinelinux.org/~alpine/aports/patches/2317/mbox | git am -3
Learn more about email & git

[alpine-aports] [PATCH] main/mkinitfs: Bugfixes, speedup, data/code separation, new syntax, cleanup. Export this patch

* Many small bugfixes.
* ~100 times speedup on gathering files for the initramfs.
* Separated code/data so that directories to include in the
  initramfs is no longer hardcoded in the binary but included
  in features.d/base.files.
* Change of syntax in features.d/* - directories whose name end
  in / will have the whole tree rooted at that path included,
  directories where the name does NOT end in / will cause only
  that directory to be included and nothing below that path.
* Some cleanup, quoting fixes and similar.
---
 ..._speedup_data-code-sep_new-syntax_cleanup.patch | 666 +++++++++++++++++++++
 main/mkinitfs/APKBUILD                             |  14 +-
 main/mkinitfs/mkinitfs.pre-upgrade                 |   2 +-
 main/mkinitfs/mkinitfs.trigger                     |  18 +-
 4 files changed, 685 insertions(+), 15 deletions(-)
 create mode 100644 main/mkinitfs/0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch

diff --git a/main/mkinitfs/0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch b/main/mkinitfs/0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch
new file mode 100644
index 0000000..62de46b
--- /dev/null
+++ b/main/mkinitfs/0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch
@@ -0,0 +1,666 @@
diff -U3 -r mkinitfs-3.0.5/features.d/base.files mkinitfs-3.0.5-new/features.d/base.files
--- mkinitfs-3.0.5/features.d/base.files	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/base.files	2016-10-28 13:39:54.000000000 +0200
@@ -1,3 +1,16 @@
+/bin
+/sbin
+/dev
+/proc
+/sys
+/run
+/tmp
+/etc/apk
+/lib/modules
+/media/floppy
+/media/cdrom
+/media/usb
+/mdev/
 /bin/busybox
 /bin/sh
 /lib/mdev
diff -U3 -r mkinitfs-3.0.5/features.d/base.modules mkinitfs-3.0.5-new/features.d/base.modules
--- mkinitfs-3.0.5/features.d/base.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/base.modules	2016-10-28 13:43:42.000000000 +0200
@@ -1,2 +1,2 @@
 kernel/drivers/block/loop.ko
-kernel/fs/overlayfs
+kernel/fs/overlayfs/
diff -U3 -r mkinitfs-3.0.5/features.d/btrfs.modules mkinitfs-3.0.5-new/features.d/btrfs.modules
--- mkinitfs-3.0.5/features.d/btrfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/btrfs.modules	2016-10-28 13:43:54.000000000 +0200
@@ -1,3 +1,3 @@
 kernel/arch/*/crypto/crc32*
 kernel/crypto/crc32*
-kernel/fs/btrfs
+kernel/fs/btrfs/
diff -U3 -r mkinitfs-3.0.5/features.d/cdrom.modules mkinitfs-3.0.5-new/features.d/cdrom.modules
--- mkinitfs-3.0.5/features.d/cdrom.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/cdrom.modules	2016-10-28 13:44:12.000000000 +0200
@@ -1,2 +1,2 @@
-kernel/drivers/cdrom
-kernel/fs/isofs
+kernel/drivers/cdrom/
+kernel/fs/isofs/
diff -U3 -r mkinitfs-3.0.5/features.d/cramfs.modules mkinitfs-3.0.5-new/features.d/cramfs.modules
--- mkinitfs-3.0.5/features.d/cramfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/cramfs.modules	2016-10-28 13:44:18.000000000 +0200
@@ -1 +1 @@
-kernel/fs/cramfs
+kernel/fs/cramfs/
diff -U3 -r mkinitfs-3.0.5/features.d/ext2.modules mkinitfs-3.0.5-new/features.d/ext2.modules
--- mkinitfs-3.0.5/features.d/ext2.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/ext2.modules	2016-10-28 13:44:42.000000000 +0200
@@ -1 +1 @@
-kernel/fs/ext2
+kernel/fs/ext2/
diff -U3 -r mkinitfs-3.0.5/features.d/ext3.modules mkinitfs-3.0.5-new/features.d/ext3.modules
--- mkinitfs-3.0.5/features.d/ext3.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/ext3.modules	2016-10-28 13:44:50.000000000 +0200
@@ -1 +1 @@
-kernel/fs/ext3
+kernel/fs/ext3/
diff -U3 -r mkinitfs-3.0.5/features.d/ext4.modules mkinitfs-3.0.5-new/features.d/ext4.modules
--- mkinitfs-3.0.5/features.d/ext4.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/ext4.modules	2016-10-28 13:44:54.000000000 +0200
@@ -1 +1 @@
-kernel/fs/ext4
+kernel/fs/ext4/
diff -U3 -r mkinitfs-3.0.5/features.d/f2fs.modules mkinitfs-3.0.5-new/features.d/f2fs.modules
--- mkinitfs-3.0.5/features.d/f2fs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/f2fs.modules	2016-10-28 13:45:43.000000000 +0200
@@ -1 +1 @@
-kernel/fs/f2fs
+kernel/fs/f2fs/
diff -U3 -r mkinitfs-3.0.5/features.d/gfs2.modules mkinitfs-3.0.5-new/features.d/gfs2.modules
--- mkinitfs-3.0.5/features.d/gfs2.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/gfs2.modules	2016-10-28 13:45:58.000000000 +0200
@@ -1 +1 @@
-kernel/fs/gfs2
+kernel/fs/gfs2/
diff -U3 -r mkinitfs-3.0.5/features.d/jfs.modules mkinitfs-3.0.5-new/features.d/jfs.modules
--- mkinitfs-3.0.5/features.d/jfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/jfs.modules	2016-10-28 13:46:04.000000000 +0200
@@ -1 +1 @@
-kernel/fs/jfs
+kernel/fs/jfs/
diff -U3 -r mkinitfs-3.0.5/features.d/kms.modules mkinitfs-3.0.5-new/features.d/kms.modules
--- mkinitfs-3.0.5/features.d/kms.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/kms.modules	2016-10-28 13:46:30.000000000 +0200
@@ -1,5 +1,5 @@
-kernel/drivers/char/agp
-kernel/drivers/gpu
-kernel/drivers/i2c
-kernel/drivers/video
+kernel/drivers/char/agp/
+kernel/drivers/gpu/
+kernel/drivers/i2c/
+kernel/drivers/video/
 kernel/arch/x86/video/fbdev.ko
diff -U3 -r mkinitfs-3.0.5/features.d/mmc.modules mkinitfs-3.0.5-new/features.d/mmc.modules
--- mkinitfs-3.0.5/features.d/mmc.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/mmc.modules	2016-10-28 13:47:25.000000000 +0200
@@ -1 +1 @@
-kernel/drivers/mmc
+kernel/drivers/mmc/
diff -U3 -r mkinitfs-3.0.5/features.d/network.modules mkinitfs-3.0.5-new/features.d/network.modules
--- mkinitfs-3.0.5/features.d/network.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/network.modules	2016-10-28 13:47:34.000000000 +0200
@@ -1,2 +1,2 @@
-kernel/drivers/net/ethernet
+kernel/drivers/net/ethernet/
 kernel/net/packet/af_packet.ko
diff -U3 -r mkinitfs-3.0.5/features.d/ocfs2.modules mkinitfs-3.0.5-new/features.d/ocfs2.modules
--- mkinitfs-3.0.5/features.d/ocfs2.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/ocfs2.modules	2016-10-28 13:47:45.000000000 +0200
@@ -1 +1 @@
-kernel/fs/ocfs2
+kernel/fs/ocfs2/
diff -U3 -r mkinitfs-3.0.5/features.d/reiserfs.modules mkinitfs-3.0.5-new/features.d/reiserfs.modules
--- mkinitfs-3.0.5/features.d/reiserfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/reiserfs.modules	2016-10-28 13:49:47.000000000 +0200
@@ -1 +1 @@
-kernel/fs/reiserfs
+kernel/fs/reiserfs/
diff -U3 -r mkinitfs-3.0.5/features.d/scsi.modules mkinitfs-3.0.5-new/features.d/scsi.modules
--- mkinitfs-3.0.5/features.d/scsi.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/scsi.modules	2016-10-28 13:49:57.000000000 +0200
@@ -1,2 +1,2 @@
 kernel/drivers/scsi/*
-kernel/drivers/message/fusion
+kernel/drivers/message/fusion/
diff -U3 -r mkinitfs-3.0.5/features.d/squashfs.modules mkinitfs-3.0.5-new/features.d/squashfs.modules
--- mkinitfs-3.0.5/features.d/squashfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/squashfs.modules	2016-10-28 13:50:02.000000000 +0200
@@ -1 +1 @@
-kernel/fs/squashfs
+kernel/fs/squashfs/
diff -U3 -r mkinitfs-3.0.5/features.d/ubifs.modules mkinitfs-3.0.5-new/features.d/ubifs.modules
--- mkinitfs-3.0.5/features.d/ubifs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/ubifs.modules	2016-10-28 13:50:08.000000000 +0200
@@ -1 +1 @@
-kernel/fs/ubifs
+kernel/fs/ubifs/
diff -U3 -r mkinitfs-3.0.5/features.d/usb.modules mkinitfs-3.0.5-new/features.d/usb.modules
--- mkinitfs-3.0.5/features.d/usb.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/usb.modules	2016-10-28 13:50:33.000000000 +0200
@@ -1,7 +1,7 @@
-kernel/drivers/usb/host
-kernel/drivers/usb/storage
-kernel/drivers/hid/usbhid
+kernel/drivers/usb/host/
+kernel/drivers/usb/storage/
+kernel/drivers/hid/usbhid/
 kernel/drivers/hid/hid-generic.ko
 kernel/drivers/hid/hid-cherry.ko
-kernel/fs/fat
-kernel/fs/nls
+kernel/fs/fat/
+kernel/fs/nls/
diff -U3 -r mkinitfs-3.0.5/features.d/virtio.modules mkinitfs-3.0.5-new/features.d/virtio.modules
--- mkinitfs-3.0.5/features.d/virtio.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/virtio.modules	2016-10-28 13:50:41.000000000 +0200
@@ -1,3 +1,3 @@
 kernel/drivers/block/virtio*
-kernel/drivers/virtio
+kernel/drivers/virtio/
 kernel/drivers/net/virtio_net*
diff -U3 -r mkinitfs-3.0.5/features.d/xfs.modules mkinitfs-3.0.5-new/features.d/xfs.modules
--- mkinitfs-3.0.5/features.d/xfs.modules	2016-06-15 12:57:27.000000000 +0200
+++ mkinitfs-3.0.5-new/features.d/xfs.modules	2016-10-28 13:50:50.000000000 +0200
@@ -1,4 +1,4 @@
 kernel/arch/*/crypto/crc32*
 kernel/arch/*/crypto/crc32*
 kernel/crypto/crc32*
-kernel/fs/xfs
+kernel/fs/xfs/
diff -U3 -r mkinitfs-3.0.5/mkinitfs.in mkinitfs-3.0.5-new/mkinitfs.in
--- mkinitfs-3.0.5/mkinitfs.in	2016-10-30 06:52:56.000000000 +0100
+++ mkinitfs-3.0.5-new/mkinitfs.in	2016-10-30 06:51:59.000000000 +0100
@@ -4,64 +4,262 @@
 sysconfdir=@sysconfdir@
 datadir=@datadir@
 
-config="$sysconfdir"/mkinitfs.conf
-init="$datadir"/initramfs-init
-fstab="$datadir"/fstab
-passwd="$datadir"/passwd
-group="$datadir"/group
+config="${sysconfdir}/mkinitfs.conf"
+init="${datadir}/initramfs-init"
+fstab="${datadir}/fstab"
+passwd="${datadir}/passwd"
+group="${datadir}/group"
+rootdir=''
 basedir=''
 tmpdir=''
 
-startdir=$PWD
+# Print files and directories while recursivly resolving links and
+# printing the names of each link visited.
+resolve_links() {
+	local name=''
+	while read -r name; do
+		# *) Check for existance.
+		# *) If it's not a link we just output it and continue, nothing more to do.
+		#
+		# *) Iteratively resolve and print all link steps.
+		# *) If the final target is NOT a directory, just print the name.
+		# *) If it is a directory, everything below that directory will be
+		#    searched and resolved.
+		if [ ! -e "$name" ]; then
+			echo "resolve_links: ${name}: No such file or directory." >&2
+			continue
+		fi
+		if [ ! -L "$name" ]; then
+			echo "${name}"
+			continue
+		fi
+		# Resolve links, all linked steps will be resolved and printed.
+		while [ -L "$name" ]; do
+			echo "$name"
+			local target="$(readlink "$name")"
+			if [ "$target" != "${target#/}" ]; then
+				# Absolute link, prefix with $basedir.
+				local name="${basedir%/}/${target#/}"
+			else
+				# Relative link, move to the directory of the link, get the
+				# resolved path for that directory and add the target name.
+				if [ -z "${target##*/*}" ]; then
+					cd -P "${name%/*}/${target%/*}"
+				else
+					cd -P "${name%/*}"
+				fi
+				local name="${PWD}/${target##*/}"
+			fi
+		done
+		if [ ! -d "$name" ]; then
+			echo "${name}"
+			continue
+		fi
+		#find "${name}" \! -type d -o \( -type d -empty \) | resolve_links
+		find "${name%/}" \! -type d -print -o \( -type d -links 2 -exec sh -c 'ls -A "{}" | grep -Eq "" || echo "{}"' \; \) | resolve_links
+	done
+}
+
+resolve_ldsos() {
+	local ld_library_path="$1"
+	shift
+	local accumulate=''
+	local last_seen_rpath=''
+	while read -r line; do
+		[ 2 -eq "${#line}" ] && continue
+		#echo "line is $line" >&2
+		case "$line" in
+		0I*)
+			echo "${line#??}"
+			continue
+			;;
+		1R*)
+			[ "$line" = "$last_seen_rpath" ] && continue
+			local last_seen_rpath="$line"
+			local ld_library_path="${line#??}
+$ld_library_path"
+			#echo "ld_library_path is now = \"$ld_library_path\"" >&2
+			continue
+			;;
+		2N*)
+			local found='N'
+			local needed="${line#??}"
+			IFS=','
+			for lib in $needed; do
+				IFS='
+'
+				local lpath=''
+				for lpath in $ld_library_path; do
+					if [ -e "${lpath}/${lib}" ]; then
+						echo "${lpath}/${lib}"
+						#echo "Found library: ${lpath}/${lib}" >&2
+						local found='Y'
+						if [ -z "$accumulate" ]; then
+							local accumulate="${lpath}/${lib}"
+						else
+							local accumulate="$accumulate
+${lpath}/${lib}"
+						fi
+						break
+					fi
+				done
+				unset IFS
+				if [ 'Y' != "$found" ]; then
+					echo "resolve_ldso_deps: Warning: Cannot find library \"$lib\". Searched in \"$ld_library_path\"." >&2
+				fi
+			done
+			unset IFS
+			continue
+			;;
+		esac
+	done
+	# No more libraries found.
+	if [ -z "$accumulate" ]; then
+		return
+	fi
+	#echo "Recursing on " >&2
+	#echo "$accumulate" | sort -u >&2
+	#echo "with ld_library_path=$ld_library_path" >&2
+	echo "$accumulate" | xargs scanelf -qF '#F0I%i
+1R%r
+2N%n' "$@" \
+		| sort -u \
+		| resolve_ldsos "$ld_library_path" "${lpath}/${lib}"
+}
+
+# Reads a list of filenames from stdin, figures out what ldso
+# dependencies there are for any ELFs found in the input and
+# outputs the list complemented by any dependencies found.
+resolve_ldso_deps() {
+	local basedir="$1"
+
+	scanelf >/dev/null 2>&1
+	local retcode=$?
+	# System doesn't have scanelf, system probably doesn't support shared libs
+	# so we just act like an empty filter and pass everything along.
+	if [ 126 -eq $retcode ] || [ 127 -eq $retcode ]; then
+		echo "No scanelf found, ldso dependencies will not be resolved." >&2
+		while read -r name; do
+			echo "$name"
+		done
+		return 0
+	fi
+
+	# Prepare, don't want to do this in a loop. This sets ld_library_path to a
+	# newline separated list of paths to search for ldso:s.
+	local ld_so_conf="${basedir%/}/etc/ld.so.conf"
+	local ld_library_path="$(echo "$LD_PRELOAD
+$LD_LIBRARY_PATH
+$([ -e "$ld_so_conf" ] && cat "$ld_so_conf")
+/lib
+/usr/lib
+/usr/local/lib" | sed -e '/^$/d' -e '/^#/d' -e 's/:/\
+/g' -e "s|^/|${basedir%/}/|" | sort -u)"
+
+	# So, we don't want to call scanelf for every filename we read as that is painfully
+	# slow. Try calling it 10k times on /bin/sh and you'll understand. Calling it once
+	# with 10k /bin/sh as arguments is blindingly fast though. First case is something
+	# like 178 secs on my i7, latter case is 0.2 secs. So, instead of calling it for
+	# every file we read, we sort out anything that is not a regular file and then let
+	# xargs accumulate as many args it can before running a scanelf on a bunch of files.
+	# We prefix the output from scanelf with 0I for interpreter, 1R for rpath and 2N
+	# for needed libraries. We then sort -u the result, echo any interpreters found,
+	# modify ld_library_path according to any rpaths found, and search ld_library_path
+	# for any needed libraries.
+	local regulars=''
+	local name=''
+	read -r regulars
+	while read -r name; do
+		echo "$name"
+		# Links we get are already resolved, we just want to check actual files.
+		if [ -L "$name" ] || [ ! -f "$name" ]; then
+			continue
+		fi
+		# Accumulate regular files.
+		local regulars="$regulars
+$name"
+	done
+
+	echo "$regulars" | xargs scanelf -qF '#F0I%i
+1R%r
+2N%n' "$@" \
+		| sort -u \
+		| resolve_ldsos "$ld_library_path" \
+		| resolve_links
+}
+
+# Expand config lines according to any globs they contain.
+# The line read should be a the name of a file to be included in the initramfs.
+# The line read should be a complete path, including any potential $basedir.
+# If the line ends in / everything below that path will be added.
+# If the line contains a globbing pattern it will be expanded and everything
+# matching the glob will be added.
+expand_globs() {
+	# This first loop expands globs in config lines.
+	local line=''
+	while read -r line; do
+		local file=''
+		IFS=''
+		for file in $line; do
+			echo "$file"
+		done
+	done | while read -r line; do
+		case "$line" in
+		*/)
+			#find "${line%/}" \! -type d -o \( -type d -empty \)
+			find "${line%/}" \! -type d -print -o \( -type d -links 2 -exec sh -c 'ls -A "{}" | grep -Eq "" || echo "{}"' \; \)
+			;;
+		*)
+			echo "$line"
+			;;
+		esac
+	done
+}
 
 feature_files() {
 	local dir="$1"
 	local suffix="$2"
-	local glob file
+	local f=''
 	for f in $features; do
-		if [ ! -f "$features_dir/$f.$suffix" ]; then
+		# Skip if there is no file for this feature with the selected suffix.
+		if [ ! -f "${features_dir}/${f}.${suffix}" ]; then
 			continue
 		fi
-		for glob in $(sed -e '/^$/d' -e '/^#/d' -e "s|^/*|$dir|" "$features_dir/$f.$suffix"); do
-			for file in $glob; do
-				if [ -d $file ]; then
-					find $file -type f
-				elif [ -e "$file" ]; then
-					echo $file
-				fi
-			done
-		done
+		# Remove comments, blank lines and translate paths to paths relative to $dir.
+		sed -e '/^$/d' -e '/^#/d' -e "s|^/*|${dir%/}/|" "${features_dir}/${f}.${suffix}" \
+			| expand_globs \
+			| resolve_links
 	done
 }
 
-initfs_base() {
-	local i= dirs= glob= file=
-	for i in dev proc sys sbin bin run .modloop lib/modules media/cdrom \
-	    etc/apk media/floppy media/usb newroot; do
-		dirs="$dirs $tmpdir/$i"
-	done
-	mkdir -p $dirs
 
-	local oldpwd="$PWD"
-	cd "${basedir}"
-	lddtree -R "$basedir" -l --no-auto-root \
-		$(feature_files "$basedir" files) \
-		\
-		| sed -e "s|^$basedir||" | sort -u \
-		| cpio --quiet -pdm "$tmpdir" || return 1
+find_files() {
+	cd "$basedir" || return 1
+	#	| xargs lddtree -R "$basedir" -l --no-auto-root \
+	#	| resolve_ldso_deps "$basedir" \
+	feature_files "$basedir" files \
+		| resolve_ldso_deps "$basedir" \
+		| sed -e "s|^${basedir%/}/||" \
+		| sort -u
+	cd "$OLDPWD" || return 1
+}
 
+initfs_base() {
+	cd "$basedir" || return 1
+	find_files \
+		| cpio --quiet -pdm "$tmpdir" || return 1
 	# copy init
-	cd "$startdir"
-	install -m755 "$init" "$tmpdir"/init || return 1
+	install -m755 "$init" "${tmpdir}/init" || return 1
 	for i in "$fstab" "$passwd" "$group"; do
-		install -Dm644 "$i" "$tmpdir"/etc/${i##*/} || return 1
+		install -Dm644 "$i" "${tmpdir}/etc/${i##*/}" || return 1
 	done
-	cd "$oldpwd"
+	cd "$OLDPWD"
 }
 
+
 find_kmod_deps() {
-	awk -v prepend="/lib/modules/$kernel/" -v modulesdep="${basedir}lib/modules/$kernel/modules.dep" '
-function recursedeps(k,		j, dep) {
+	awk -v prepend="lib/modules/${kernel}/" -v modulesdep="${basedir}/lib/modules/$kernel/modules.dep" '
+function recursedeps(k, j, dep) {
 	if (k in visited)
 		return;
 	visited[k] = 1;
@@ -95,55 +293,62 @@
 }
 
 find_kmods() {
-	local oldpwd="$PWD"
 	cd "$kerneldir" || return 1
-	for file in $(feature_files "${kerneldir}/" modules); do
-		echo ${file#${kerneldir%/}/}
-	done | find_kmod_deps
-	cd "$oldpwd"
+	feature_files "$kerneldir" modules \
+		| sed "s|${kerneldir%/}/||" \
+		| find_kmod_deps \
+		| sort -u
+	cd "$OLDPWD" || return 1
 }
 
 initfs_kmods() {
-	local glob= file= files= dirs=
-	rm -rf "$tmpdir"/lib/modules
-	# make sure we have modules.dep
-	if ! [ -f "$kerneldir"/modules.dep ]; then
-		depmod -b "${basedir}" $kernel
+	rm -rf "${tmpdir}/lib/modules"
+	# Make sure we have modules.dep.
+	if ! [ -f "${kerneldir}/modules.dep" ]; then
+		depmod -b "${basedir}" "$kernel"
 	fi
-	local oldpwd="$PWD"
-	cd "${basedir}"
-	for file in $(find_kmods); do
-		echo "${file#/}"
-	done | sort -u | cpio --quiet -pdm "$tmpdir" || return 1
+
+	cd "${basedir}" || return 1
+	find_kmods \
+		| cpio --quiet -pdm "$tmpdir" || return 1
+
+	local file=''
 	for file in modules.order modules.builtin; do
-		if [ -f "$kerneldir"/$file ]; then
-			cp "$kerneldir"/$file "$tmpdir"/lib/modules/$kernel/
+		if [ -f "${kerneldir}/$file" ]; then
+			cp "${kerneldir}/${file}" "${tmpdir}/lib/modules/${kernel}/"
 		fi
 	done
-	depmod $kernel -b "$tmpdir"
-	cd "$oldpwd"
+
+	depmod "$kernel" -b "$tmpdir"
+	cd "$OLDPWD" || return 1
 }
 
+
 initfs_firmware() {
-	rm -rf "$tmpdir"/lib/firmware
-	mkdir -p "$tmpdir"/lib/firmware
-	find "$tmpdir"/lib/modules -type f -name "*.ko" | xargs modinfo -F firmware | sort -u | while read FW; do
+	rm -rf "${tmpdir}/lib/firmware"
+	mkdir -p "${tmpdir}/lib/firmware"
+	find "${tmpdir}/lib/modules" -type f -name "*.ko" \
+		| xargs modinfo -F firmware \
+		| sort -u \
+		| while read FW; do
 		[ -e "${basedir}/lib/firmware/${FW}" ] && install -pD "${basedir}/lib/firmware/${FW}" "${tmpdir}/lib/firmware/${FW}"
 	done
 	return 0
 }
 
+
 initfs_apk_keys() {
 	# If the basedir has nothing to copy, and we're not asked to copy the host's keys, don't do anything.
-	if [ ! -d "${basedir}etc/apk/keys/" ] && [ -z "$hostkeys" ]; then
+	if [ ! -d "${basedir}/etc/apk/keys/" ] && [ -z "$hostkeys" ]; then
 		return
 	fi
 	mkdir -p "${tmpdir}/etc/apk/keys"
 	[ -n "$hostkeys" ] && cp "/etc/apk/keys/"* "${tmpdir}/etc/apk/keys/"
-	cp "${basedir}etc/apk/keys/"* "${tmpdir}/etc/apk/keys/"
+	cp "${basedir}/etc/apk/keys/"* "${tmpdir}/etc/apk/keys/"
 }
 
-initfs_cpio() {
+
+ initfs_cpio() {
 	if [ -n "$list_sources" ]; then
 		(cd "$tmpdir" && find . )
 		return
@@ -203,7 +408,7 @@
 shift $(( $OPTIND - 1 ))
 
 
-. $(readlink -f "$config")
+. "$(cd -P "${config%/*}" ; echo "${PWD}/${config##*/}")"
 
 # Override any options read from the config with what the
 # user has specifed on the commandline.
@@ -219,16 +424,16 @@
 [ -n "$arg_tmpdir"   ] && tmpdir="$arg_tmpdir"
 
 
-rootdir="${rootdir%/}/"
-[ "${rootdir}" = "${rootdir#/}" ] && rootdir="${PWD}/${rootdir}"
+rootdir="$(cd -P "${rootdir%/}/"; echo "${PWD}")"
 
-features_dir=${features_dir:-"${rootdir%/}/${sysconfdir#/}/features.d"}
+features_dir="${features_dir:-"${rootdir%/}/${sysconfdir#/}/features.d"}"
+features_dir="$(cd -P "${features_dir}"; echo "${PWD}")"
 
 if [ -n "$list_features" ]; then
-	for i in "$features_dir"/*.files "$features_dir"/*.modules; do
+	cd "$features_dir" || return 1
+	for i in *.files *.modules; do
 		[ -e "$i" ] || continue
-		local file=${i##*/}
-		echo ${file%.*}
+		echo "${i%.*}"
 	done | sort -u
 	exit 0
 fi
@@ -236,45 +441,47 @@
 if [ -z "$basedir" ]; then
 	basedir="$rootdir"
 else
-	[ "${basedir}" = "${basedir#/}" ] && basedir="${PWD}/${basedir}"
+	basedir="$(cd -P "${basedir}"; echo "${PWD}")"
 fi
 
+init="$(cd -P "${init%/*}"; echo "${PWD}/${init##*/}")"
 
-[ -n "$1" ] && kernel="$1"
-[ -z "$kernel" ] && kernel=$(uname -r)
-kerneldir="${basedir}lib/modules/$kernel"
 
+[ -n "$1" ] && kernel="$1"
+[ -z "$kernel" ] && kernel="$(uname -r)"
+kerneldir="${basedir%/}/lib/modules/${kernel}"
 if [ ! -d "$kerneldir" ]; then
 	echo "$kerneldir does not exist or is not a directory"
 	exit 1
 fi
 
-kflavor=${kernel##*-}
-[ "$kflavor" = "$kernel" ] && kflavor=vanilla
-
 if [ -z "$outfile" ]; then
-	outfile="${rootdir}boot/initramfs-${kernel}"
+	outfile="${rootdir%/}/boot/initramfs-${kernel}"
 fi
 
+if [ -n "$DEBUG_FILES" ]; then
+	find_files
+	exit 0
+fi
 if [ -n "$DEBUG_KMOD" ]; then
 	find_kmods
 	exit 0
 fi
 
+
 if [ -z "$tmpdir" ]; then
-	tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/mkinitfs.XXXXXX")
+	tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/mkinitfs.XXXXXX")" || exit
+	tmpdir="$(cd -P "$tmpdir" ; echo "$PWD")"
 else
-	mkdir -p "$tmpdir"
-fi
-
-tmpdir=$(readlink -f "$tmpdir")
-if [ '/' == "$tmpdir" ] ; then
-	echo "tmpdir must not be /"
-	exit 1
-fi
-
-if [ -z "$keeptmp" ]; then
-	[ -d "$tmpdir" ] && rm -rf "$tmpdir"
+	tmpdir="$(cd -P "$tmpdir" ; echo "$PWD")"
+	if [ '/' == "$tmpdir" ] ; then
+		echo "tmpdir must not be /"
+		exit 1
+	fi
+	if [ -z "$keeptmp" ]; then
+		[ -d "$tmpdir" ] && rm -rf "$tmpdir"
+	fi
+	mkdir -p "$tmpdir" || exit
 fi
 
 if [ -z "$list_sources" ] && [ -z "$quiet" ]; then
diff --git a/main/mkinitfs/APKBUILD b/main/mkinitfs/APKBUILD
index c75961c..2ba5c93 100644
--- a/main/mkinitfs/APKBUILD
+++ b/main/mkinitfs/APKBUILD
@@ -2,13 +2,13 @@
pkgname=mkinitfs
pkgver=3.0.5
_ver=${pkgver%_git*}
pkgrel=5
pkgrel=6
pkgdesc="Tool to generate initramfs images for Alpine"
url="http://git.alpinelinux.org/cgit/mkinitfs"
makedepends_build=""
makedepends_host="kmod-dev util-linux-dev cryptsetup-dev linux-headers"
makedepends="$makedepends_build $makedepends_host"
depends="busybox apk-tools>=2.0 lddtree>=1.25"
depends="busybox apk-tools>=2.0 scanelf"
install="$pkgname.pre-upgrade $pkgname.post-install $pkgname.post-upgrade"
triggers="$pkgname.trigger=/usr/share/kernel/*"
source="http://dev.alpinelinux.org/archive/$pkgname/$pkgname-$_ver.tar.xz
@@ -17,6 +17,7 @@ source="http://dev.alpinelinux.org/archive/$pkgname/$pkgname-$_ver.tar.xz
	0001-group-sync-with-alpine-baselayout.patch
	0001-mkinitfs-add-K-flag-to-copy-host-keys-to-new-initram.patch
	0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch
	0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch
	"
arch="all"
license="GPL2"
@@ -37,16 +38,19 @@ a4227598291fa7338ad1128bfef3720c  0001-init-add-support-for-ttyMFD-and-ttyUSB-se
a74631b5f40001dd259a2a6ebcaec544  0001-init-dont-use-local-in-global-scope.patch
db888a1a502fe281bbe0b1add81bf62f  0001-group-sync-with-alpine-baselayout.patch
a46eb97de6742400ca04777a0a8478b2  0001-mkinitfs-add-K-flag-to-copy-host-keys-to-new-initram.patch
fadbbb5e49ead2c6fd8d4e880c83bafa  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch"
fadbbb5e49ead2c6fd8d4e880c83bafa  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch
baef5ed6d50f5087135f84036a6f3ea6  0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch"
sha256sums="3f13619f161c506796b91f2db17644eba25c2ffc923aa0c8fff0213d1f660aa4  mkinitfs-3.0.5.tar.xz
17547dbc77bd19d940550ea6243b44212d21a6797aee4202e4e22c31143bf9e6  0001-init-add-support-for-ttyMFD-and-ttyUSB-serial-consol.patch
7253cd8ebc1487e4bfb98d81edd68b24a4364e9fa8e48c73fc6903f2077b056e  0001-init-dont-use-local-in-global-scope.patch
17b8a04db505eea9e176da00f9389ca80f65ed88c0288f6785f9ab108164361a  0001-group-sync-with-alpine-baselayout.patch
8daccc844576f0b06fc9c15a30d750bfecda019b476a0be4cf9bcd7139e219cf  0001-mkinitfs-add-K-flag-to-copy-host-keys-to-new-initram.patch
c24fb5b60a1bdd9d0888cd9ce76996fe5c45cb384b0e30a8837e3cf3724a7727  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch"
c24fb5b60a1bdd9d0888cd9ce76996fe5c45cb384b0e30a8837e3cf3724a7727  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch
042cc227a278cb43dd23383d6756a1682c00e9b7d27fed11ba1b7c6164cd0295  0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch"
sha512sums="246f25ce3fb65ea19dbe611ad44a106930c28b2c7111908462d4a252433011280715b2cf87ee81cc6f0860679fd1d0a109d03040647498137e42b22ccc711662  mkinitfs-3.0.5.tar.xz
35b4cf3f74e394d87b321d335ec4dff6973bfd9a38cdc81609e21e025ee3fb9af7d2744cf9941531603df829af1f7fba433074915ba88a688d375cfe40dad07a  0001-init-add-support-for-ttyMFD-and-ttyUSB-serial-consol.patch
ca1bd66bc6d366dc74da389397f3e0d81b3afa21a534269230ab33f415e633b19ce54327b78713847461b67d6d23a85019c79e1fbbf1a964ee0bd26013ddf33f  0001-init-dont-use-local-in-global-scope.patch
2736650e0c06d47f2cd0dcc4a9c3d575b2b5284ee8d1aa0cccd45b5855ff6704171f5b7761b8c88536c8dca84943810e9332db9f2e03681f6355c5068a3a3092  0001-group-sync-with-alpine-baselayout.patch
712038089d3b58a3937549f25412803291690c992bd8e3002f02a46fc9c24903c94086704b5def3aecb422d46d7c501beeaa665000bc7da6ec20965e52eca5a1  0001-mkinitfs-add-K-flag-to-copy-host-keys-to-new-initram.patch
81880870195b6c64d55570954be2c8e879f58f779ec165ae34504bac43b969dfcb79b0469ab96100df12fb17a7e7b362bb52bbc3402705a931cd41f7304c6d0d  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch"
81880870195b6c64d55570954be2c8e879f58f779ec165ae34504bac43b969dfcb79b0469ab96100df12fb17a7e7b362bb52bbc3402705a931cd41f7304c6d0d  0002-mkinitfs_cmdline-override_rootdir-support_honor-tmpdir.patch
2b9c9ca7b28c33ccbe854449f5b879620f3bc9feca801a05f9ec8a70d46471bf835d1660a05f49b1d2d8b484175265fce53577269aff711e7a1563e8d4a0aa37  0003-mkinitfs-bugfixes_speedup_data-code-sep_new-syntax_cleanup.patch"
diff --git a/main/mkinitfs/mkinitfs.pre-upgrade b/main/mkinitfs/mkinitfs.pre-upgrade
index 0ece527..d49fb34 100644
--- a/main/mkinitfs/mkinitfs.pre-upgrade
+++ b/main/mkinitfs/mkinitfs.pre-upgrade
@@ -7,7 +7,7 @@ for i in files modules; do
		case "$j" in
		*.apk-new) continue;;
		esac
		mv $j /etc/mkinitfs/features.d/${j##*/}.$i
		mv "$j" "/etc/mkinitfs/features.d/${j##*/}.$i"
	done
done
exit 0
diff --git a/main/mkinitfs/mkinitfs.trigger b/main/mkinitfs/mkinitfs.trigger
index cedf363..4db9b4a 100644
--- a/main/mkinitfs/mkinitfs.trigger
+++ b/main/mkinitfs/mkinitfs.trigger
@@ -3,16 +3,16 @@
for i in "$@"; do
	# get last element in path
	flavor=${i##*/}
	if ! [ -f "$i"/kernel.release ]; then
	if ! [ -f "${i}/kernel.release" ]; then
		# kernel was uninstalled
		rm -f $( readlink -f /boot/initramfs-$flavor ) \
			/boot/initramfs-$flavor /boot/vmlinuz-$flavor \
			/boot/$flavor /boot/$flavor.gz /$flavor /$flavor.gz
		rm -f $(readlink -f "/boot/initramfs-$flavor") \
			"/boot/initramfs-$flavor" "/boot/vmlinuz-$flavor" \
			"/boot/$flavor" "/boot/${flavor}.gz" "/$flavor" "/${flavor}.gz"
		continue
	fi
	abi_release=$(cat "$i"/kernel.release)
	initfs=initramfs-$flavor
	mkinitfs -o /boot/$initfs $abi_release
	abi_release=$(cat "${i}/kernel.release")
	initfs="initramfs-$flavor"
	mkinitfs -o "/boot/$initfs" "$abi_release"
done

# extlinux will use path relative partition, so if /boot is on a
@@ -23,8 +23,8 @@ fi

# cleanup unused initramfs
for i in /boot/initramfs-[0-9]*; do
	[ -f $i ] || continue
	if ! [ -f /boot/vmlinuz-${i#/boot/initramfs-} ]; then
	[ -f "$i" ] || continue
	if ! [ -f "/boot/vmlinuz-${i#/boot/initramfs-}" ]; then
		rm "$i"
	fi
done
-- 
2.10.0


-- 
A: Because it messes up the order in which people normally read text. 
Q: Why is top-posting such a bad thing? 


---
Unsubscribe:  alpine-aports+unsubscribe@lists.alpinelinux.org
Help:         alpine-aports+help@lists.alpinelinux.org
---
Hi,

Thank you very much for this patch. Do you think you could split it up
and send a patch againt the mkinitfs git repository instead of aports?

http://git.alpinelinux.org/cgit/mkinitfs
https://github.com/alpinelinux/mkinitfs

Either of those are fine.


On Sun, 6 Nov 2016 00:34:21 +0100
Linus Swälas <linus.swalas@borderless.se> wrote: