about summary refs log tree commit diff
path: root/listener.go
diff options
context:
space:
mode:
authorV <v@anomalous.eu>2021-08-27 06:08:09 +0200
committerV <v@anomalous.eu>2021-08-27 06:08:09 +0200
commitd49fe57776e6d19181c8ccb8d5332ed2c62d5ca8 (patch)
treee3036d32e318bfaef519c316de7e7f44b9351fef /listener.go
downloadloxy-0.2.0.tar.zst
Root commit HEAD v0.2.0 trunk
Co-authored-by: edef <edef@edef.eu>
Diffstat (limited to 'listener.go')
-rw-r--r--listener.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/listener.go b/listener.go
new file mode 100644
index 0000000..a4fd692
--- /dev/null
+++ b/listener.go
@@ -0,0 +1,58 @@
+// SPDX-FileCopyrightText: V <v@anomalous.eu>
+// SPDX-FileCopyrightText: edef <edef@edef.eu>
+// SPDX-License-Identifier: OSL-3.0
+
+package main
+
+import (
+	"fmt"
+	"net"
+
+	"github.com/coreos/go-systemd/v22/activation"
+)
+
+type listenAddress string
+
+func (a listenAddress) Listeners() ([]net.Listener, error) {
+	ln, err := net.Listen("tcp", string(a))
+	if err != nil {
+		return nil, err
+	}
+	return []net.Listener{ln}, nil
+}
+
+func (a listenAddress) Get() interface{} {
+	return string(a)
+}
+
+func (a *listenAddress) Set(v string) error {
+	*a = listenAddress(v)
+	return nil
+}
+
+func (a listenAddress) String() string {
+	return string(a)
+}
+
+type activationSocket struct{}
+
+func (activationSocket) Listeners() (lns []net.Listener, err error) {
+	files := activation.Files(true)
+	lns = make([]net.Listener, len(files))
+	for i, f := range files {
+		lns[i], err = net.FileListener(f)
+		if err != nil {
+			return nil, err
+		}
+		f.Close()
+	}
+	return
+}
+
+func (activationSocket) String() string {
+	return "activation socket"
+}
+
+func (activationSocket) Set(string) error {
+	return fmt.Errorf("incompatible with socket activation")
+}