Resolve https://github.com/HikariKnight/quickpassthrough/pull/28#discussion_r1646606680 and https://github.com/HikariKnight/quickpassthrough/pull/28#discussion_r1646594105
This commit is contained in:
parent
7fddd4d073
commit
ce15213009
3 changed files with 117 additions and 3 deletions
|
@ -83,7 +83,7 @@ func Set_KernelStub(isRoot bool) {
|
||||||
|
|
||||||
// Run and log, check for errors
|
// Run and log, check for errors
|
||||||
common.ErrorCheck(command.ExecAndLogSudo(isRoot, true,
|
common.ErrorCheck(command.ExecAndLogSudo(isRoot, true,
|
||||||
"kernelstub -a "+fmt.Sprintf("\"%s\"", kernel_args),
|
fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
|
||||||
),
|
),
|
||||||
"Error, kernelstub command returned exit code 1",
|
"Error, kernelstub command returned exit code 1",
|
||||||
)
|
)
|
||||||
|
|
|
@ -112,6 +112,28 @@ func Clear() {
|
||||||
_ = c.Run()
|
_ = c.Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func processCmdString(cmd string) (string, []string) {
|
||||||
|
// handle quoted arguments
|
||||||
|
args := strings.Fields(cmd)
|
||||||
|
cmdBin := args[0]
|
||||||
|
args = args[1:]
|
||||||
|
for i, arg := range args {
|
||||||
|
if !strings.HasPrefix(arg, "\"") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// find the end of the quoted argument
|
||||||
|
for j, a := range args[i:] {
|
||||||
|
if strings.HasSuffix(a, "\"") {
|
||||||
|
args[i] = strings.Join(args[i:i+j+1], " ")
|
||||||
|
args = append(args[:i+1], args[i+j+1:]...)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmdBin, args
|
||||||
|
}
|
||||||
|
|
||||||
// ExecAndLogSudo executes an elevated command and logs the output.
|
// ExecAndLogSudo executes an elevated command and logs the output.
|
||||||
//
|
//
|
||||||
// * if we're root, the command is executed directly
|
// * if we're root, the command is executed directly
|
||||||
|
@ -138,8 +160,8 @@ func ExecAndLogSudo(isRoot, noisy bool, cmd string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cs := strings.Fields(cmd)
|
cmdBin, args := processCmdString(cmd)
|
||||||
r := exec.Command(cs[0], cs[1:]...)
|
r := exec.Command(cmdBin, args...)
|
||||||
r.Dir = wd
|
r.Dir = wd
|
||||||
|
|
||||||
cmdCombinedOut, err := r.CombinedOutput()
|
cmdCombinedOut, err := r.CombinedOutput()
|
||||||
|
|
92
pkg/command/command_test.go
Normal file
92
pkg/command/command_test.go
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
package command
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_processCmdString(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
cmd string
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_args := "intel_iommu=on iommu=pt vfio-pci.ids=10de:1c03,10de:10f1"
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
want1 []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "ls -l",
|
||||||
|
args: args{
|
||||||
|
cmd: "ls -l",
|
||||||
|
},
|
||||||
|
want: "ls",
|
||||||
|
want1: []string{
|
||||||
|
"-l",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ls -l -a",
|
||||||
|
args: args{
|
||||||
|
cmd: "ls -l -a",
|
||||||
|
},
|
||||||
|
want: "ls",
|
||||||
|
want1: []string{
|
||||||
|
"-l",
|
||||||
|
"-a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "rm -v \"file.txt\"",
|
||||||
|
args: args{
|
||||||
|
cmd: "rm -v \"file.txt\"",
|
||||||
|
},
|
||||||
|
want: "rm",
|
||||||
|
want1: []string{
|
||||||
|
"-v",
|
||||||
|
"\"file.txt\"",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "rm -v \"file.txt\" -f",
|
||||||
|
args: args{
|
||||||
|
cmd: "rm -v \"file.txt\" -f",
|
||||||
|
},
|
||||||
|
want: "rm",
|
||||||
|
want1: []string{
|
||||||
|
"-v",
|
||||||
|
"\"file.txt\"",
|
||||||
|
"-f",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
|
||||||
|
args: args{
|
||||||
|
cmd: fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
|
||||||
|
},
|
||||||
|
want: "kernelstub",
|
||||||
|
want1: []string{
|
||||||
|
"-a",
|
||||||
|
fmt.Sprintf("\"%s\"", kernel_args),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, got1 := processCmdString(tt.args.cmd)
|
||||||
|
if got != tt.want {
|
||||||
|
t.Errorf("processCmdString() got = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
t.Logf("got: %v", got)
|
||||||
|
t.Logf("got1: %v", got1)
|
||||||
|
if !reflect.DeepEqual(got1, tt.want1) {
|
||||||
|
t.Errorf("processCmdString() got1 = %v, want %v", got1, tt.want1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue