[System] Remove Process.Start and related API from TvOS/WatchOS.
[mono.git] / mcs / class / System / System.Net.NetworkInformation / Ping.cs
index e7b65d0ae35a8ad5f03ec43e4f25806282550701..abb6d5d6bce4f5fcae3d6a2a5b1e705925971278 100644 (file)
@@ -26,6 +26,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
+
 using System;
 using System.IO;
 using System.Text;
@@ -36,10 +37,8 @@ using System.Net.Sockets;
 using System.Security.Principal;
 using System.Security.Cryptography;
 using System.Runtime.InteropServices;
-#if NET_4_5
 using System.Threading;
 using System.Threading.Tasks;
-#endif
 
 namespace System.Net.NetworkInformation {
        [MonoTODO ("IPv6 support is missing")]
@@ -64,7 +63,10 @@ namespace System.Net.NetworkInformation {
                static readonly string [] PingBinPaths = new string [] {
                        "/bin/ping",
                        "/sbin/ping",
-                       "/usr/sbin/ping"
+                       "/usr/sbin/ping",
+#if MONODROID
+                       "/system/bin/ping"
+#endif
                };
                static readonly string PingBinPath;
                const int default_timeout = 4000; // 4 sec.
@@ -80,9 +82,7 @@ namespace System.Net.NetworkInformation {
 
                BackgroundWorker worker;
                object user_async_state;
-#if NET_4_5
                CancellationTokenSource cts;
-#endif
                
                public event PingCompletedEventHandler PingCompleted;
                
@@ -150,13 +150,12 @@ namespace System.Net.NetworkInformation {
 
                protected void OnPingCompleted (PingCompletedEventArgs e)
                {
-                       if (PingCompleted != null)
-                               PingCompleted (this, e);
                        user_async_state = null;
                        worker = null;
-#if NET_4_5
                        cts = null;
-#endif
+
+                       if (PingCompleted != null)
+                               PingCompleted (this, e);
                }
 
                // Sync
@@ -288,7 +287,8 @@ namespace System.Net.NetworkInformation {
 
                private PingReply SendUnprivileged (IPAddress address, int timeout, byte [] buffer, PingOptions options)
                {
-                       DateTime sentTime = DateTime.Now;
+#if MONO_FEATURE_PROCESS_START
+                       DateTime sentTime = DateTime.UtcNow;
 
                        Process ping = new Process ();
                        string args = BuildPingArgs (address, timeout, options);
@@ -303,6 +303,7 @@ namespace System.Net.NetworkInformation {
                        ping.StartInfo.RedirectStandardOutput = true;
                        ping.StartInfo.RedirectStandardError = true;
 
+                       IPStatus status = IPStatus.Unknown;
                        try {
                                ping.Start ();
 
@@ -311,23 +312,24 @@ namespace System.Net.NetworkInformation {
                                string stderr = ping.StandardError.ReadToEnd ();
 #pragma warning restore 219
                                
-                               trip_time = (long) (DateTime.Now - sentTime).TotalMilliseconds;
+                               trip_time = (long) (DateTime.UtcNow - sentTime).TotalMilliseconds;
                                if (!ping.WaitForExit (timeout) || (ping.HasExited && ping.ExitCode == 2))
-                                       return new PingReply (address, buffer, options, trip_time, IPStatus.TimedOut); 
-
-                               if (ping.ExitCode == 1)
-                                       return new PingReply (address, buffer, options, trip_time, IPStatus.TtlExpired);
-                       } catch (Exception) {
-                               return new PingReply (address, buffer, options, trip_time, IPStatus.Unknown);
+                                       status = IPStatus.TimedOut;
+                               else if (ping.ExitCode == 0)
+                                       status = IPStatus.Success;
+                               else if (ping.ExitCode == 1)
+                                       status = IPStatus.TtlExpired;
+                       } catch {
                        } finally {
-                               if (ping != null) {
-                                       if (!ping.HasExited)
-                                               ping.Kill ();
-                                       ping.Dispose ();
-                               }
+                               if (!ping.HasExited)
+                                       ping.Kill ();
+                               ping.Dispose ();
                        }
 
-                       return new PingReply (address, buffer, options, trip_time, IPStatus.Success);
+                       return new PingReply (address, buffer, options, trip_time, status);
+#else
+                       throw new NotSupportedException ("Ping is not supported on this platform.");
+#endif // MONO_FEATURE_PROCESS_START
                }
 
                // Async
@@ -370,13 +372,8 @@ namespace System.Net.NetworkInformation {
 
                public void SendAsync (IPAddress address, int timeout, byte [] buffer, PingOptions options, object userToken)
                {
-#if NET_4_5
                        if ((worker != null) || (cts != null))
                                throw new InvalidOperationException ("Another SendAsync operation is in progress");
-#else
-                       if (worker != null)
-                               throw new InvalidOperationException ("Another SendAsync operation is in progress");
-#endif
 
                        worker = new BackgroundWorker ();
                        worker.DoWork += delegate (object o, DoWorkEventArgs ea) {
@@ -399,12 +396,10 @@ namespace System.Net.NetworkInformation {
 
                public void SendAsyncCancel ()
                {
-#if NET_4_5
                        if (cts != null) {
                                cts.Cancel ();
                                return;
                        }
-#endif
 
                        if (worker == null)
                                throw new InvalidOperationException ("SendAsync operation is not in progress");
@@ -530,7 +525,7 @@ namespace System.Net.NetworkInformation {
                        CultureInfo culture = CultureInfo.InvariantCulture;
                        StringBuilder args = new StringBuilder ();
                        uint t = Convert.ToUInt32 (Math.Floor ((timeout + 1000) / 1000.0));
-                       bool is_mac = ((int) Environment.OSVersion.Platform == 6);
+                       bool is_mac = Platform.IsMacOS;
                        if (!is_mac)
                                args.AppendFormat (culture, "-q -n -c {0} -w {1} -t {2} -M ", DefaultCount, t, options.Ttl);
                        else
@@ -545,7 +540,6 @@ namespace System.Net.NetworkInformation {
                        return args.ToString ();
                }
 
-#if NET_4_5
                public Task<PingReply> SendPingAsync (IPAddress address, int timeout, byte [] buffer)
                {
                        return SendPingAsync (address, default_timeout, default_buffer, new PingOptions ());
@@ -601,7 +595,5 @@ namespace System.Net.NetworkInformation {
 
                        return task;
                }
-#endif
        }
 }
-