diff --git a/main.go b/main.go index c6e58fb..18ef9ac 100644 --- a/main.go +++ b/main.go @@ -107,8 +107,9 @@ func main() { os.Exit(1) } 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 { fmt.Printf("Failed to write file %s", err) } @@ -149,7 +150,7 @@ func main() { defer file.Close() prodos.CreateVolume(file, volumeName, volumeSize) case "putall": - file, err := os.Create(fileName) + file, err := os.OpenFile(fileName, os.O_RDWR, 0755) if err != nil { fmt.Printf("failed to create file: %s\n", err) return diff --git a/prodos/block.go b/prodos/block.go index dd94d54..92cffa4 100644 --- a/prodos/block.go +++ b/prodos/block.go @@ -8,6 +8,8 @@ package prodos import ( + "errors" + "fmt" "io" ) @@ -16,6 +18,10 @@ func ReadBlock(reader io.ReaderAt, block int) ([]byte, error) { buffer := make([]byte, 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 } @@ -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 func WriteBlock(writer io.WriterAt, block int, buffer []byte) error { _, 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 } diff --git a/prodos/file.go b/prodos/file.go index e15eff9..89cae3e 100644 --- a/prodos/file.go +++ b/prodos/file.go @@ -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 -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) existingFileEntry, _ := GetFileEntry(readerWriter, path) @@ -85,8 +85,8 @@ func WriteFile(readerWriter ReaderWriterAt, path string, fileType int, auxType i } fileEntry.FileName = fileName fileEntry.BlocksUsed = len(blockList) - fileEntry.CreationTime = time.Now() - fileEntry.ModifiedTime = time.Now() + fileEntry.CreationTime = createdTime + fileEntry.ModifiedTime = modifiedTime fileEntry.AuxType = auxType fileEntry.EndOfFile = len(buffer) fileEntry.FileType = fileType diff --git a/prodos/host.go b/prodos/host.go index dac130a..9024774 100644 --- a/prodos/host.go +++ b/prodos/host.go @@ -8,9 +8,11 @@ package prodos import ( "encoding/binary" + "fmt" "os" "path/filepath" "strings" + "time" ) // AddFilesFromHostDirectory fills the root volume with files @@ -30,8 +32,8 @@ func AddFilesFromHostDirectory( return err } - if !file.IsDir() && info.Size() > 0 && info.Size() <= 0x1000000 { - err = WriteFileFromFile(readerWriter, "", 0, 0, filepath.Join(directory, file.Name())) + if file.Name()[0] != '.' && !file.IsDir() && info.Size() > 0 && info.Size() <= 0x1000000 { + err = WriteFileFromFile(readerWriter, "", 0, 0, info.ModTime(), filepath.Join(directory, file.Name())) if err != nil { return err } @@ -42,15 +44,18 @@ func AddFilesFromHostDirectory( } // 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) if err != nil { + fmt.Println("failed to read file") return err } if auxType == 0 && fileType == 0 { auxType, fileType, inFile, err = convertFileByType(inFileName, inFile) if err != nil { + fmt.Println("failed to convert file") 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) {