mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-12-22 17:10:10 +00:00
Harvey Tindall
ad40d7d8a9
The password reset daemon wasn't being closed on restarts, so an extra pwr would be sent w/ every restart. Restarts & Interrupts (Ctrl-C) rarely worked, as there were multiple listeners to the "RESTART" channel, and I didn't know the message was consumed by whoever got it first, meaning if the main thread didn't get it first, the app wouldn't quit. Listeners are now registered, and the restart message is re-broadcasted until everyone's got it. Fixes #264
34 lines
708 B
Go
34 lines
708 B
Go
//go:build !windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
)
|
|
|
|
func (app *appContext) HardRestart() error {
|
|
defer func() {
|
|
quit := make(chan os.Signal, 0)
|
|
if r := recover(); r != nil {
|
|
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
|
|
<-quit
|
|
}
|
|
}()
|
|
args := os.Args
|
|
// After a single restart, args[0] gets messed up and isnt the real executable.
|
|
// JFA_DEEP tells the new process its a child, and JFA_EXEC is the real executable
|
|
if os.Getenv("JFA_DEEP") == "" {
|
|
os.Setenv("JFA_DEEP", "1")
|
|
os.Setenv("JFA_EXEC", args[0])
|
|
}
|
|
env := os.Environ()
|
|
err := syscall.Exec(os.Getenv("JFA_EXEC"), []string{""}, env)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
panic(fmt.Errorf("r"))
|
|
}
|