All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 2m9s
				
			Test / Hpkg (push) Successful in 3m58s
				
			Test / Sandbox (race detector) (push) Successful in 4m31s
				
			Test / Hakurei (race detector) (push) Successful in 5m19s
				
			Test / Hakurei (push) Successful in 2m12s
				
			Test / Flake checks (push) Successful in 1m31s
				
			This corrects minor mistakes in doc comments and adds them for undocumented constants. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package hst
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
	"syscall"
 | 
						|
)
 | 
						|
 | 
						|
// Enablement represents an optional host service to export to the target user.
 | 
						|
type Enablement byte
 | 
						|
 | 
						|
const (
 | 
						|
	// EWayland exposes a wayland pathname socket via security-context-v1.
 | 
						|
	EWayland Enablement = 1 << iota
 | 
						|
	// EX11 adds the target user via X11 ChangeHosts and exposes the X11 pathname socket.
 | 
						|
	EX11
 | 
						|
	// EDBus enables the per-container xdg-dbus-proxy daemon.
 | 
						|
	EDBus
 | 
						|
	// EPulse copies the PulseAudio cookie to [hst.PrivateTmp] and exposes the PulseAudio socket.
 | 
						|
	EPulse
 | 
						|
 | 
						|
	// EM is a noop.
 | 
						|
	EM
 | 
						|
)
 | 
						|
 | 
						|
// String returns a string representation of the flags set on [Enablement].
 | 
						|
func (e Enablement) String() string {
 | 
						|
	switch e {
 | 
						|
	case 0:
 | 
						|
		return "(no enablements)"
 | 
						|
	case EWayland:
 | 
						|
		return "wayland"
 | 
						|
	case EX11:
 | 
						|
		return "x11"
 | 
						|
	case EDBus:
 | 
						|
		return "dbus"
 | 
						|
	case EPulse:
 | 
						|
		return "pulseaudio"
 | 
						|
	default:
 | 
						|
		buf := new(strings.Builder)
 | 
						|
		buf.Grow(32)
 | 
						|
 | 
						|
		for i := Enablement(1); i < EM; i <<= 1 {
 | 
						|
			if e&i != 0 {
 | 
						|
				buf.WriteString(", " + i.String())
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if buf.Len() == 0 {
 | 
						|
			return fmt.Sprintf("e%x", byte(e))
 | 
						|
		}
 | 
						|
		return strings.TrimPrefix(buf.String(), ", ")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewEnablements returns the address of [Enablement] as [Enablements].
 | 
						|
func NewEnablements(e Enablement) *Enablements { return (*Enablements)(&e) }
 | 
						|
 | 
						|
// Enablements is the [json] adapter for [Enablement].
 | 
						|
type Enablements Enablement
 | 
						|
 | 
						|
// enablementsJSON is the [json] representation of [Enablements].
 | 
						|
type enablementsJSON = struct {
 | 
						|
	Wayland bool `json:"wayland,omitempty"`
 | 
						|
	X11     bool `json:"x11,omitempty"`
 | 
						|
	DBus    bool `json:"dbus,omitempty"`
 | 
						|
	Pulse   bool `json:"pulse,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// Unwrap returns the underlying [Enablement].
 | 
						|
func (e *Enablements) Unwrap() Enablement {
 | 
						|
	if e == nil {
 | 
						|
		return 0
 | 
						|
	}
 | 
						|
	return Enablement(*e)
 | 
						|
}
 | 
						|
 | 
						|
func (e *Enablements) MarshalJSON() ([]byte, error) {
 | 
						|
	if e == nil {
 | 
						|
		return nil, syscall.EINVAL
 | 
						|
	}
 | 
						|
	return json.Marshal(&enablementsJSON{
 | 
						|
		Wayland: Enablement(*e)&EWayland != 0,
 | 
						|
		X11:     Enablement(*e)&EX11 != 0,
 | 
						|
		DBus:    Enablement(*e)&EDBus != 0,
 | 
						|
		Pulse:   Enablement(*e)&EPulse != 0,
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func (e *Enablements) UnmarshalJSON(data []byte) error {
 | 
						|
	if e == nil {
 | 
						|
		return syscall.EINVAL
 | 
						|
	}
 | 
						|
 | 
						|
	v := new(enablementsJSON)
 | 
						|
	if err := json.Unmarshal(data, &v); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	var ve Enablement
 | 
						|
	if v.Wayland {
 | 
						|
		ve |= EWayland
 | 
						|
	}
 | 
						|
	if v.X11 {
 | 
						|
		ve |= EX11
 | 
						|
	}
 | 
						|
	if v.DBus {
 | 
						|
		ve |= EDBus
 | 
						|
	}
 | 
						|
	if v.Pulse {
 | 
						|
		ve |= EPulse
 | 
						|
	}
 | 
						|
	*e = Enablements(ve)
 | 
						|
	return nil
 | 
						|
}
 |