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  }