gomcp/internal/infrastructure/ipc/ipc_unix.go

50 lines
1.2 KiB
Go

//go:build !windows
package ipc
import (
"fmt"
"net"
"os"
"path/filepath"
"time"
)
// socketDir is the base directory for Unix domain sockets.
var socketDir = filepath.Join(os.TempDir(), "sentinel-soc")
// platformListen creates a Unix domain socket listener.
func platformListen(name string) (net.Listener, error) {
// Ensure socket directory exists.
if err := os.MkdirAll(socketDir, 0700); err != nil {
return nil, fmt.Errorf("ipc/unix: mkdir %s: %w", socketDir, err)
}
sockPath := filepath.Join(socketDir, name+".sock")
// Remove stale socket file if it exists.
_ = os.Remove(sockPath)
l, err := net.Listen("unix", sockPath)
if err != nil {
return nil, fmt.Errorf("ipc/unix: listen %s: %w", sockPath, err)
}
// Set restrictive permissions on the socket.
if err := os.Chmod(sockPath, 0600); err != nil {
l.Close()
return nil, fmt.Errorf("ipc/unix: chmod %s: %w", sockPath, err)
}
return l, nil
}
// platformDial connects to a Unix domain socket.
func platformDial(name string) (net.Conn, error) {
sockPath := filepath.Join(socketDir, name+".sock")
conn, err := net.DialTimeout("unix", sockPath, 5*time.Second)
if err != nil {
return nil, fmt.Errorf("ipc/unix: dial %s: %w", sockPath, err)
}
return conn, nil
}