| #!/usr/bin/env bash | 
 |  | 
 | function usage { | 
 |   echo "Usage: prepare_image image_type kernel_image rootfs_image header_size" | 
 |   echo "Pad root and kernel image to the correct size and append the jffs2 start marker as needed" | 
 |   exit 1 | 
 | } | 
 |  | 
 | function pad_file { | 
 | 	echo "Padding $1 to size $2" | 
 | 	dd if=$1 of=$1.paddingtempfile bs=$2 count=1 conv=sync &> /dev/null | 
 | 	mv $1.paddingtempfile $1 | 
 | } | 
 |  | 
 | #filesize filestart padding | 
 | function calc_pad { | 
 | 	[  $((($1 + $2) & ($3 - 1))) == 0 ] && { | 
 | 		echo $1 | 
 | 		return 0 | 
 |         } | 
 | 	echo $(((($1 + $2) | ($3 - 1)) + 1 - $2)) | 
 | } | 
 |  | 
 | function prep_squash { | 
 | 	echo "kernel_size: $kernel_size" | 
 | 	echo "header_size: $header_size" | 
 | 	kernel_pad_size=$(calc_pad $kernel_size $header_size 32) | 
 | 	kernel_end=$(($header_size + $kernel_pad_size)) | 
 | 	pad_file $kernel_image $kernel_pad_size | 
 |  | 
 | 	#4k | 
 | 	rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 4096) | 
 | 	pad_file $rootfs_image $rootfs_pad_size | 
 | 	echo -ne '\xde\xad\xc0\xde' >> $rootfs_image | 
 | 	 | 
 | 	#8k | 
 | 	rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 8192) | 
 | 	[ $rootfs_pad_size == rootfs_old_padsize ] || { | 
 | 		pad_file $rootfs_image $rootfs_pad_size | 
 | 		rootfs_old_padsize=$rootfs_pad_size | 
 | 		echo -ne '\xde\xad\xc0\xde' >> $rootfs_image | 
 | 	} | 
 |  | 
 | 	#64k | 
 | 	rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 65536) | 
 | 	[ $rootfs_pad_size == rootfs_old_padsize ] || { | 
 | 		pad_file $rootfs_image $rootfs_pad_size | 
 | 		rootfs_old_padsize=$rootfs_pad_size | 
 | 		echo -ne '\xde\xad\xc0\xde' >> $rootfs_image | 
 | 	} | 
 |  | 
 | 	#128k | 
 | 	rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 131072) | 
 | 	[ $rootfs_pad_size == rootfs_old_padsize ] || { | 
 | 		pad_file $rootfs_image $rootfs_pad_size | 
 | 		rootfs_old_padsize=$rootfs_pad_size | 
 | 		echo -ne '\xde\xad\xc0\xde' >> $rootfs_image | 
 | 	} | 
 | 	 | 
 | } | 
 |  | 
 | function prep_jffs2 { | 
 | 	kernel_pad_size=$(calc_pad $kernel_size $header_size $1) | 
 | 	pad_file $kernel_image $kernel_pad_size | 
 | } | 
 |  | 
 | image_type=$1 | 
 | kernel_image=$2 | 
 | rootfs_image=$3 | 
 | header_size=$4 | 
 |  | 
 | if [ -z "$image_type" ] || [ -z "$rootfs_image" ] || [ -z "$kernel_image" ] || [ -z "$header_size" ]; then | 
 | 	usage | 
 | fi | 
 |  | 
 | if [ ! -e "$rootfs_image" ] || [ -z "$kernel_image" ]; then | 
 | 	echo "input file not found" | 
 | 	exit 1 | 
 | fi | 
 |  | 
 | kernel_size=$(stat -c "%s" "$kernel_image") | 
 | rootfs_size=$(stat -c "%s" "$rootfs_image") | 
 |  | 
 | if [ $kernel_size == 0 ] || [ $rootfs_size == 0 ]; then | 
 | 	echo "kernel or rootfs empty" | 
 | 	exit 1 | 
 | fi | 
 |  | 
 | case $image_type in | 
 | 	squashfs ) | 
 | 		prep_squash ;; | 
 | 	jffs2-64k ) | 
 | 		prep_jffs2 65536 ;; | 
 | 	jffs2-128k ) | 
 | 		prep_jffs2 131072 ;; | 
 | 	* ) | 
 | 		echo "Unknown image type" | 
 | 		exit 1 ;; | 
 | esac | 
 |  |