diff options
author | Nat Lasseter <user@4574.co.uk> | 2019-05-28 14:20:08 +0100 |
---|---|---|
committer | Nat Lasseter <user@4574.co.uk> | 2019-05-28 14:20:08 +0100 |
commit | 89d9dab4bdbe4c86194353c88481e1dd17517435 (patch) | |
tree | 7233acd3c572c7d46f24ded522c70bedf76fc1f7 /become.go |
Initial Commit
Diffstat (limited to 'become.go')
-rw-r--r-- | become.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/become.go b/become.go new file mode 100644 index 0000000..61bfbb9 --- /dev/null +++ b/become.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "net" + "os" + "plugin" + "sync" +) + +const ( + LISTEN = "localhost:3333" +) + +var ( + wait sync.WaitGroup +) + +type Become interface { + Become() +} + +func main() { + l, err := net.Listen("tcp", LISTEN) + if err != nil { + fmt.Println("Error listening: ", err.Error()) + os.Exit(1) + } + defer l.Close() + conn, err := l.Accept() + if err != nil { + fmt.Println("Error accepting: ", err.Error()) + } else { + wait.Add(1) + go handleRequest(conn) + } + wait.Wait() +} + +func handleRequest(conn net.Conn) { + defer wait.Done() + defer conn.Close() + file, err := ioutil.TempFile("", "become.*") + if err != nil { + fmt.Println("Error creating temporary file: ", err.Error()) + return + } + _, err = io.Copy(file, conn) + if err != nil { + fmt.Println("Error copying: ", err.Error()) + return + } + err = file.Close() + if err != nil { + fmt.Println("Error closing temporary file: ", err.Error()) + return + } + wait.Add(1) + go becomePlugin(file.Name()) +} + +func becomePlugin(filename string) { + defer wait.Done() + defer os.Remove(filename) + + plugin, err := plugin.Open(filename) + if err != nil { + fmt.Println("Error opening become: ", err.Error()) + return + } + + symBecome, err := plugin.Lookup("Become") + if err != nil { + fmt.Println("Error looking up become: ", err.Error()) + return + } + + var become Become + become, ok := symBecome.(Become) + if !ok { + fmt.Println("Become not of correct type") + return + } + + become.Become() +} |