// 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;
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")]
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.
BackgroundWorker worker;
object user_async_state;
-#if NET_4_5
CancellationTokenSource cts;
-#endif
public event PingCompletedEventHandler PingCompleted;
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
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);
ping.StartInfo.RedirectStandardOutput = true;
ping.StartInfo.RedirectStandardError = true;
+ IPStatus status = IPStatus.Unknown;
try {
ping.Start ();
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
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) {
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");
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
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 ());
return task;
}
-#endif
}
}
-