github.com/divyam234/rclone@v1.64.1/cmd/serve/docker/unix.go (about) 1 //go:build linux || freebsd 2 // +build linux freebsd 3 4 package docker 5 6 import ( 7 "fmt" 8 "net" 9 "os" 10 "path/filepath" 11 12 "github.com/divyam234/rclone/lib/file" 13 ) 14 15 func newUnixListener(path string, gid int) (net.Listener, string, error) { 16 // try systemd socket activation 17 fds := systemdActivationFiles() 18 switch len(fds) { 19 case 0: 20 // fall thru 21 case 1: 22 listener, err := net.FileListener(fds[0]) 23 return listener, "", err 24 default: 25 return nil, "", fmt.Errorf("expected only one socket from systemd, got %d", len(fds)) 26 } 27 28 // create socket ourselves 29 if filepath.Ext(path) == "" { 30 path += ".sock" 31 } 32 if !filepath.IsAbs(path) { 33 path = filepath.Join(sockDir, path) 34 } 35 36 if err := file.MkdirAll(filepath.Dir(path), 0755); err != nil { 37 return nil, "", err 38 } 39 if err := os.Remove(path); err != nil && !os.IsNotExist(err) { 40 return nil, "", err 41 } 42 43 listener, err := net.Listen("unix", path) 44 if err != nil { 45 return nil, "", err 46 } 47 48 if err = os.Chmod(path, 0660); err != nil { 49 return nil, "", err 50 } 51 if os.Geteuid() == 0 { 52 if err = os.Chown(path, 0, gid); err != nil { 53 return nil, "", err 54 } 55 } 56 57 // we don't use spec file with unix sockets 58 return listener, path, nil 59 }