95 lines
1.5 KiB
Go
95 lines
1.5 KiB
Go
package ipcmux
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
ENV_IPC = "IPC"
|
|
ENV_ROOTPID = "ROOT_PID"
|
|
)
|
|
|
|
var listenNet func(path string) (net.Listener, error)
|
|
|
|
var dialNet func(path string) (net.Conn, error)
|
|
|
|
func Dial(p string) (net.Conn, error) {
|
|
return dialNet(p)
|
|
}
|
|
func SetName(n string) {
|
|
os.Setenv(ENV_IPC, n)
|
|
}
|
|
func ResolveBinName() string {
|
|
|
|
bin := os.Getenv(ENV_IPC)
|
|
if bin == "" {
|
|
bin = os.Args[0]
|
|
|
|
if runtime.GOOS == "windows" {
|
|
bin = strings.Replace(bin, "\\", "/", -1)
|
|
}
|
|
parts := strings.Split(bin, "/")
|
|
bin = parts[len(parts)-1]
|
|
bin = strings.Replace(bin, ".exe", "", 1)
|
|
log.Printf("No IPC env var found, using %s to bind ipc", bin)
|
|
}
|
|
return bin
|
|
}
|
|
|
|
func Listen(p string) (net.Listener, error) {
|
|
log.Printf("IPC:: Will listen on: [%s]", p)
|
|
return listenNet(p)
|
|
}
|
|
|
|
func NewClient() *http.Client {
|
|
ret := &http.Client{
|
|
Transport: &http.Transport{
|
|
DialContext: func(_ context.Context, _, b string) (net.Conn, error) {
|
|
ps := strings.Split(b, ":")
|
|
return dialNet(ps[0])
|
|
},
|
|
},
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func Serve(mux *http.ServeMux) error {
|
|
go CheckRoot()
|
|
|
|
bin := ResolveBinName()
|
|
|
|
l, err := Listen(bin)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
server := http.Server{
|
|
Handler: mux,
|
|
}
|
|
err = server.Serve(l)
|
|
return err
|
|
}
|
|
|
|
func ServeNamed(n string, mux *http.ServeMux) error {
|
|
go CheckRoot()
|
|
|
|
l, err := Listen(n)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
server := http.Server{
|
|
Handler: mux,
|
|
}
|
|
err = server.Serve(l)
|
|
return err
|
|
}
|
|
|
|
func ServeDefault() error {
|
|
return Serve(http.DefaultServeMux)
|
|
}
|