github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/cmd/podman-mac-helper/service.go (about) 1 //go:build darwin 2 // +build darwin 3 4 package main 5 6 import ( 7 "fmt" 8 "io" 9 "io/fs" 10 "os" 11 "time" 12 13 "github.com/spf13/cobra" 14 ) 15 16 const ( 17 trigger = "GO\n" 18 fail = "NO" 19 success = "OK" 20 ) 21 22 var serviceCmd = &cobra.Command{ 23 Use: "service", 24 Short: "services requests", 25 Long: "services requests", 26 PreRun: silentUsage, 27 Run: serviceRun, 28 Hidden: true, 29 } 30 31 func init() { 32 rootCmd.AddCommand(serviceCmd) 33 } 34 35 func serviceRun(cmd *cobra.Command, args []string) { 36 info, err := os.Stdin.Stat() 37 if err != nil || info.Mode()&fs.ModeSocket == 0 { 38 fmt.Fprintln(os.Stderr, "This is an internal command that is not intended for standard terminal usage") 39 os.Exit(1) 40 } 41 42 os.Exit(service()) 43 } 44 45 func service() int { 46 defer os.Stdout.Close() 47 defer os.Stdin.Close() 48 defer os.Stderr.Close() 49 if len(os.Args) < 3 { 50 fmt.Print(fail) 51 return 1 52 } 53 target := os.Args[2] 54 55 request := make(chan bool) 56 go func() { 57 buf := make([]byte, 3) 58 _, err := io.ReadFull(os.Stdin, buf) 59 request <- err == nil && string(buf) == trigger 60 }() 61 62 valid := false 63 select { 64 case valid = <-request: 65 case <-time.After(5 * time.Second): 66 } 67 68 if !valid { 69 fmt.Println(fail) 70 return 2 71 } 72 73 err := os.Remove(dockerSock) 74 if err == nil || os.IsNotExist(err) { 75 err = os.Symlink(target, dockerSock) 76 } 77 78 if err != nil { 79 fmt.Print(fail) 80 return 3 81 } 82 83 fmt.Print(success) 84 return 0 85 }