10 "github.com/alexflint/go-arg"
11 "golang.org/x/xerrors"
13 "github.com/anacrolix/torrent/mse"
19 log.Fatalf("fatal error: %v", err)
23 func mainErr() error {
25 CryptoMethod mse.CryptoMethod
27 Network string `arg:"positional"`
28 Address string `arg:"positional"`
29 SecretKey string `arg:"positional"`
33 Network string `arg:"positional"`
34 Address string `arg:"positional"`
35 SecretKeys []string `arg:"positional"`
38 CryptoMethod: mse.AllSupportedCrypto,
40 p := arg.MustParse(&args)
42 cn, err := net.Dial(args.Dial.Network, args.Dial.Address)
44 return xerrors.Errorf("dialing: %w", err)
47 rw, _, err := mse.InitiateHandshake(cn, []byte(args.Dial.SecretKey), args.Dial.InitialPayload, args.CryptoMethod)
49 return xerrors.Errorf("initiating handshake: %w", err)
53 if args.Listen != nil {
54 l, err := net.Listen(args.Listen.Network, args.Listen.Address)
56 return xerrors.Errorf("listening: %w", err)
62 return xerrors.Errorf("accepting: %w", err)
65 rw, _, err := mse.ReceiveHandshake(cn, func(f func([]byte) bool) {
66 for _, sk := range args.Listen.SecretKeys {
69 }, mse.DefaultCryptoSelector)
71 log.Fatalf("error receiving: %v", err)
75 if p.Subcommand() == nil {
76 p.Fail("missing subcommand")
81 func doStreaming(rw io.ReadWriter) {
86 log.Println(io.Copy(rw, os.Stdin))
90 log.Println(io.Copy(os.Stdout, rw))