diff options
Diffstat (limited to 'windows/ZeroTierOneService/Service.cs')
| -rw-r--r-- | windows/ZeroTierOneService/Service.cs | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/windows/ZeroTierOneService/Service.cs b/windows/ZeroTierOneService/Service.cs index 4ac11bd0..306e8e4d 100644 --- a/windows/ZeroTierOneService/Service.cs +++ b/windows/ZeroTierOneService/Service.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.ServiceProcess; +using System.Threading; namespace ZeroTierOneService { @@ -18,24 +19,68 @@ namespace ZeroTierOneService this.ztBinary = this.ztHome + Path.DirectorySeparatorChar + (Environment.Is64BitOperatingSystem ? "zerotier-one_x64.exe" : "zerotier-one_x86.exe"); this.ztService = null; + this.ztKiller = null; } protected override void OnStart(string[] args) { - startZeroTierService(); + startZeroTierDaemon(); } protected override void OnStop() { - stopZeroTierService(); + stopZeroTierDaemon(); } - private void startZeroTierService() + private void startZeroTierDaemon() { + if (ztService != null) + return; + ztService = new Process(); + try + { + ztService.StartInfo.UseShellExecute = false; + ztService.StartInfo.FileName = ztBinary; + ztService.StartInfo.Arguments = ""; + ztService.StartInfo.CreateNoWindow = true; + ztService.Exited += ztService_Exited; + ztService.Start(); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + ztService = null; + } } - private void stopZeroTierService() + private void stopZeroTierDaemon() { + while (ztKiller != null) + Thread.Sleep(250); + + ztKiller = new Process(); + try + { + ztKiller.StartInfo.UseShellExecute = false; + ztKiller.StartInfo.FileName = ztBinary; + ztKiller.StartInfo.Arguments = "-q terminate ServiceShutdown"; + ztKiller.StartInfo.CreateNoWindow = true; + ztKiller.Exited += ztKiller_Exited; + ztKiller.Start(); + } + catch (Exception e) + { + ztKiller = null; + } + + int waited = 0; + while (ztKiller != null) + { + Thread.Sleep(250); + if (++waited > 100) + break; + } + if (ztService != null) { ztService.Kill(); @@ -43,15 +88,23 @@ namespace ZeroTierOneService } } + // Event generated when ztService exits private void ztService_Exited(object sender, System.EventArgs e) { ztService = null; } + // Event generated when ztKiller is done + private void ztKiller_Exited(object sender, System.EventArgs e) + { + ztKiller = null; + } + private string ztHome; private string ztUpdatesFolder; private string ztBinary; - private Process ztService; + private volatile Process ztService; + private volatile Process ztKiller; } } |
