11 "github.com/alexflint/go-arg"
12 "github.com/anacrolix/torrent/mse"
18 log.Fatalf("fatal error: %v", err)
22 func mainErr() error {
24 CryptoMethod mse.CryptoMethod
26 Network string `arg:"positional"`
27 Address string `arg:"positional"`
28 SecretKey string `arg:"positional"`
32 Network string `arg:"positional"`
33 Address string `arg:"positional"`
34 SecretKeys []string `arg:"positional"`
37 CryptoMethod: mse.AllSupportedCrypto,
39 p := arg.MustParse(&args)
41 cn, err := net.Dial(args.Dial.Network, args.Dial.Address)
43 return fmt.Errorf("dialing: %w", err)
46 rw, _, err := mse.InitiateHandshake(cn, []byte(args.Dial.SecretKey), args.Dial.InitialPayload, args.CryptoMethod)
48 return fmt.Errorf("initiating handshake: %w", err)
52 if args.Listen != nil {
53 l, err := net.Listen(args.Listen.Network, args.Listen.Address)
55 return fmt.Errorf("listening: %w", err)
61 return fmt.Errorf("accepting: %w", err)
64 rw, _, err := mse.ReceiveHandshake(cn, func(f func([]byte) bool) {
65 for _, sk := range args.Listen.SecretKeys {
68 }, mse.DefaultCryptoSelector)
70 log.Fatalf("error receiving: %v", err)
74 if p.Subcommand() == nil {
75 p.Fail("missing subcommand")
80 func doStreaming(rw io.ReadWriter) {
85 log.Println(io.Copy(rw, os.Stdin))
89 log.Println(io.Copy(os.Stdout, rw))