65 lines
1011 B
Go
65 lines
1011 B
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"io"
|
|
"net"
|
|
"os/exec"
|
|
)
|
|
|
|
func main() {
|
|
bind := flag.String("bind", "127.0.0.1:8987", "Addr:Port to listen to")
|
|
flag.Parse()
|
|
|
|
args := flag.Args()
|
|
|
|
if flag.NArg() < 1 {
|
|
panic("no arguments provided")
|
|
}
|
|
uaddr, err := net.ResolveUDPAddr("udp", *bind)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
lst, err := net.ListenUDP("udp", uaddr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer lst.Close()
|
|
|
|
cmd := exec.Command(args[0], args[1:]...)
|
|
stdoutIn, _ := cmd.StdoutPipe()
|
|
stderrIn, _ := cmd.StderrPipe()
|
|
output := io.MultiReader(stdoutIn, stderrIn)
|
|
|
|
buf := make([]byte, 1024)
|
|
_, addr, err := lst.ReadFromUDP(buf)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
println("Received connection from %v", addr)
|
|
|
|
go func() {
|
|
for {
|
|
_, err := output.Read(buf)
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
return
|
|
}
|
|
panic(err)
|
|
}
|
|
lst.WriteTo(buf, addr)
|
|
}
|
|
}()
|
|
|
|
defer func() {
|
|
lst.WriteTo([]byte("<EOF>\n"), addr)
|
|
}()
|
|
|
|
cmd.Start()
|
|
err = cmd.Wait()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|