listenfd: use LISTEN_FDS_FIRST_FD if available
1 file changed, 26 insertions(+), 8 deletions(-)
changed files
M listenfd/listenfd.go → listenfd/listenfd.go
@@ -12,9 +12,9 @@ "alin.ovh/x/log" ) -const fdStart = 3 +const firstFDFallback = 3 -func GetListener(i uint64, addr string, log *log.Logger) (l net.Listener, err error) { +func GetListener(i uintptr, addr string, log *log.Logger) (l net.Listener, err error) { l, err = getFDSocket(i) if err != nil { log.Warn("could not create listener from listenfd", "error", err)@@ -32,7 +32,7 @@ return } func GetListenerTLS( - i uint64, + i uintptr, addr string, config *tls.Config, log *log.Logger,@@ -45,16 +45,20 @@ return tls.NewListener(l, config), nil } -func getFDSocket(i uint64) (net.Listener, error) { - lfds, present := os.LookupEnv("LISTEN_FDS") +func getFDSocket(i uintptr) (net.Listener, error) { + fds, present, err := lookupEnvUintptr("LISTEN_FDS") if !present { return nil, nil } - - fds, err := strconv.ParseUint(lfds, 10, 32) if err != nil { - return nil, fault.Wrap(err, fmsg.With("could not parse LISTEN_FDS")) + return nil, err } + + fdStart, present, err := lookupEnvUintptr("LISTEN_FDS_FIRST_FD") + if !present { + fdStart = firstFDFallback + } + if i >= fds { return nil, fault.Newf("only %d fds available, requested index %d", fds, i) }@@ -66,3 +70,17 @@ } return l, nil } + +func lookupEnvUintptr(key string) (uintptr, bool, error) { + value, present := os.LookupEnv(key) + if !present { + return 0, false, nil + } + + result, err := strconv.ParseUint(value, 10, 32) + if err != nil { + return 0, true, fault.Wrap(err, fmsg.Withf("could not parse %s", key)) + } + + return uintptr(result), true, nil +}