diff --git a/diskfs.go b/diskfs.go index f0952a09..75fa5367 100644 --- a/diskfs.go +++ b/diskfs.go @@ -8,98 +8,6 @@ // This is not intended as a replacement for operating system filesystem and disk drivers. Instead, // it is intended to make it easy to work with partitions, partition tables and filesystems directly // without requiring operating system mounts. -// -// Some examples: -// -// 1. Create a disk image of size 10MB with a FAT32 filesystem spanning the entire disk. -// -// import diskfs "github.com/diskfs/go-diskfs" -// size := 10*1024*1024 // 10 MB -// -// diskImg := "/tmp/disk.img" -// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) -// -// fs, err := disk.CreateFilesystem(0, diskfs.TypeFat32) -// -// 2. Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB), -// of size 10MB filled with a FAT32 filesystem. -// -// import diskfs "github.com/diskfs/go-diskfs" -// -// diskSize := 10*1024*1024 // 10 MB -// -// diskImg := "/tmp/disk.img" -// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) -// -// table := &mbr.Table{ -// LogicalSectorSize: 512, -// PhysicalSectorSize: 512, -// Partitions: []*mbr.Partition{ -// { -// Bootable: false, -// Type: Linux, -// Start: 2048, -// Size: 20480, -// }, -// }, -// } -// -// fs, err := disk.CreateFilesystem(1, diskfs.TypeFat32) -// -// 3. Create a disk of size 20MB with a GPT partition table, a single partition beginning at block 2048 (1MB), -// of size 10MB, and fill with the contents from the 10MB file "/root/contents.dat" -// -// import diskfs "github.com/diskfs/go-diskfs" -// -// diskSize := 10*1024*1024 // 10 MB -// -// diskImg := "/tmp/disk.img" -// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) -// -// table := &gpt.Table{ -// LogicalSectorSize: 512, -// PhysicalSectorSize: 512, -// Partitions: []*gpt.Partition{ -// { -// LogicalSectorSize: 512, -// PhysicalSectorSize: 512, -// ProtectiveMBR: true, -// }, -// }, -// } -// -// f, err := os.Open("/root/contents.dat") -// written, err := disk.WritePartitionContents(1, f) -// -// 4. Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB), -// of size 10MB filled with a FAT32 filesystem, and create some directories and files in that filesystem. -// -// import diskfs "github.com/diskfs/go-diskfs" -// -// diskSize := 10*1024*1024 // 10 MB -// -// diskImg := "/tmp/disk.img" -// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) -// -// table := &mbr.Table{ -// LogicalSectorSize: 512, -// PhysicalSectorSize: 512, -// Partitions: []*mbr.Partition{ -// { -// Bootable: false, -// Type: Linux, -// Start: 2048, -// Size: 20480, -// }, -// }, -// } -// -// fs, err := disk.CreateFilesystem(1, diskfs.TypeFat32) -// err := fs.Mkdir("/FOO/BAR") -// rw, err := fs.OpenFile("/FOO/BAR/AFILE.EXE", os.O_CREATE|os.O_RDRWR) -// b := make([]byte, 1024, 1024) -// rand.Read(b) -// err := rw.Write(b) package diskfs import ( diff --git a/example_test.go b/example_test.go new file mode 100644 index 00000000..6b99bac2 --- /dev/null +++ b/example_test.go @@ -0,0 +1,145 @@ +package diskfs_test + +import ( + "crypto/rand" + "log" + "os" + + diskfs "github.com/diskfs/go-diskfs" + "github.com/diskfs/go-diskfs/disk" + "github.com/diskfs/go-diskfs/filesystem" + "github.com/diskfs/go-diskfs/partition/gpt" + "github.com/diskfs/go-diskfs/partition/mbr" +) + +func check(err error) { + if err != nil { + log.Fatal(err) + } +} + +func unused(_ ...any) { +} + +// Create a disk image of size 10MB with a FAT32 filesystem spanning the entire disk. +func ExampleCreate_fat32() { + var size int64 = 10 * 1024 * 1024 // 10 MB + + diskImg := "/tmp/disk.img" + defer os.Remove(diskImg) + theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) + + fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{ + Partition: 0, + FSType: filesystem.TypeFat32, + }) + check(err) + unused(fs) +} + +// Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB), +// of size 10MB filled with a FAT32 filesystem. +func ExampleCreate_mbr() { + var size int64 = 20 * 1024 * 1024 // 20 MB + + diskImg := "/tmp/disk.img" + defer os.Remove(diskImg) + theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) + + table := &mbr.Table{ + LogicalSectorSize: 512, + PhysicalSectorSize: 512, + Partitions: []*mbr.Partition{ + { + Bootable: false, + Type: mbr.Linux, + Start: 2048, + Size: 20480, + }, + }, + } + + check(theDisk.Partition(table)) + + fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{ + Partition: 1, + FSType: filesystem.TypeFat32, + }) + check(err) + unused(fs) +} + +// Create a disk of size 20MB with a GPT partition table, a single partition beginning at block 2048 (1MB), of size 10MB, and fill with the contents from the 10MB file "/root/contents.dat" +func ExampleCreate_gpt() { + var size int64 = 20 * 1024 * 1024 // 20 MB + + diskImg := "/tmp/disk.img" + defer os.Remove(diskImg) + theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) + + table := &gpt.Table{ + LogicalSectorSize: 512, + PhysicalSectorSize: 512, + ProtectiveMBR: true, + Partitions: []*gpt.Partition{ + { + Start: 1 * 1024 * 1024 / 512, + Size: 10 * 1024 * 1024, + }, + }, + } + + check(theDisk.Partition(table)) + + f, err := os.Open("/root/contents.dat") + check(err) + + written, err := theDisk.WritePartitionContents(1, f) + check(err) + unused(written) +} + +// Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB), +// of size 10MB filled with a FAT32 filesystem, and create some directories and files in that filesystem. +func ExampleCreate_fat32WithDirsAndFiles() { + var size int64 = 20 * 1024 * 1024 // 20 MB + + diskImg := "/tmp/disk.img" + defer os.Remove(diskImg) + theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault) + + table := &mbr.Table{ + LogicalSectorSize: 512, + PhysicalSectorSize: 512, + Partitions: []*mbr.Partition{ + { + Bootable: false, + Type: mbr.Linux, + Start: 2048, + Size: 20480, + }, + }, + } + + check(theDisk.Partition(table)) + + fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{ + Partition: 1, + FSType: filesystem.TypeFat32, + }) + check(err) + + err = fs.Mkdir("/FOO/BAR") + check(err) + + rw, err := fs.OpenFile("/FOO/BAR/AFILE.EXE", os.O_CREATE|os.O_RDWR) + check(err) + b := make([]byte, 1024) + + _, err = rand.Read(b) + check(err) + + written, err := rw.Write(b) + check(err) + unused(written) +}