##
# Create disk image with contents of the run directory
#
# \param --image-disk-size   disk size in MiB
#

source [genode_dir]/tool/run/grub2.inc


proc image_disk_size { } { return [get_cmd_arg --image-disk-size 0] }


##
# Create disk image with the content of the run directory
#
proc run_image { {unused ""} } {

	set sgdisk [installed_command sgdisk]

	# make copy of template grub2 header image
	exec cp [get_grub2_dir]/boot/grub2-head.img [run_dir].header

	# remove template partition
	exec $sgdisk --delete=3 [run_dir].header

	# calculate size of grub2 header and the size of Genode scenario
	set size_header [expr [regsub {\s.*} [exec du -b  [run_dir].header] {}]]
	set size_run    [expr [regsub {\s.*} [exec du -skL [run_dir]] {}]]

	# try to compensate ext2 overhead in disk size
	set ext2_overhead 768

	if {[image_disk_size] > 0} {
		set disk_size_kb [expr [image_disk_size] * 1024]
	} else {
		set disk_size_kb [expr ($size_run + $ext2_overhead) / 32 * 32]
	}

	# setup partition with content
	exec dd if=/dev/zero of=[run_dir].partition bs=1k count=$disk_size_kb 2>/dev/null
	exec [installed_command mkfs.ext2] -L GENODE -q -T default [run_dir].partition

	# copy content to disk image
	foreach file [exec find [run_dir]] {
		set filename [string replace $file 0 [string length [run_dir]] ""]
		if {[string length $filename] == 0} {
			continue
		}

		if {[file isdirectory $file]} {
			exec [installed_command e2mkdir] [run_dir].partition:$filename
		} else {
			exec [installed_command e2cp] $file [run_dir].partition:$filename
		}
	}

	# calculate start/end sector of content partition
	set first_sector [expr $size_header / 512]
	set last_sector [expr ((($size_header + ($disk_size_kb * 1024)) / 512) - 1)]

	# add free space for the backup gpt at the end of disk
	set sector_backup [exec $sgdisk --info=1 [run_dir].header]
	set sector_backup [regexp -all -line -inline {First sector: ([0-9]+)} $sector_backup]
	set sector_backup [lindex $sector_backup 1]

	exec dd if=/dev/zero of=[run_dir].empty bs=512 count=$sector_backup 2>/dev/null

	# merge final image from GRUB2 head and partition
	exec cat [run_dir].header [run_dir].partition [run_dir].empty > [run_dir].img

	# cleanup
	exec rm [run_dir].empty
	exec rm [run_dir].header
	exec rm [run_dir].partition

	# move backup GPT to the end of the disk
	exec $sgdisk --move-second-header [run_dir].img

	# create partition table entry pointing to the content
	exec $sgdisk --new=3:$first_sector:$last_sector [run_dir].img
	exec $sgdisk --change-name=3:GENODE [run_dir].img

	# create hybrid MBR
	exec $sgdisk --hybrid [run_dir].img

	set size_image [expr [regsub {\s.*} [exec du -sk [run_dir].img] {}]]
	puts "Created image file [run_dir].img (${size_image}kiB)"
}