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  }