fix: Windows daemon survives session jobs; quieter wrap note; correct mute error
Verified on a Windows 11 VM over WinRM: doctor, SAPI synthesis, Edge, oto/WASAPI playback, autostart, mute file, wrap exit codes, doctor --probe and toast mode all work. Three findings fixed: - The autostarted daemon died with the WinRM shell: Windows session hosts (WinRM, SSH, CI runners) put children into a job object that is terminated with the session. Spawn now starts the daemon with CREATE_BREAKAWAY_FROM_JOB first and falls back to a start without it when the job forbids breakaway. Confirmed: the daemon now outlives the WinRM shell and `talk daemon stop` still ends it. - `talk mute` without a daemon printed "daemon call failed (<nil>)": the outer err was reported instead of the call's. Now "no daemon (<reason>); writing the mute file directly". - `talk wrap` printed "command did not exit cleanly" for every non-zero exit code. The note is now reserved for commands that produced no exit code of their own (not found, signal); a plain failure is carried by the announcement and the exit code alone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
85fa64cfe6
commit
1b971bc3f6
7 files changed
+52
-22
No files matched your search
@@ -11,10 +11,18 @@ import (
|
||||
// binding to the caller's console.
|
||||
const detachedProcess = 0x00000008
|
||||
|
||||
// createBreakawayFromJob is the Win32 flag CREATE_BREAKAWAY_FROM_JOB: the
|
||||
// child leaves the parent's job object, so a session-bound job (WinRM, SSH,
|
||||
// CI) does not take the daemon down with it. Only works when the job allows
|
||||
// it; Spawn falls back to a start without the flag otherwise.
|
||||
const createBreakawayFromJob = 0x01000000
|
||||
|
||||
// detach detaches the child from the console: own process group (no Ctrl-C
|
||||
// from the shell) and no console (no flashing window).
|
||||
func detach(cmd *exec.Cmd) {
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP | detachedProcess,
|
||||
func detach(cmd *exec.Cmd, breakaway bool) {
|
||||
flags := uint32(syscall.CREATE_NEW_PROCESS_GROUP | detachedProcess)
|
||||
if breakaway {
|
||||
flags |= createBreakawayFromJob
|
||||
}
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: flags}
|
||||
}
|
||||
Reference in new issue
Block a user