mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-06 05:17:49 +00:00
This commit is contained in:
parent
eb81f7400c
commit
5fd6278609
@ -83,6 +83,15 @@ func monitorMain(options serveOptions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args := os.Args
|
args := os.Args
|
||||||
|
binary := args[0]
|
||||||
|
if build.IsWindows {
|
||||||
|
var err error
|
||||||
|
binary, err = expandExecutableInCurrentDirectory(binary)
|
||||||
|
if err != nil {
|
||||||
|
l.Warnln("Error starting the main Syncthing process:", err)
|
||||||
|
panic("Error starting the main Syncthing process")
|
||||||
|
}
|
||||||
|
}
|
||||||
var restarts [restartCounts]time.Time
|
var restarts [restartCounts]time.Time
|
||||||
|
|
||||||
stopSign := make(chan os.Signal, 1)
|
stopSign := make(chan os.Signal, 1)
|
||||||
@ -104,7 +113,7 @@ func monitorMain(options serveOptions) {
|
|||||||
copy(restarts[0:], restarts[1:])
|
copy(restarts[0:], restarts[1:])
|
||||||
restarts[len(restarts)-1] = time.Now()
|
restarts[len(restarts)-1] = time.Now()
|
||||||
|
|
||||||
cmd := exec.Command(args[0], args[1:]...)
|
cmd := exec.Command(binary, args[1:]...)
|
||||||
cmd.Env = childEnv
|
cmd.Env = childEnv
|
||||||
|
|
||||||
stderr, err := cmd.StderrPipe()
|
stderr, err := cmd.StderrPipe()
|
||||||
@ -180,7 +189,7 @@ func monitorMain(options serveOptions) {
|
|||||||
// Restart the monitor process to release the .old
|
// Restart the monitor process to release the .old
|
||||||
// binary as part of the upgrade process.
|
// binary as part of the upgrade process.
|
||||||
l.Infoln("Restarting monitor...")
|
l.Infoln("Restarting monitor...")
|
||||||
if err = restartMonitor(args); err != nil {
|
if err = restartMonitor(binary, args); err != nil {
|
||||||
l.Warnln("Restart:", err)
|
l.Warnln("Restart:", err)
|
||||||
}
|
}
|
||||||
os.Exit(exitCode)
|
os.Exit(exitCode)
|
||||||
@ -203,6 +212,21 @@ func monitorMain(options serveOptions) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func expandExecutableInCurrentDirectory(args0 string) (string, error) {
|
||||||
|
// Works around a restriction added in go1.19 that executables in the
|
||||||
|
// current directory are not resolved when specifying just an executable
|
||||||
|
// name (like e.g. "syncthing")
|
||||||
|
if !strings.ContainsRune(args0, os.PathSeparator) {
|
||||||
|
// Check if it's in PATH
|
||||||
|
_, err := exec.LookPath(args0)
|
||||||
|
if err != nil {
|
||||||
|
// Try to get the path to the current executable
|
||||||
|
return os.Executable()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return args0, nil
|
||||||
|
}
|
||||||
|
|
||||||
func copyStderr(stderr io.Reader, dst io.Writer) {
|
func copyStderr(stderr io.Reader, dst io.Writer) {
|
||||||
br := bufio.NewReader(stderr)
|
br := bufio.NewReader(stderr)
|
||||||
|
|
||||||
@ -309,7 +333,7 @@ func copyStdout(stdout io.Reader, dst io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func restartMonitor(args []string) error {
|
func restartMonitor(binary string, args []string) error {
|
||||||
// Set the STRESTART environment variable to indicate to the next
|
// Set the STRESTART environment variable to indicate to the next
|
||||||
// process that this is a restart and not initial start. This prevents
|
// process that this is a restart and not initial start. This prevents
|
||||||
// opening the browser on startup.
|
// opening the browser on startup.
|
||||||
@ -319,19 +343,20 @@ func restartMonitor(args []string) error {
|
|||||||
// syscall.Exec is the cleanest way to restart on Unixes as it
|
// syscall.Exec is the cleanest way to restart on Unixes as it
|
||||||
// replaces the current process with the new one, keeping the pid and
|
// replaces the current process with the new one, keeping the pid and
|
||||||
// controlling terminal and so on
|
// controlling terminal and so on
|
||||||
return restartMonitorUnix(args)
|
return restartMonitorUnix(binary, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
// but it isn't supported on Windows, so there we start a normal
|
// but it isn't supported on Windows, so there we start a normal
|
||||||
// exec.Command and return.
|
// exec.Command and return.
|
||||||
return restartMonitorWindows(args)
|
return restartMonitorWindows(binary, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
func restartMonitorUnix(args []string) error {
|
func restartMonitorUnix(binary string, args []string) error {
|
||||||
if !strings.ContainsRune(args[0], os.PathSeparator) {
|
if !strings.ContainsRune(binary, os.PathSeparator) {
|
||||||
// The path to the binary doesn't contain a slash, so it should be
|
// The path to the binary doesn't contain a slash, so it should be
|
||||||
// found in $PATH.
|
// found in $PATH.
|
||||||
binary, err := exec.LookPath(args[0])
|
var err error
|
||||||
|
binary, err = exec.LookPath(binary)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -341,8 +366,8 @@ func restartMonitorUnix(args []string) error {
|
|||||||
return syscall.Exec(args[0], args, os.Environ())
|
return syscall.Exec(args[0], args, os.Environ())
|
||||||
}
|
}
|
||||||
|
|
||||||
func restartMonitorWindows(args []string) error {
|
func restartMonitorWindows(binary string, args []string) error {
|
||||||
cmd := exec.Command(args[0], args[1:]...)
|
cmd := exec.Command(binary, args[1:]...)
|
||||||
// Retain the standard streams
|
// Retain the standard streams
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
|
Loading…
Reference in New Issue
Block a user