aboutsummaryrefslogtreecommitdiffhomepage
path: root/helper/proc/pipe.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-11-12 23:12:38 +0900
committerOphestra <cat@gensokyo.uk>2025-11-12 23:16:13 +0900
commitf347d44c2281f507e3786aa498f634bfa4c92d84 (patch)
treefe85b41d5f6a5e308b87585f46efd64f90221e2b /helper/proc/pipe.go
parentb5630f6883c874d458d9ae3c666cfb7ae5e3121d (diff)
internal/helper: relocate from helper
This package is ugly and is pending removal only kept alive by xdg-dbus-proxy. Its exported symbols are made available until v0.4.0 where it will be removed for #24. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper/proc/pipe.go')
-rw-r--r--helper/proc/pipe.go110
1 files changed, 0 insertions, 110 deletions
diff --git a/helper/proc/pipe.go b/helper/proc/pipe.go
deleted file mode 100644
index 838c4ae4..00000000
--- a/helper/proc/pipe.go
+++ /dev/null
@@ -1,110 +0,0 @@
-package proc
-
-import (
- "context"
- "errors"
- "io"
- "os"
- "runtime"
-)
-
-// NewWriterTo returns a [File] that receives content from wt on fulfillment.
-func NewWriterTo(wt io.WriterTo) File { return &writeToFile{wt: wt} }
-
-// writeToFile exports the read end of a pipe with data written by an [io.WriterTo].
-type writeToFile struct {
- wt io.WriterTo
- BaseFile
-}
-
-func (f *writeToFile) ErrCount() int { return 3 }
-func (f *writeToFile) Fulfill(ctx context.Context, dispatchErr func(error)) error {
- r, w, err := os.Pipe()
- if err != nil {
- return err
- }
- f.Set(r)
-
- done := make(chan struct{})
- go func() {
- _, err = f.wt.WriteTo(w)
- dispatchErr(err)
- dispatchErr(w.Close())
- close(done)
- runtime.KeepAlive(r)
- }()
- go func() {
- select {
- case <-done:
- dispatchErr(nil)
- case <-ctx.Done():
- dispatchErr(w.Close()) // this aborts WriteTo with file already closed
- runtime.KeepAlive(r)
- }
- }()
-
- return nil
-}
-
-// NewStat returns a [File] implementing the behaviour
-// of the receiving end of xdg-dbus-proxy stat fd.
-func NewStat(s *io.Closer) File { return &statFile{s: s} }
-
-var (
- ErrStatFault = errors.New("generic stat fd fault")
- ErrStatRead = errors.New("unexpected stat behaviour")
-)
-
-// statFile implements xdg-dbus-proxy stat fd behaviour.
-type statFile struct {
- s *io.Closer
- BaseFile
-}
-
-func (f *statFile) ErrCount() int { return 2 }
-func (f *statFile) Fulfill(ctx context.Context, dispatchErr func(error)) error {
- r, w, err := os.Pipe()
- if err != nil {
- return err
- }
- f.Set(w)
-
- done := make(chan struct{})
- go func() {
- defer close(done)
- var n int
-
- n, err = r.Read(make([]byte, 1))
- switch n {
- case -1:
- if err == nil {
- err = ErrStatFault
- }
- dispatchErr(err)
- case 0:
- if err == nil {
- err = ErrStatRead
- }
- dispatchErr(err)
- case 1:
- dispatchErr(err)
- default:
- panic("unreachable")
- }
- runtime.KeepAlive(w)
- }()
-
- go func() {
- select {
- case <-done:
- dispatchErr(nil)
- case <-ctx.Done():
- dispatchErr(r.Close()) // this aborts Read with file already closed
- runtime.KeepAlive(w)
- }
- }()
-
- // this gets closed by the caller
- *f.s = r
- return nil
-}