2 // mac-reachability.c: System.Net.NetworkingInformation.NetworkChange
3 // implementation for Mac OS X using SystemConfiguration's
4 // NetworkReachability API.
7 // Aaron Bockover (abock@xamarin.com)
9 // Copyright (c) 2013 Xamarin, Inc. (http://www.xamarin.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 int mono_sc_reachability_enabled ();
33 #if defined(PLATFORM_MACOSX) || defined(TARGET_IOS)
36 mono_sc_reachability_enabled ()
41 #include <SystemConfiguration/SCNetworkReachability.h>
42 #include <netinet/in.h>
44 typedef void (*mono_sc_reachability_callback)(int);
47 SCNetworkReachabilityRef reachability;
48 mono_sc_reachability_callback callback;
49 } mono_sc_reachability;
51 mono_sc_reachability * mono_sc_reachability_new (mono_sc_reachability_callback callback);
52 void mono_sc_reachability_free (mono_sc_reachability *reachability);
53 int mono_sc_reachability_is_available (mono_sc_reachability *reachability);
56 _mono_sc_reachability_is_available (SCNetworkReachabilityFlags flags)
58 return (flags & kSCNetworkFlagsReachable) && (flags & kSCNetworkFlagsConnectionRequired) == 0;
62 _mono_sc_reachability_callback (SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *user)
64 mono_sc_reachability *reachability;
70 reachability = (mono_sc_reachability *)user;
71 if (reachability->callback == NULL) {
75 reachability->callback (_mono_sc_reachability_is_available (flags));
78 mono_sc_reachability *
79 mono_sc_reachability_new (mono_sc_reachability_callback callback)
81 struct sockaddr_in zero;
82 SCNetworkReachabilityRef reachability;
83 SCNetworkReachabilityContext context = {0,};
84 mono_sc_reachability *instance;
86 if (callback == NULL) {
90 bzero (&zero, sizeof (zero));
91 zero.sin_len = sizeof (zero);
92 zero.sin_family = AF_INET;
94 reachability = SCNetworkReachabilityCreateWithAddress (NULL, (const struct sockaddr *)&zero);
95 if (reachability == NULL) {
99 instance = (mono_sc_reachability *)malloc (sizeof (mono_sc_reachability));
100 instance->reachability = reachability;
101 instance->callback = callback;
103 context.info = instance;
105 if (!SCNetworkReachabilitySetCallback (reachability, _mono_sc_reachability_callback, &context) ||
106 !SCNetworkReachabilityScheduleWithRunLoop (reachability, CFRunLoopGetCurrent (), kCFRunLoopDefaultMode)) {
107 mono_sc_reachability_free (instance);
115 mono_sc_reachability_free (mono_sc_reachability *reachability)
117 if (reachability != NULL) {
118 if (reachability->reachability != NULL) {
119 SCNetworkReachabilityUnscheduleFromRunLoop (reachability->reachability,
120 CFRunLoopGetCurrent (), kCFRunLoopDefaultMode);
121 CFRelease (reachability->reachability);
122 reachability->reachability = NULL;
125 reachability->callback = NULL;
132 mono_sc_reachability_is_available (mono_sc_reachability *reachability)
134 SCNetworkReachabilityFlags flags;
135 return reachability != NULL && reachability->reachability != NULL &&
136 SCNetworkReachabilityGetFlags (reachability->reachability, &flags) &&
137 _mono_sc_reachability_is_available (flags);
143 mono_sc_reachability_enabled ()