diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-10-27 20:23:12 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-10-27 20:23:12 +0900 |
| commit | a220c1b7aeb5a03fab3172a9ad17afcc1868e26c (patch) | |
| tree | cd553da950d353202cee77e65364d109aa66f8d8 | |
| parent | ea29e6bad114306b78820cb674863a9bf3041fa5 (diff) | |
internal/pipewire: improve path error reporting
This replaces SyscallError with PathError when pathnames are involved.
Signed-off-by: Ophestra <cat@gensokyo.uk>
| -rw-r--r-- | cmd/hakurei/testsuite/main.go | 14 | ||||
| -rw-r--r-- | internal/pipewire/pipewire.go | 9 | ||||
| -rw-r--r-- | 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 @@ -308,6 +308,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) { cmd.ExtraFiles = cmd.ExtraFiles[:len(cmd.ExtraFiles)-1] 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 } |
