diff options
Diffstat (limited to 'src/vfs/extfs/helpers/hp48+.in')
-rw-r--r-- | src/vfs/extfs/helpers/hp48+.in | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/vfs/extfs/helpers/hp48+.in b/src/vfs/extfs/helpers/hp48+.in new file mode 100644 index 0000000..17c03ab --- /dev/null +++ b/src/vfs/extfs/helpers/hp48+.in @@ -0,0 +1,132 @@ +#!/bin/sh +# +# Written by Christofer Edvardsen <ce@earthling.net>, Feb 1998 +# +# This script makes it possible to view and copy files to/from a hp48 +# (tested with a HP48G and the emulator x48) +# +# To use the hp48 external filesystem: +# - read the relevant parts of your HP48 manual +# - install kermit +# - connect the HP48 to your computer or start x48 +# - below change the line which reflects the serial device you use +# - configure your HP48 (<left shift> - i/o - iopar): +# port: wire +# baud: 9600 +# transfer format: binary (fast transfers) or +# ascii (editable on the pc) +# - start the server on the HP48: <left shift> - i/o - srvr - serve +# or the shortcut <right shift> - <right arrow> +# - on MC's commandline enter "cd hp48://" +# +# Make sure you have kermit installed and that it's using the right serial +# device by changing /dev/ttyXX on the next line +AWK=@AWK@ +KERMIT=${MC_TEST_EXTFS_LIST_CMD:-"kermit -l /dev/ttyS1 -b 9600"} + +NOW=`date +"%m-%d-%Y %H:%M"` + +hp48_cmd() +{ +$KERMIT -C "SET EXIT WARNING OFF,REMOTE $1,QUIT" +} + +hp48_cd() +{ +(echo SET EXIT WARNING OFF;echo REMOTE HOST HOME +for HP48_DIR in `echo "$1" | tr '/' ' '`;do + if [ "x$HP48_DIR" != "x." ];then echo REMOTE HOST "$HP48_DIR"; fi +done +echo QUIT)| $KERMIT -B >/dev/null +} + +# +# Parses the reply to the DIRECTORY command. +# +# Here's an example reply (taken from [1][2]): +# +# { HOME } 105617 +# STRAY 185.5 Directory 29225 +# YEN 30.5 Program 53391 +# JYTLIGHT 21848.5 String 62692 +# IOPAR 37.5 List 61074 +# +# The meaning of the fields (according to [3][4]): +# +# { Current_directory } Free_space +# Object_name Object_size_bytes Object_type Object_CRC +# ... +# +# [1] http://newarea48.tripod.com/kermit.html +# [2] http://www.hpmuseum.org/forum/thread-4684.html +# [3] https://groups.google.com/d/msg/comp.sys.hp48/bYTCu9K3k20/YWQfF--W3EEJ +# [4] http://www.columbia.edu/kermit/hp48.html (also has a link to the HP's user manual). +# +hp48_parser() +{ +HP48_DIRS= + +read -r INPUT +while [ "x$INPUT" != "xEOF" ] +do + set -- $INPUT + + obj_name=$1 + obj_size=$2 + obj_type=$3 + + obj_size=`echo $obj_size | $AWK '{ print int($0) }'` # Truncates floats to ints; anything else to "0". + + if [ "$obj_size" != "0" ]; then # Skips the 1st reply line (purportedly there aren't zero-size files b/c, according to resource [4], the size is "including name"). + case "$obj_type" in + Directory) + HP48_DIRS="$HP48_DIRS $obj_name" + printf "%crwxr-xr-x 1 %-8d %-8d %8d %s %s\n" 'd' \ + 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name" + ;; + *) + printf "%crw-r--r-- 1 %-8d %-8d %8d %s %s\n" '-' \ + 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name" + ;; + esac + fi + + read -r INPUT +done + +for HP48_DIR in $HP48_DIRS; +do + HP48_PDIR="$HP48_CDIR" + HP48_CDIR="$HP48_CDIR/$HP48_DIR"; hp48_cmd "HOST $HP48_DIR" >/dev/null + hp48_list + HP48_CDIR="$HP48_PDIR"; hp48_cmd "HOST UPDIR" >/dev/null +done +} + +hp48_list() +{ +# It's hard to see why this "EOF" thing is needed. The loop above can be changed to "while read -r obj_name ...". @TODO. +{ hp48_cmd "DIRECTORY"; echo; echo EOF; } | hp48_parser +} + +# override any locale for dates +LC_ALL=C +export LC_ALL + +case "$1" in +list) HP48_CDIR= + hp48_cmd "HOST HOME" >/dev/null + hp48_list + exit 0;; +copyout) + cd "`dirname "$4"`" + hp48_cd "`dirname "$3"`" + $KERMIT -B -g "`basename "$3"`" -a "$4" >/dev/null + exit 0;; +copyin) + cd "`dirname "$4"`" + hp48_cd "`dirname "$3"`" + $KERMIT -B -s "$4" -a "`basename "$3"`" >/dev/null + exit 0;; +esac +exit 1 |