master
go 108 lines 1.69 KB
Raw
1 package main
2
3 import (
4 "flag"
5 "fmt"
6 "io"
7 "os"
8 "strconv"
9
10 ma "github.com/multiformats/go-multiaddr"
11 manet "github.com/multiformats/go-multiaddr/net"
12 )
13
14 const USAGE = "ma-pipe-unidir [-l|--listen] [--pidFile=path] [-h|--help] <send|recv> <multiaddr>\n"
15
16 type Opts struct {
17 Listen bool
18 PidFile string
19 }
20
21 func app() int {
22 opts := Opts{}
23 flag.BoolVar(&opts.Listen, "l", false, "")
24 flag.BoolVar(&opts.Listen, "listen", false, "")
25 flag.StringVar(&opts.PidFile, "pidFile", "", "")
26 flag.Usage = func() {
27 fmt.Print(USAGE)
28 }
29 flag.Parse()
30 args := flag.Args()
31
32 if len(args) < 2 { // <mode> <addr>
33 fmt.Print(USAGE)
34 return 1
35 }
36
37 mode := args[0]
38 addr := args[1]
39
40 if mode != "send" && mode != "recv" {
41 fmt.Print(USAGE)
42 return 1
43 }
44
45 maddr, err := ma.NewMultiaddr(addr)
46 if err != nil {
47 return 1
48 }
49
50 var conn manet.Conn
51
52 if opts.Listen {
53 listener, err := manet.Listen(maddr)
54 if err != nil {
55 return 1
56 }
57
58 if len(opts.PidFile) > 0 {
59 data := []byte(strconv.Itoa(os.Getpid()))
60 err := os.WriteFile(opts.PidFile, data, 0o644)
61 if err != nil {
62 return 1
63 }
64
65 defer os.Remove(opts.PidFile)
66 }
67
68 conn, err = listener.Accept()
69 if err != nil {
70 return 1
71 }
72 } else {
73 var err error
74 conn, err = manet.Dial(maddr)
75 if err != nil {
76 return 1
77 }
78
79 if len(opts.PidFile) > 0 {
80 data := []byte(strconv.Itoa(os.Getpid()))
81 err := os.WriteFile(opts.PidFile, data, 0o644)
82 if err != nil {
83 return 1
84 }
85
86 defer os.Remove(opts.PidFile)
87 }
88
89 }
90
91 defer conn.Close()
92 switch mode {
93 case "recv":
94 _, err = io.Copy(os.Stdout, conn)
95 case "send":
96 _, err = io.Copy(conn, os.Stdin)
97 default:
98 return 1
99 }
100 if err != nil {
101 return 1
102 }
103 return 0
104 }
105
106 func main() {
107 os.Exit(app())
108 }