MCPcopy Create free account
hub / github.com/1player/host-spawn / SpawnAndWait

Method SpawnAndWait

command.go:49–111  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

47}
48
49func (c *Command) SpawnAndWait() (int, error) {
50 // Connect to the dbus session to talk with flatpak-session-helper process.
51 conn, err := dbus.ConnectSessionBus()
52 if err != nil {
53 return 0, err
54 }
55 defer conn.Close()
56
57 // Subscribe to HostCommandExited messages
58 if err = conn.AddMatchSignal(
59 dbus.WithMatchInterface("org.freedesktop.Flatpak.Development"),
60 dbus.WithMatchMember("HostCommandExited"),
61 ); err != nil {
62 return 0, err
63 }
64 dbusSignals := make(chan *dbus.Signal, 1)
65 conn.Signal(dbusSignals)
66
67 // Spawn host command
68 c.proxy = conn.Object("org.freedesktop.Flatpak", "/org/freedesktop/Flatpak/Development")
69
70 cwdPath := nullTerminatedByteString(c.WorkingDirectory)
71
72 argv := make([][]byte, len(c.Args))
73 for i, arg := range c.Args {
74 argv[i] = nullTerminatedByteString(arg)
75 }
76
77 fds := map[uint32]dbus.UnixFD{
78 0: dbus.UnixFD(os.Stdin.Fd()),
79 1: dbus.UnixFD(os.Stdout.Fd()),
80 2: dbus.UnixFD(os.Stderr.Fd()),
81 }
82 if c.AllocatePty {
83 c.pty, err = createPty()
84 if err != nil {
85 return 0, err
86 }
87 err = c.pty.Start()
88 if err != nil {
89 return 0, err
90 }
91 defer c.pty.Terminate()
92
93 fds[0] = dbus.UnixFD(c.pty.Stdin().Fd())
94 fds[1] = dbus.UnixFD(c.pty.Stdout().Fd())
95 fds[2] = dbus.UnixFD(c.pty.Stderr().Fd())
96 }
97
98 flags := uint32(0)
99
100 // Call command on the host
101 err = c.proxy.Call("org.freedesktop.Flatpak.Development.HostCommand", 0,
102 cwdPath, argv, fds, c.EnvVars, flags,
103 ).Store(&c.pid)
104
105 // an error occurred this early, most likely command not found.
106 if err != nil {

Callers 1

mainFunction · 0.95

Calls 8

waitForSignalsMethod · 0.95
nullTerminatedByteStringFunction · 0.85
createPtyFunction · 0.85
StartMethod · 0.80
TerminateMethod · 0.80
StdinMethod · 0.80
StdoutMethod · 0.80
StderrMethod · 0.80

Tested by

no test coverage detected