Skip to content

Commit

Permalink
allow LISTEN_FDS to be empty: support older systemd version
Browse files Browse the repository at this point in the history
  • Loading branch information
aloababa committed May 28, 2019
1 parent 4e10603 commit 326d1e3
Showing 1 changed file with 33 additions and 22 deletions.
55 changes: 33 additions & 22 deletions activation/activation.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,27 @@ func Listen(addr string) (net.Listener, error) {
}

func activationListeners() ([]net.Listener, error) {
if err := checkEnv(); err != nil {
files, err := getFiles()
if err != nil {
return nil, err
}
listeners := make([]net.Listener, len(files))
for i, f := range files {
listener, err := net.FileListener(f)
if err != nil {
return nil, fmt.Errorf("failed to init new file listener: %v", err)
}
if err = f.Close(); err != nil {
return nil, fmt.Errorf("failed to close %s file: %v", f.Name(), err)
}
listeners[i] = listener
}
return listeners, nil
}

func getFiles() ([]*os.File, error) {
err := checkEnv()
if err != nil {
return nil, err
}
listenPid, err := strconv.Atoi(os.Getenv("LISTEN_PID"))
Expand All @@ -58,9 +78,12 @@ func activationListeners() ([]net.Listener, error) {
if err != nil {
return nil, fmt.Errorf("failed to parse LISTEN_FDS as int: %v", err)
}
listenFdNames := strings.Split(os.Getenv("LISTEN_FDNAMES"), ":")
if err = os.Unsetenv("LISTEN_PID"); err != nil {
return nil, fmt.Errorf("failed to unset env LISTEN_PID: %v", err)
var listenFdNames []string
if _, ok := os.LookupEnv("LISTEN_FDS"); ok {
listenFdNames = strings.Split(os.Getenv("LISTEN_FDNAMES"), ":")
if err = os.Unsetenv("LISTEN_FDNAMES"); err != nil {
return nil, fmt.Errorf("failed to unset env LISTEN_FDNAMES: %v", err)
}
}
if err = os.Unsetenv("LISTEN_FDS"); err != nil {
return nil, fmt.Errorf("failed to unset env LISTEN_PID: %v", err)
Expand All @@ -73,24 +96,15 @@ func activationListeners() ([]net.Listener, error) {
// http://man7.org/linux/man-pages/man2/fcntl.2.html
syscall.CloseOnExec(fd)
name := "LISTEN_FD_" + strconv.Itoa(fd)
offset := fd - listenFdsStart
if offset < len(listenFdNames) && len(listenFdNames[offset]) > 0 {
name = listenFdNames[offset]
if listenFdNames != nil {
offset := fd - listenFdsStart
if offset < len(listenFdNames) && len(listenFdNames[offset]) > 0 {
name = listenFdNames[offset]
}
}
files = append(files, os.NewFile(uintptr(fd), name))
}
listeners := make([]net.Listener, len(files))
for i, f := range files {
listener, err := net.FileListener(f)
if err != nil {
return nil, fmt.Errorf("failed to init new file listener: %v", err)
}
if err = f.Close(); err != nil {
return nil, fmt.Errorf("failed to close %s file: %v", f.Name(), err)
}
listeners[i] = listener
}
return listeners, nil
return files, nil
}

func checkEnv() error {
Expand All @@ -101,8 +115,5 @@ func checkEnv() error {
if _, ok = os.LookupEnv("LISTEN_FDS"); !ok {
return errors.New("LISTEN_FDS not set")
}
if _, ok = os.LookupEnv("LISTEN_FDNAMES"); !ok {
return errors.New("LISTEN_FDNAMES not set")
}
return nil
}

0 comments on commit 326d1e3

Please sign in to comment.