From a220c1b7aeb5a03fab3172a9ad17afcc1868e26c Mon Sep 17 00:00:00 2001 From: Ophestra Date: Tue, 27 Oct 2026 20:23:12 +0900 Subject: internal/pipewire: improve path error reporting This replaces SyscallError with PathError when pathnames are involved. Signed-off-by: Ophestra --- cmd/hakurei/testsuite/main.go | 14 ++++++++++++++ internal/pipewire/pipewire.go | 9 +++++++-- internal/pipewire/securitycontext.go | 22 ++++++++++++++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/cmd/hakurei/testsuite/main.go b/cmd/hakurei/testsuite/main.go index 0e031430..4f17a3e3 100644 --- a/cmd/hakurei/testsuite/main.go +++ b/cmd/hakurei/testsuite/main.go @@ -307,6 +307,20 @@ func main() { )) }) + wg.Go(func() { + defer log.Println("validated graceful failure on bad PipeWire socket") + + testsuite.AssertOutput( + "validating PipeWire graceful failure", + "", "hakurei: cannot connect "+ + "/run/pipewire/pipewire-0-manager: no such file or directory\n", + )(testsuite.MustOutput( + ctx, &cred, nil, hst.ExitRequest, "bad PipeWire socket", + "hakurei", "exec", "--pulse", + "true", + )) + }) + wg.Go(func() { if _, _, err := testsuite.StartHakurei( ctx, &wg, &cred, dbusEnv, func(cmd *exec.Cmd) { diff --git a/internal/pipewire/pipewire.go b/internal/pipewire/pipewire.go index 9357c565..57cfefb5 100644 --- a/internal/pipewire/pipewire.go +++ b/internal/pipewire/pipewire.go @@ -185,7 +185,8 @@ type unixConn struct { // Dial connects to a Unix domain socket described by name. func Dial(name string) (Conn, error) { if fd, err := syscall.Socket( - syscall.AF_UNIX, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC|syscall.SOCK_NONBLOCK, + syscall.AF_UNIX, + syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC|syscall.SOCK_NONBLOCK, 0, ); err != nil { return nil, os.NewSyscallError("socket", err) @@ -194,7 +195,11 @@ func Dial(name string) (Conn, error) { &syscall.SockaddrUnix{Name: name}, ); err != nil { _ = syscall.Close(fd) - return nil, os.NewSyscallError("connect", err) + return nil, &os.PathError{ + Op: "connect", + Path: name, + Err: err, + } } else { return &unixConn{fd: fd}, nil } diff --git a/internal/pipewire/securitycontext.go b/internal/pipewire/securitycontext.go index f277a99e..06e8c448 100644 --- a/internal/pipewire/securitycontext.go +++ b/internal/pipewire/securitycontext.go @@ -192,14 +192,24 @@ func (securityContext *SecurityContext) BindAndCreate(pathname string, props SPA scc.pathname = pathname var listenFd int - if fd, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, 0); err != nil { + if fd, err := syscall.Socket( + syscall.AF_UNIX, + syscall.SOCK_STREAM|syscall.SOCK_CLOEXEC, + 0, + ); err != nil { return nil, os.NewSyscallError("socket", err) } else { securityContext.ctx.cleanup(func() error { return syscall.Close(fd) }) listenFd = fd } - if err := syscall.Bind(listenFd, &syscall.SockaddrUnix{Name: pathname}); err != nil { - return nil, os.NewSyscallError("bind", err) + if err := syscall.Bind(listenFd, &syscall.SockaddrUnix{ + Name: pathname, + }); err != nil { + return nil, &os.PathError{ + Op: "bind", + Path: pathname, + Err: err, + } } else if err = syscall.Listen(listenFd, 0); err != nil { _ = os.Remove(pathname) return nil, os.NewSyscallError("listen", err) @@ -211,7 +221,11 @@ func (securityContext *SecurityContext) BindAndCreate(pathname string, props SPA } runtime.SetFinalizer(&scc, (*securityContextCloser).Close) - if err := securityContext.Create(listenFd, scc.closeFds[1], props); err != nil { + if err := securityContext.Create( + listenFd, + scc.closeFds[1], + props, + ); err != nil { _ = scc.Close() return nil, err } -- cgit v1.3.1