summaryrefslogtreecommitdiff
path: root/windows/ZeroTierOneService/Service.cs
diff options
context:
space:
mode:
Diffstat (limited to 'windows/ZeroTierOneService/Service.cs')
-rw-r--r--windows/ZeroTierOneService/Service.cs63
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;
}
}