forked from luckfox-eng29/kvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnative_linux.go
More file actions
153 lines (123 loc) · 3.58 KB
/
native_linux.go
File metadata and controls
153 lines (123 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//go:build linux
package kvm
import (
"fmt"
"os/exec"
"sync"
"syscall"
"github.com/rs/zerolog"
)
type nativeOutput struct {
mu *sync.Mutex
logger *zerolog.Event
}
func (w *nativeOutput) Write(p []byte) (n int, err error) {
w.mu.Lock()
defer w.mu.Unlock()
w.logger.Msg(string(p))
return len(p), nil
}
func startVideoBinary(binaryPath string) (*exec.Cmd, error) {
// Run the binary inthe background
cmd := exec.Command(binaryPath)
vidoeOutputLock := sync.Mutex{}
videoStdout := &nativeOutput{
mu: &vidoeOutputLock,
logger: videoLogger.Info().Str("pipe", "stdout"),
}
videoStderr := &nativeOutput{
mu: &vidoeOutputLock,
logger: videoLogger.Info().Str("pipe", "stderr"),
}
// Redirect stdout and stderr to the current process
cmd.Stdout = videoStdout
cmd.Stderr = videoStderr
// Set the process group ID so we can kill the process and its children when this process exits
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Pdeathsig: syscall.SIGKILL,
}
// Start the command
if err := cmd.Start(); err != nil {
return nil, fmt.Errorf("failed to start binary: %w", err)
}
return cmd, nil
}
func startAudioBinary(binaryPath string) (*exec.Cmd, error) {
// Run the binary inthe background
cmd := exec.Command(binaryPath)
audioOutputLock := sync.Mutex{}
audioStdout := &nativeOutput{
mu: &audioOutputLock,
logger: audioLogger.Info().Str("pipe", "stdout"),
}
audioStderr := &nativeOutput{
mu: &audioOutputLock,
logger: audioLogger.Info().Str("pipe", "stderr"),
}
// Redirect stdout and stderr to the current process
cmd.Stdout = audioStdout
cmd.Stderr = audioStderr
// Set the process group ID so we can kill the process and its children when this process exits
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Pdeathsig: syscall.SIGKILL,
}
// Start the command
if err := cmd.Start(); err != nil {
return nil, fmt.Errorf("failed to start binary: %w", err)
}
return cmd, nil
}
func startVpnBinary(binaryPath string) (*exec.Cmd, error) {
// Run the binary inthe background
cmd := exec.Command(binaryPath)
vpnOutputLock := sync.Mutex{}
vpnStdout := &nativeOutput{
mu: &vpnOutputLock,
logger: audioLogger.Info().Str("pipe", "stdout"),
}
vpnStderr := &nativeOutput{
mu: &vpnOutputLock,
logger: audioLogger.Info().Str("pipe", "stderr"),
}
// Redirect stdout and stderr to the current process
cmd.Stdout = vpnStdout
cmd.Stderr = vpnStderr
// Set the process group ID so we can kill the process and its children when this process exits
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Pdeathsig: syscall.SIGKILL,
}
// Start the command
if err := cmd.Start(); err != nil {
return nil, fmt.Errorf("failed to start binary: %w", err)
}
return cmd, nil
}
func startDisplayBinary(binaryPath string) (*exec.Cmd, error) {
// Run the binary inthe background
cmd := exec.Command(binaryPath)
displayOutputLock := sync.Mutex{}
displayStdout := &nativeOutput{
mu: &displayOutputLock,
logger: displayLogger.Info().Str("pipe", "stdout"),
}
displayStderr := &nativeOutput{
mu: &displayOutputLock,
logger: displayLogger.Info().Str("pipe", "stderr"),
}
//// Redirect stdout and stderr to the current process
cmd.Stdout = displayStdout
cmd.Stderr = displayStderr
// Set the process group ID so we can kill the process and its children when this process exits
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Pdeathsig: syscall.SIGKILL,
}
// Start the command
if err := cmd.Start(); err != nil {
return nil, fmt.Errorf("failed to start binary: %w", err)
}
return cmd, nil
}