#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/socket.h>
#include <SystemConfiguration/SystemConfiguration.h>
#include <SystemConfiguration/SCPrivate.h>
#ifndef kSCEntNetRefreshConfiguration
#define kSCEntNetRefreshConfiguration CFSTR("RefreshConfiguration")
#endif kSCEntNetRefreshConfiguration
Boolean
SCNetworkCheckReachabilityByAddress(const struct sockaddr *address,
const int addrlen,
SCNetworkConnectionFlags *flags)
{
SCNetworkReachabilityRef networkAddress;
Boolean ok;
struct sockaddr_storage ss;
if (!address ||
(addrlen == 0) ||
(addrlen > (int)sizeof(struct sockaddr_storage))) {
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
bzero(&ss, sizeof(ss));
bcopy(address, &ss, addrlen);
ss.ss_len = addrlen;
networkAddress = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&ss);
ok = SCNetworkReachabilityGetFlags(networkAddress, flags);
CFRelease(networkAddress);
return ok;
}
Boolean
SCNetworkCheckReachabilityByName(const char *nodename,
SCNetworkConnectionFlags *flags)
{
SCNetworkReachabilityRef networkAddress;
Boolean ok;
if (!nodename) {
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
networkAddress = SCNetworkReachabilityCreateWithName(NULL, nodename);
ok = SCNetworkReachabilityGetFlags(networkAddress, flags);
CFRelease(networkAddress);
return ok;
}
Boolean
SCNetworkInterfaceRefreshConfiguration(CFStringRef ifName)
{
CFStringRef key;
Boolean ret = FALSE;
SCDynamicStoreRef store = NULL;
store = SCDynamicStoreCreate(NULL,
CFSTR("SCNetworkInterfaceRefreshConfiguration"),
NULL, NULL);
if (store == NULL) {
goto done;
}
key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
kSCDynamicStoreDomainState,
ifName,
kSCEntNetRefreshConfiguration);
ret = SCDynamicStoreNotifyValue(store, key);
CFRelease(key);
done:
if (store != NULL) {
CFRelease(store);
}
return (ret);
}