From f9bafd7a8313889966b620b7a0f98795875c9d23 Mon Sep 17 00:00:00 2001 From: Radoslav Dimitrov Date: Fri, 23 May 2025 11:04:30 +0300 Subject: [PATCH 1/3] Add special handling for running detached processes in windows Signed-off-by: Radoslav Dimitrov --- pkg/lifecycle/manager.go | 4 +--- pkg/lifecycle/sysproc_unix.go | 15 +++++++++++++++ pkg/lifecycle/sysproc_windows.go | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 pkg/lifecycle/sysproc_unix.go create mode 100644 pkg/lifecycle/sysproc_windows.go diff --git a/pkg/lifecycle/manager.go b/pkg/lifecycle/manager.go index 6bc2a12b..d14e4288 100644 --- a/pkg/lifecycle/manager.go +++ b/pkg/lifecycle/manager.go @@ -312,9 +312,7 @@ func (*defaultManager) RunContainerDetached(runConfig *runner.RunConfig) error { // Detach the process from the terminal detachedCmd.Stdin = nil - detachedCmd.SysProcAttr = &syscall.SysProcAttr{ - Setsid: true, // Create a new session - } + detachedCmd.SysProcAttr = getSysProcAttr() // Start the detached process if err := detachedCmd.Start(); err != nil { diff --git a/pkg/lifecycle/sysproc_unix.go b/pkg/lifecycle/sysproc_unix.go new file mode 100644 index 00000000..8c34393c --- /dev/null +++ b/pkg/lifecycle/sysproc_unix.go @@ -0,0 +1,15 @@ +//go:build !windows +// +build !windows + +package lifecycle + +import ( + "syscall" +) + +// getSysProcAttr returns the platform-specific SysProcAttr for detaching processes +func getSysProcAttr() *syscall.SysProcAttr { + return &syscall.SysProcAttr{ + Setsid: true, // Create a new session (Unix only) + } +} \ No newline at end of file diff --git a/pkg/lifecycle/sysproc_windows.go b/pkg/lifecycle/sysproc_windows.go new file mode 100644 index 00000000..c236aaba --- /dev/null +++ b/pkg/lifecycle/sysproc_windows.go @@ -0,0 +1,17 @@ +//go:build windows +// +build windows + +package lifecycle + +import ( + "syscall" +) + +// getSysProcAttr returns the platform-specific SysProcAttr for detaching processes +func getSysProcAttr() *syscall.SysProcAttr { + return &syscall.SysProcAttr{ + // Windows doesn't have Setsid + // Instead, use CreationFlags with CREATE_NEW_PROCESS_GROUP and DETACHED_PROCESS + CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP | 0x00000008, // 0x00000008 is DETACHED_PROCESS + } +} \ No newline at end of file From d4dc21d4e2ebf634225998d521aa31fc530f2962 Mon Sep 17 00:00:00 2001 From: Radoslav Dimitrov Date: Fri, 23 May 2025 11:05:41 +0300 Subject: [PATCH 2/3] Enable windows build for goreleaser Signed-off-by: Radoslav Dimitrov --- .goreleaser.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 24c25697..ba1507d7 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -16,7 +16,7 @@ builds: - "-X github.com/stacklok/toolhive/pkg/versions.BuildDate={{ .Date }}" goos: - linux -# - windows + - windows - darwin goarch: - amd64 From 995db01e47fb00579ba7b64d68f44d9981d87112 Mon Sep 17 00:00:00 2001 From: Radoslav Dimitrov Date: Fri, 23 May 2025 11:11:13 +0300 Subject: [PATCH 3/3] Fix linting errors Signed-off-by: Radoslav Dimitrov --- pkg/lifecycle/manager.go | 1 - pkg/lifecycle/sysproc_unix.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/lifecycle/manager.go b/pkg/lifecycle/manager.go index d14e4288..0752cb01 100644 --- a/pkg/lifecycle/manager.go +++ b/pkg/lifecycle/manager.go @@ -7,7 +7,6 @@ import ( "fmt" "os" "os/exec" - "syscall" "github.com/adrg/xdg" diff --git a/pkg/lifecycle/sysproc_unix.go b/pkg/lifecycle/sysproc_unix.go index 8c34393c..f770e8ab 100644 --- a/pkg/lifecycle/sysproc_unix.go +++ b/pkg/lifecycle/sysproc_unix.go @@ -12,4 +12,4 @@ func getSysProcAttr() *syscall.SysProcAttr { return &syscall.SysProcAttr{ Setsid: true, // Create a new session (Unix only) } -} \ No newline at end of file +}