git.iko.soy/typeable/oauth2-proxy
on 7b41c8e help sign in
typeable/oauth2-proxy/pkg/http/systemd_socket.go
55 lines 1.3 kB history raw
1//go:build !windows
2// +build !windows
4package http
6import (
7 "errors"
8 "fmt"
9 "net"
10 "strconv"
12 "github.com/coreos/go-systemd/activation"
15// listenFdsStart corresponds to `SD_LISTEN_FDS_START`.
16// Since the 3 first file descriptors in every linux process is
17// stdin, stdout and stderr. The first usable file descriptor is 3.
18// systemd-socket-activate will always assume that the first socket will be
19// 3 and the rest follow.
20const (
21 listenFdsStart = 3
24// convert a string filedescriptor to an actual listener
25func (s *server) fdToListener(bindAddress string) (net.Listener, error) {
26 fd, err := strconv.Atoi(bindAddress)
27 if err != nil {
28 return nil, errors.New("listen failed: fd with name is not implemented yet")
29 }
30 fdIndex := fd - listenFdsStart
32 if len(s.fdFiles) == 0 {
33 s.fdFiles = activation.Files(true)
34 }
36 l := len(s.fdFiles)
38 if fdIndex < 0 || fdIndex >= l || l == 0 {
39 return nil, errors.New("listen failed: fd outside of range of available file descriptors")
40 }
42 return net.FileListener(s.fdFiles[fdIndex])
45func (s *server) checkSystemdSocketSupport(opts Opts) error {
46 listenAddr := opts.BindAddress[3:]
47 listener, err := s.fdToListener(listenAddr)
48 if err != nil {
49 err = fmt.Errorf("listen (file, %s) failed: %w", listenAddr, err)
50 return err
51 }
53 s.listener = listener
54 return nil