github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/cmds/core/netcat/netcat.go (about) 1 // Copyright 2012-2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Netcat pipes over the network. 6 package main 7 8 import ( 9 "flag" 10 "fmt" 11 "io" 12 "log" 13 "net" 14 "os" 15 16 "github.com/u-root/u-root/pkg/uroot/util" 17 ) 18 19 const usage = "netcat [go-style network address]" 20 21 var ( 22 netType = flag.String("net", "tcp", "What net type to use, e.g. tcp, unix, etc.") 23 listen = flag.Bool("l", false, "Listen for connections.") 24 verbose = flag.Bool("v", false, "Verbose output.") 25 ) 26 27 func init() { 28 util.Usage(usage) 29 } 30 31 func main() { 32 var c net.Conn 33 var err error 34 if flag.Parse(); len(flag.Args()) != 1 { 35 flag.Usage() 36 os.Exit(1) 37 } 38 39 addr := flag.Args()[0] 40 41 if *listen { 42 ln, err := net.Listen(*netType, addr) 43 if err != nil { 44 log.Fatalln(err) 45 } 46 if *verbose { 47 fmt.Fprintln(os.Stderr, "Listening on", ln.Addr()) 48 } 49 50 c, err = ln.Accept() 51 if err != nil { 52 log.Fatalln(err) 53 } 54 } else { 55 if c, err = net.Dial(*netType, addr); err != nil { 56 log.Fatalln(err) 57 } 58 } 59 if *verbose { 60 fmt.Fprintln(os.Stderr, "Connected to", c.RemoteAddr()) 61 } 62 63 go func() { 64 if _, err := io.Copy(c, os.Stdin); err != nil { 65 fmt.Fprintln(os.Stderr, err) 66 } 67 }() 68 if _, err = io.Copy(os.Stdout, c); err != nil { 69 fmt.Fprintln(os.Stderr, err) 70 } 71 if *verbose { 72 fmt.Fprintln(os.Stderr, "Disconnected") 73 } 74 }