1/* 2 * Copyright (c) 2000-2013 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25#ifndef __SCNC_UTILS__ 26#define __SCNC_UTILS__ 27 28#include <SystemConfiguration/SCDPlugin.h> 29 30int getStringFromEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, 31 CFStringRef entity, CFStringRef property, u_char *str, u_int16_t maxlen); 32CFStringRef copyCFStringFromEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, 33 CFStringRef entity, CFStringRef property); 34int getNumberFromEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, 35 CFStringRef entity, CFStringRef property, u_int32_t *outval); 36int getAddressFromEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, 37 CFStringRef entity, CFStringRef property, u_int32_t *outval); 38int getNumber(CFDictionaryRef service, CFStringRef property, u_int32_t *outval); 39int getString(CFDictionaryRef service, CFStringRef property, u_char *str, u_int16_t maxlen); 40CFDictionaryRef copyService(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID); 41CFDictionaryRef copyEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, CFStringRef entity); 42int existEntity(SCDynamicStoreRef store, CFStringRef domain, CFStringRef serviceID, CFStringRef entity); 43 44u_int32_t CFStringAddrToLong(CFStringRef string); 45void AddNumber(CFMutableDictionaryRef dict, CFStringRef property, u_int32_t number); 46void AddNumber64(CFMutableDictionaryRef dict, CFStringRef property, u_int64_t number); 47void AddString(CFMutableDictionaryRef dict, CFStringRef property, char *string); 48void AddNumberFromState(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef entity, CFStringRef property, CFMutableDictionaryRef dict); 49void AddStringFromState(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef entity, CFStringRef property, CFMutableDictionaryRef dict); 50 51Boolean isString (CFTypeRef obj); 52Boolean isData (CFTypeRef obj); 53Boolean isArray (CFTypeRef obj); 54Boolean isDictionary (CFTypeRef obj); 55 56Boolean my_CFEqual(CFTypeRef obj1, CFTypeRef obj2); 57void my_CFRelease(void *t); 58CFTypeRef my_CFRetain(CFTypeRef obj); 59void my_close(int fd); 60 61Boolean GetIntFromDict (CFDictionaryRef dict, CFStringRef property, u_int32_t *outval, u_int32_t defaultval); 62int GetStrFromDict (CFDictionaryRef dict, CFStringRef property, char *outstr, int maxlen, char *defaultval); 63 64void *my_Allocate(int size); 65void my_Deallocate(void * addr, int size); 66 67CFDataRef Serialize(CFPropertyListRef obj, void **data, u_int32_t *dataLen); 68CFPropertyListRef Unserialize(void *data, u_int32_t dataLen); 69 70CFStringRef parse_component(CFStringRef key, CFStringRef prefix); 71 72int publish_dictnumentry(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef dict, CFStringRef entry, int val); 73int unpublish_dictentry(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef dict, CFStringRef entry); 74int publish_dictstrentry(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef dict, CFStringRef entry, char *str, int encoding); 75int unpublish_dict(SCDynamicStoreRef store, CFStringRef serviceID, CFStringRef dict); 76int publish_multiple_dicts(SCDynamicStoreRef store, CFStringRef serviceID, CFArrayRef dictNames, CFArrayRef dicts); 77int unpublish_multiple_dicts(SCDynamicStoreRef store, CFStringRef serviceID, CFArrayRef dictNames, Boolean removeService); 78 79Boolean UpdatePasswordPrefs(CFStringRef serviceID, CFStringRef interfaceType, SCNetworkInterfacePasswordType passwordType, 80 CFStringRef passwordEncryptionKey, CFStringRef passwordEncryptionValue, CFStringRef logTitle); 81 82int cfstring_is_ip(CFStringRef str); 83 84CFStringRef copyPrimaryService (SCDynamicStoreRef store); 85Boolean copyGateway(SCDynamicStoreRef store, u_int8_t family, char *ifname, int ifnamesize, struct sockaddr *gateway, int gatewaysize); 86Boolean hasGateway(SCDynamicStoreRef store, u_int8_t family); 87const char *inet_sockaddr_to_p(struct sockaddr *addr, char *buf, int buflen); 88int inet_p_to_sockaddr(char *buf, struct sockaddr *addr, int addrlen); 89Boolean equal_address(struct sockaddr *addr1, struct sockaddr *addr2); 90 91int set_ifmtu(char *ifname, int mtu); 92int set_ifaddr(char *ifname, u_int32_t o, u_int32_t h, u_int32_t m); 93int clear_ifaddr(char *ifname, u_int32_t o, u_int32_t h); 94int set_ifaddr6 (char *ifname, struct in6_addr *addr, int prefix); 95void in6_addr2net(struct in6_addr *addr, int prefix, struct in6_addr *net); 96int clear_ifaddr6 (char *ifname, struct in6_addr *addr); 97CFDictionaryRef create_ipv6_dummy_primary(char *if_name); 98CFDictionaryRef create_stateaddr(SCDynamicStoreRef store, CFStringRef serviceID, char *if_name, u_int32_t server, u_int32_t o, 99 u_int32_t h, u_int32_t m, int isprimary, CFArrayRef includedRoutes, CFArrayRef excludedRoutes); 100CFDictionaryRef create_proxies(SCDynamicStoreRef store, CFStringRef serviceID, int autodetect, CFStringRef server, int port, int bypasslocal, 101 CFStringRef exceptionlist, CFArrayRef supp_domains); 102boolean_t set_host_gateway(int cmd, struct sockaddr *host, struct sockaddr *gateway, char *ifname, int isnet); 103int route_gateway(int cmd, struct sockaddr *dest, struct sockaddr *mask, struct sockaddr *gateway, int use_gway_flag, int use_blackhole_flag); 104 105CFDictionaryRef create_dns(SCDynamicStoreRef store, CFStringRef serviceID, CFArrayRef dns, CFStringRef domain, CFArrayRef supp_domains, Boolean neverSearchDomains); 106void in6_len2mask(struct in6_addr *mask, int len); 107void in6_maskaddr(struct in6_addr *addr, struct in6_addr *mask); 108CFStringRef copy_primary_interface_name(CFStringRef exceptionServiceID); 109CFStringRef copy_service_id_for_interface(CFStringRef interfaceName); 110CFStringRef copy_interface_type(CFStringRef service_id); 111CFDictionaryRef copy_dns_dict(CFStringRef service_id); 112CFStringRef copy_interface_name(CFStringRef serviceID); 113CFBundleRef copy_app_bundle_from_persistentregistration(CFStringRef bundleID); 114 115Boolean primary_interface_is_cellular(Boolean *hasPrimaryInterface); 116Boolean interface_is_cellular(const char *interface_name); 117 118CFStringRef scnc_copy_remote_server (struct service *serv, Boolean *isHostname); 119 120#define IP_FORMAT "%d.%d.%d.%d" 121#define IP_CH(ip) ((u_char *)(ip)) 122#define IP_LIST(ip) IP_CH(ip)[0],IP_CH(ip)[1],IP_CH(ip)[2],IP_CH(ip)[3] 123 124 125#define CREATESERVICESETUP(a) SCDynamicStoreKeyCreateNetworkServiceEntity(0, \ 126 kSCDynamicStoreDomainSetup, kSCCompAnyRegex, a) 127#define CREATESERVICESTATE(a) SCDynamicStoreKeyCreateNetworkServiceEntity(0, \ 128 kSCDynamicStoreDomainState, kSCCompAnyRegex, a) 129#define CREATEPREFIXSETUP() SCDynamicStoreKeyCreate(0, CFSTR("%@/%@/%@/"), \ 130 kSCDynamicStoreDomainSetup, kSCCompNetwork, kSCCompService) 131#define CREATEPREFIXSTATE() SCDynamicStoreKeyCreate(0, CFSTR("%@/%@/%@/"), \ 132 kSCDynamicStoreDomainState, kSCCompNetwork, kSCCompService) 133#define CREATEGLOBALSETUP(a) SCDynamicStoreKeyCreateNetworkGlobalEntity(0, \ 134 kSCDynamicStoreDomainSetup, a) 135#define CREATEGLOBALSTATE(a) SCDynamicStoreKeyCreateNetworkGlobalEntity(0, \ 136 kSCDynamicStoreDomainState, a) 137 138/* Define keys for AirPort Setup and State interface dictionaries */ 139#define SC_AIRPORT_POWERENABLED_KEY CFSTR("PowerEnabled") 140#define SC_AIRPORT_POWERSTATUS_KEY CFSTR("Power Status") 141#define SC_AIRPORT_SSID_STR_KEY CFSTR("SSID_STR") 142 143 144int create_tun_interface(char *name, int name_max_len, int *index, int flags, int ext_stats); 145int set_tun_delegate(int tunsock, char *delegate_ifname); 146int event_create_socket(void *ctxt, int *eventfd, CFSocketRef *eventref, CFSocketCallBack callout, Boolean anysubclass); 147 148pid_t 149SCNCPluginExecCommand (CFRunLoopRef runloop, SCDPluginExecCallBack callback, void *context, uid_t uid, gid_t gid, 150 const char *path, char * const argv[]); 151pid_t 152SCNCPluginExecCommand2 (CFRunLoopRef runloop, SCDPluginExecCallBack callback, void *context, uid_t uid, gid_t gid, 153 const char *path,char * const argv[], SCDPluginExecSetup setup, void *setupContext); 154 155pid_t 156SCNCExecSBSLauncherCommandWithArguments (char *command, SCDPluginExecSetup setup, SCDPluginExecCallBack callback, void *callbackContext, ...); 157 158CFDictionaryRef 159collectEnvironmentVariables (SCDynamicStoreRef storeRef, CFStringRef serviceID); 160 161void 162applyEnvironmentVariables (struct service *serv); 163void 164extractEnvironmentVariables (CFDictionaryRef envVarDict, struct service *serv); 165 166/* Wcast-align fix - cast away alignment warning when buffer is aligned */ 167#define ALIGNED_CAST(type) (type)(void *) 168 169// scnc_stop reasons 170enum { 171 SCNC_STOP_NONE = 0, 172 SCNC_STOP_CTRL_STOP, 173 SCNC_STOP_SYS_SLEEP, 174 SCNC_STOP_USER_LOGOUT, 175 SCNC_STOP_USER_SWITCH, 176 SCNC_STOP_SOCK_DISCONNECT, 177 SCNC_STOP_SOCK_DISCONNECT_NO_CLIENT, 178 SCNC_STOP_PLUGIN_CHANGE, 179 SCNC_STOP_APP_REMOVED, 180 SCNC_STOP_USER_REQ, 181 SCNC_STOP_USER_REQ_NO_CLIENT, 182 SCNC_STOP_TERM_ALL, 183 SCNC_STOP_SERV_DISPOSE, 184}; 185 186const char * 187scnc_get_reason_str(int scnc_reason); 188const char * 189ppp_error_to_string (u_int32_t native_ppp_error); 190const char * 191ppp_dev_error_to_string (u_int16_t subtype, u_int32_t native_dev_error); 192const char * 193ipsec_error_to_string (int status); 194const char * 195vpn_error_to_string (u_int32_t status); 196void 197cleanup_dynamicstore(void *serv); 198 199CFArrayRef 200copy_service_order(void); 201 202void scnc_log(int level, CFStringRef format, ...) CF_FORMAT_FUNCTION(2, 3); 203 204#endif 205