aboutsummaryrefslogtreecommitdiff
path: root/become.go
diff options
context:
space:
mode:
authorNat Lasseter <user@4574.co.uk>2019-05-28 14:20:08 +0100
committerNat Lasseter <user@4574.co.uk>2019-05-28 14:20:08 +0100
commit89d9dab4bdbe4c86194353c88481e1dd17517435 (patch)
tree7233acd3c572c7d46f24ded522c70bedf76fc1f7 /become.go
Initial Commit
Diffstat (limited to 'become.go')
-rw-r--r--become.go88
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()
+}