diff --git a/core/cmd/dms/commands_common.go b/core/cmd/dms/commands_common.go index a5fd75b3..cfb087fa 100644 --- a/core/cmd/dms/commands_common.go +++ b/core/cmd/dms/commands_common.go @@ -64,9 +64,8 @@ var killCmd = &cobra.Command{ } var ipcCmd = &cobra.Command{ - Use: "ipc [target] [function] [args...]", - Short: "Send IPC commands to running DMS shell", - PreRunE: findConfig, + Use: "ipc [target] [function] [args...]", + Short: "Send IPC commands to running DMS shell", ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { _ = findConfig(cmd, args) return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp diff --git a/core/cmd/dms/shell.go b/core/cmd/dms/shell.go index 212dd9d8..7ce20039 100644 --- a/core/cmd/dms/shell.go +++ b/core/cmd/dms/shell.go @@ -622,6 +622,43 @@ func getShellIPCCompletions(args []string, _ string) []string { return nil } +func getFirstDMSPID() (int, bool) { + dir := getRuntimeDir() + entries, err := os.ReadDir(dir) + if err != nil { + return 0, false + } + + for _, entry := range entries { + if !strings.HasPrefix(entry.Name(), "danklinux-") || !strings.HasSuffix(entry.Name(), ".pid") { + continue + } + + data, err := os.ReadFile(filepath.Join(dir, entry.Name())) + if err != nil { + continue + } + + pid, err := strconv.Atoi(strings.TrimSpace(string(data))) + if err != nil { + continue + } + + proc, err := os.FindProcess(pid) + if err != nil { + continue + } + + if proc.Signal(syscall.Signal(0)) != nil { + continue + } + + return pid, true + } + + return 0, false +} + func runShellIPCCommand(args []string) { if len(args) == 0 { printIPCHelp() @@ -633,10 +670,21 @@ func runShellIPCCommand(args []string) { } cmdArgs := []string{"ipc"} - if qsHasAnyDisplay() { - cmdArgs = append(cmdArgs, "--any-display") + + switch pid, ok := getFirstDMSPID(); { + case ok: + cmdArgs = append(cmdArgs, "--pid", strconv.Itoa(pid)) + default: + if err := findConfig(nil, nil); err != nil { + log.Fatalf("Error finding config: %v", err) + } + // ! TODO - remove check when QS 0.3 is released + if qsHasAnyDisplay() { + cmdArgs = append(cmdArgs, "--any-display") + } + cmdArgs = append(cmdArgs, "-p", configPath) } - cmdArgs = append(cmdArgs, "-p", configPath) + cmdArgs = append(cmdArgs, args...) cmd := exec.Command("qs", cmdArgs...) cmd.Stdin = os.Stdin