Improve error handling and fix putall command

This commit is contained in:
Terence Boldt 2023-01-16 20:32:54 -05:00
parent ab3b397139
commit ee3d187fb3
4 changed files with 26 additions and 9 deletions

View File

@ -107,8 +107,9 @@ func main() {
os.Exit(1) os.Exit(1)
} }
defer file.Close() defer file.Close()
fileInfo, err := os.Stat(fileName)
err = prodos.WriteFileFromFile(file, pathName, fileType, auxType, inFileName) err = prodos.WriteFileFromFile(file, pathName, fileType, auxType, fileInfo.ModTime(), inFileName)
if err != nil { if err != nil {
fmt.Printf("Failed to write file %s", err) fmt.Printf("Failed to write file %s", err)
} }
@ -149,7 +150,7 @@ func main() {
defer file.Close() defer file.Close()
prodos.CreateVolume(file, volumeName, volumeSize) prodos.CreateVolume(file, volumeName, volumeSize)
case "putall": case "putall":
file, err := os.Create(fileName) file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil { if err != nil {
fmt.Printf("failed to create file: %s\n", err) fmt.Printf("failed to create file: %s\n", err)
return return

View File

@ -8,6 +8,8 @@
package prodos package prodos
import ( import (
"errors"
"fmt"
"io" "io"
) )
@ -16,6 +18,10 @@ func ReadBlock(reader io.ReaderAt, block int) ([]byte, error) {
buffer := make([]byte, 512) buffer := make([]byte, 512)
_, err := reader.ReadAt(buffer, int64(block)*512) _, err := reader.ReadAt(buffer, int64(block)*512)
if err != nil {
errString := fmt.Sprintf("failed to read block %04X: %s", block, err.Error())
err = errors.New(errString)
}
return buffer, err return buffer, err
} }
@ -23,5 +29,10 @@ func ReadBlock(reader io.ReaderAt, block int) ([]byte, error) {
// WriteBlock writes a block to a ProDOS volume from a byte array // WriteBlock writes a block to a ProDOS volume from a byte array
func WriteBlock(writer io.WriterAt, block int, buffer []byte) error { func WriteBlock(writer io.WriterAt, block int, buffer []byte) error {
_, err := writer.WriteAt(buffer, int64(block)*512) _, err := writer.WriteAt(buffer, int64(block)*512)
if err != nil {
errString := fmt.Sprintf("failed to write block %04X: %s", block, err.Error())
err = errors.New(errString)
}
return err return err
} }

View File

@ -43,7 +43,7 @@ func LoadFile(reader io.ReaderAt, path string) ([]byte, error) {
} }
// WriteFile writes a file to a ProDOS volume from a byte array // WriteFile writes a file to a ProDOS volume from a byte array
func WriteFile(readerWriter ReaderWriterAt, path string, fileType int, auxType int, buffer []byte) error { func WriteFile(readerWriter ReaderWriterAt, path string, fileType int, auxType int, createdTime time.Time, modifiedTime time.Time, buffer []byte) error {
directory, fileName := GetDirectoryAndFileNameFromPath(path) directory, fileName := GetDirectoryAndFileNameFromPath(path)
existingFileEntry, _ := GetFileEntry(readerWriter, path) existingFileEntry, _ := GetFileEntry(readerWriter, path)
@ -85,8 +85,8 @@ func WriteFile(readerWriter ReaderWriterAt, path string, fileType int, auxType i
} }
fileEntry.FileName = fileName fileEntry.FileName = fileName
fileEntry.BlocksUsed = len(blockList) fileEntry.BlocksUsed = len(blockList)
fileEntry.CreationTime = time.Now() fileEntry.CreationTime = createdTime
fileEntry.ModifiedTime = time.Now() fileEntry.ModifiedTime = modifiedTime
fileEntry.AuxType = auxType fileEntry.AuxType = auxType
fileEntry.EndOfFile = len(buffer) fileEntry.EndOfFile = len(buffer)
fileEntry.FileType = fileType fileEntry.FileType = fileType

View File

@ -8,9 +8,11 @@ package prodos
import ( import (
"encoding/binary" "encoding/binary"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"time"
) )
// AddFilesFromHostDirectory fills the root volume with files // AddFilesFromHostDirectory fills the root volume with files
@ -30,8 +32,8 @@ func AddFilesFromHostDirectory(
return err return err
} }
if !file.IsDir() && info.Size() > 0 && info.Size() <= 0x1000000 { if file.Name()[0] != '.' && !file.IsDir() && info.Size() > 0 && info.Size() <= 0x1000000 {
err = WriteFileFromFile(readerWriter, "", 0, 0, filepath.Join(directory, file.Name())) err = WriteFileFromFile(readerWriter, "", 0, 0, info.ModTime(), filepath.Join(directory, file.Name()))
if err != nil { if err != nil {
return err return err
} }
@ -42,15 +44,18 @@ func AddFilesFromHostDirectory(
} }
// WriteFileFromFile writes a file to a ProDOS volume from a host file // WriteFileFromFile writes a file to a ProDOS volume from a host file
func WriteFileFromFile(readerWriter ReaderWriterAt, pathName string, fileType int, auxType int, inFileName string) error { func WriteFileFromFile(readerWriter ReaderWriterAt, pathName string, fileType int, auxType int, modifiedTime time.Time, inFileName string) error {
fmt.Printf("WriteFileFromFile: %s\n", inFileName)
inFile, err := os.ReadFile(inFileName) inFile, err := os.ReadFile(inFileName)
if err != nil { if err != nil {
fmt.Println("failed to read file")
return err return err
} }
if auxType == 0 && fileType == 0 { if auxType == 0 && fileType == 0 {
auxType, fileType, inFile, err = convertFileByType(inFileName, inFile) auxType, fileType, inFile, err = convertFileByType(inFileName, inFile)
if err != nil { if err != nil {
fmt.Println("failed to convert file")
return err return err
} }
} }
@ -67,7 +72,7 @@ func WriteFileFromFile(readerWriter ReaderWriterAt, pathName string, fileType in
} }
} }
return WriteFile(readerWriter, pathName, fileType, auxType, inFile) return WriteFile(readerWriter, pathName, fileType, auxType, time.Now(), modifiedTime, inFile)
} }
func convertFileByType(inFileName string, inFile []byte) (int, int, []byte, error) { func convertFileByType(inFileName string, inFile []byte) (int, int, []byte, error) {