#! /bin/sh

#
# UC1541 Virtual filesystem executive v0.1

# This is for accessing disk image files for the Commodore VIC20/C64/C128
# It requires the utility c1541 that comes bundled with Vice, the emulator
# for the VIC20, C64, C128 and other computers made by Commodore.

# Copyright (C) 2008 Jacques Pelletier
# May be distributed under the terms of the GNU Public License
# <jpelletier@ieee.org>
#

# Define which archiver you are using with appropriate options
C1541="c1541"

# There are no time stamps in the disk image, so a bogus timestamp is displayed
mc_c1541_fs_list()
{
    if [ x"$UID" = x ]; then
        UID=`id -ru 2>/dev/null`
        if [ "x$UID" = "x" ]; then
            UID=0
        fi
    fi
    $C1541 "$1" -list | @AWK@ -v uid=$UID '
BEGIN { FS = "\"" }
/No LINES!/ { next }
/BLOCKS FREE/ { next }
$1 == 0 { next }
{ 
  printf "-rw-r--r--   1 %-8d %-8d %8d Jan 01 1980 00:00 %s\n", uid, 0, $1 * 256, $2
}' 2>/dev/null
}

# Command: copyout archivename storedfilename extractto
# -read image 1541name [fsname]
mc_c1541_fs_copyout()
{
	$C1541 "$1" -read "$2" 2> /dev/null
	mv "$2" "$3"
}

# FIXME mc can't do chown of the file inside the archive
# Command: copyin archivename storedfilename sourcefile
# -write image fsname [1541name]
mc_c1541_fs_copyin()
{
	mv "$3" "$2"
	$C1541 "$1" -write "$2" 2> /dev/null
}

# Command: rm archivename storedfilename
# -delete image files
mc_c1541_fs_rm()
{
	$C1541 "$1" -delete "$2" 2> /dev/null
}

# The main routine
umask 077

cmd="$1"
shift

case "$cmd" in
   list) 	mc_c1541_fs_list    "$@" ;;
   copyout) mc_c1541_fs_copyout "$@" ;;
#   copyin) 	mc_c1541_fs_copyin  "$@" ;;
   rm) 		mc_c1541_fs_rm      "$@" ;;
   *)       exit 1 ;;
esac
exit 0
