Lindenii Project Forge
Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.
/forged/internal/common/misc/net.go (raw)
package misc
import (
"context"
"errors"
"fmt"
"net"
"syscall"
)
func ListenUnixSocket(ctx context.Context, path string) (listener net.Listener, replaced bool, err error) {
listenConfig := net.ListenConfig{} //exhaustruct:ignore
listener, err = listenConfig.Listen(ctx, "unix", path)
if errors.Is(err, syscall.EADDRINUSE) {
replaced = true
unlinkErr := syscall.Unlink(path)
if unlinkErr != nil {
return listener, false, fmt.Errorf("remove existing socket %q: %w", path, unlinkErr)
}
listener, err = listenConfig.Listen(ctx, "unix", path)
}
if err != nil {
return listener, replaced, fmt.Errorf("listen on unix socket %q: %w", path, err)
}
return listener, replaced, nil
}
func Listen(ctx context.Context, net_, addr string) (listener net.Listener, err error) {
if net_ == "unix" {
listener, _, err = ListenUnixSocket(ctx, addr)
if err != nil {
return listener, fmt.Errorf("listen unix socket for web: %w", err)
}
} else {
listenConfig := net.ListenConfig{} //exhaustruct:ignore
listener, err = listenConfig.Listen(ctx, net_, addr)
if err != nil {
return listener, fmt.Errorf("listen %s for web: %w", net_, err)
}
}
return listener, nil
}