aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go.mod3
-rw-r--r--wiiload.go91
2 files changed, 94 insertions, 0 deletions
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..2ae0a5f
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module github.com/frostyfalls/wiiload
+
+go 1.23.6
diff --git a/wiiload.go b/wiiload.go
new file mode 100644
index 0000000..a0e7e86
--- /dev/null
+++ b/wiiload.go
@@ -0,0 +1,91 @@
+package main
+
+import (
+ "bytes"
+ "compress/zlib"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "net"
+ "os"
+ "path/filepath"
+)
+
+const (
+ WiiloadVersionMajor = 0
+ WiiloadVersionMinor = 5
+ FileChunkSize = 1024 * 128
+)
+
+const usage = "usage: wiiload ip_address file_path"
+
+func main() {
+ if len(os.Args) != 3 {
+ fmt.Fprintln(os.Stderr, usage)
+ os.Exit(1)
+ }
+
+ ipAddress := os.Args[1]
+ filePath := os.Args[2]
+
+ file, err := os.Open(filePath)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ defer file.Close()
+
+ fileData, err := io.ReadAll(file)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ var buf bytes.Buffer
+ writer := zlib.NewWriter(&buf)
+
+ _, err = writer.Write(fileData)
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ err = writer.Close()
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ var compressedFileData = buf.Bytes()
+
+ fileStat, err := file.Stat()
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ fileSize := fileStat.Size()
+
+ conn, err := net.Dial("tcp", ipAddress+":4299")
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ defer conn.Close()
+
+ conn.Write([]byte("HAXX"))
+ conn.Write([]byte{WiiloadVersionMajor})
+ conn.Write([]byte{WiiloadVersionMinor})
+ binary.Write(conn, binary.BigEndian, uint16(len(filepath.Base(filePath))))
+ binary.Write(conn, binary.BigEndian, uint32(len(compressedFileData)))
+ binary.Write(conn, binary.BigEndian, uint32(fileSize))
+
+ for i := 0; i < len(compressedFileData); i += FileChunkSize {
+ end := i + FileChunkSize
+ if end > len(compressedFileData) {
+ end = len(compressedFileData)
+ }
+ conn.Write(compressedFileData[i:end])
+ }
+
+ conn.Write([]byte(filepath.Base(filePath)))
+}