ProDOS-Utilities/main.go

87 lines
2.3 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"github.com/tjboldt/ProDOS-Utilities/prodos"
)
func main() {
var fileName string
var pathName string
var command string
var outFileName string
var blockNumber int
var volumeSize int
var volumeName string
flag.StringVar(&fileName, "driveimage", "", "A ProDOS format drive image")
flag.StringVar(&pathName, "path", "", "Path name in ProDOS drive image")
flag.StringVar(&command, "command", "ls", "Command to execute: ls, get, put, volumebitmap, readblock, writeblock, createvolume, delete")
flag.StringVar(&outFileName, "outfile", "export.bin", "Name of file to write")
flag.IntVar(&volumeSize, "volumesize", 65535, "Number of blocks to create the volume with")
flag.StringVar(&volumeName, "volumename", "NO.NAME", "Specifiy a name for the volume from 1 to 15 characters")
flag.IntVar(&blockNumber, "block", 0, "A block number to read/write from 0 to 65535")
flag.Parse()
if len(fileName) == 0 {
fmt.Printf("Missing driveimage. Run with --help for more info.\n")
os.Exit(1)
}
switch command {
case "ls":
file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil {
os.Exit(1)
}
volumeHeader, fileEntries := prodos.ReadDirectory(file, pathName)
prodos.DumpDirectory(volumeHeader, fileEntries)
case "volumebitmap":
file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil {
os.Exit(1)
}
volumeBitmap := prodos.ReadVolumeBitmap(file)
prodos.DumpBlock(volumeBitmap)
case "get":
file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil {
os.Exit(1)
}
if len(pathName) == 0 {
fmt.Println("Missing pathname")
os.Exit(1)
}
getFile := prodos.LoadFile(file, pathName)
outFile, err := os.Create(outFileName)
if err != nil {
os.Exit(1)
}
outFile.Write(getFile)
case "readblock":
file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil {
os.Exit(1)
}
block := prodos.ReadBlock(file, blockNumber)
outFile, err := os.Create(outFileName)
if err != nil {
os.Exit(1)
}
outFile.Write(block)
case "createvolume":
prodos.CreateVolume(fileName, volumeName, volumeSize)
case "delete":
file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil {
os.Exit(1)
}
prodos.DeleteFile(file, pathName)
default:
fmt.Printf("Command %s not handle\n", command)
os.Exit(1)
}
}