aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-10-27 20:23:12 +0900
committerOphestra <cat@gensokyo.uk>2026-10-27 20:23:12 +0900
commita220c1b7aeb5a03fab3172a9ad17afcc1868e26c (patch)
treecd553da950d353202cee77e65364d109aa66f8d8
parentea29e6bad114306b78820cb674863a9bf3041fa5 (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.go14
-rw-r--r--internal/pipewire/pipewire.go9
-rw-r--r--internal/pipewire/securitycontext.go22
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
}