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