package main import ( "os" "fmt" "net" "nslcd_proto" sd "sd_daemon" "sd_daemon/logger" _ "inotify" "syscall" ) func get_socket() (socket net.Listener, err error) { socket = nil err = nil fds := sd.ListenFds(true); if (fds == nil) { err = fmt.Errorf("failed to aquire sockets from systemd") return } if (len(fds) != 1) { err = fmt.Errorf("wrong number of sockets from systemd: expected %d but got %d", 1, len(fds)) return } socket, err = net.FileListener(fds[0]) fds[0].Close() return } func getpeercred(conn *net.UnixConn) (cred *syscall.Ucred, err error) { cred = nil file, err := conn.File() if err != nil { return } defer file.Close() cred, err = syscall.GetsockoptUcred(int(file.Fd()), syscall.SOL_SOCKET, syscall.SO_PEERCRED) return } func handler(conn *net.UnixConn, backend nslcd_proto.Backend) { cred, err := getpeercred(conn) if err != nil { logger.Debug("connection from unknown client") } else { logger.Debug("connection from pid=%v uid=%v gid=%v", cred.Pid, cred.Uid, cred.Gid) } err = nslcd_proto.HandleRequest(backend, conn, conn, *cred) if err != nil { logger.Debug("Error while handling request: %v", err) } } func main() { var err error = nil var socket net.Listener = nil defer func() { if socket != nil { socket.Close() } }() socket, err = get_socket() if err != nil { logger.Err("%s", err.Error()) sd.Notify(false, "STOPPING=1") os.Exit(1) } sd.Notify(false, "READY=1") for { conn, err := socket.Accept() if err != nil { logger.Notice("%s", err.Error()) } go handler(conn.(*net.UnixConn), nil) } sd.Notify(false, "STOPPING=1") os.Exit(0) } // Initialize() error { func // }