From 89d9dab4bdbe4c86194353c88481e1dd17517435 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Tue, 28 May 2019 14:20:08 +0100 Subject: Initial Commit --- become.go | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 become.go (limited to 'become.go') 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() +} -- cgit v1.2.3