#ifndef _S_CFUTIL_H
#define _S_CFUTIL_H
#include <CoreFoundation/CoreFoundation.h>
#include <mach/mach.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdbool.h>
#include "symbol_scope.h"
#if NO_SYSTEMCONFIGURATION
static __inline__ CFTypeRef
isA_CFType(CFTypeRef obj, CFTypeID type)
{
if (obj == NULL)
return (NULL);
if (CFGetTypeID(obj) != type)
return (NULL);
return (obj);
}
static __inline__ CFTypeRef
isA_CFArray(CFTypeRef obj)
{
return (isA_CFType(obj, CFArrayGetTypeID()));
}
static __inline__ CFTypeRef
isA_CFBoolean(CFTypeRef obj)
{
return (isA_CFType(obj, CFBooleanGetTypeID()));
}
static __inline__ CFTypeRef
isA_CFData(CFTypeRef obj)
{
return (isA_CFType(obj, CFDataGetTypeID()));
}
static __inline__ CFTypeRef
isA_CFDictionary(CFTypeRef obj)
{
return (isA_CFType(obj, CFDictionaryGetTypeID()));
}
static __inline__ CFTypeRef
isA_CFNumber(CFTypeRef obj)
{
return (isA_CFType(obj, CFNumberGetTypeID()));
}
static __inline__ CFTypeRef
isA_CFString(CFTypeRef obj)
{
return (isA_CFType(obj, CFStringGetTypeID()));
}
#else
#include <SystemConfiguration/SCValidation.h>
#endif
void
my_CFRelease(void * t);
CFPropertyListRef
my_CFPropertyListCreateFromFile(const char * filename);
int
my_CFPropertyListWriteFile(CFPropertyListRef plist, const char * filename,
mode_t perms);
Boolean
my_CFStringArrayToCStringArray(CFArrayRef arr, void * buffer, int * buffer_size,
int * ret_count);
char * *
my_CStringArrayCreate(CFArrayRef list, int * ret_count);
Boolean
my_CFStringArrayToEtherArray(CFArrayRef array, char * buffer, int * buffer_size,
int * ret_count);
bool
my_CFStringToIPAddress(CFStringRef str, struct in_addr * ret_ip);
bool
my_CFStringToIPv6Address(CFStringRef str, struct in6_addr * ret_ip);
struct in6_addr *
my_CFArrayToIPv6Addresses(CFArrayRef list, int * ret_ip_count);
int
my_CFStringToCStringAndLengthExt(CFStringRef cfstr, char * str, int len,
boolean_t is_external);
INLINE int
my_CFStringToCStringAndLength(CFStringRef cfstr, char * str, int len)
{
return (my_CFStringToCStringAndLengthExt(cfstr, str, len, FALSE));
}
bool
my_CFTypeToNumber(CFTypeRef element, uint32_t * l_p);
bool
my_CFStringToNumber(CFStringRef str, uint32_t * ret_val);
void
my_CFDictionarySetTypeAsArrayValue(CFMutableDictionaryRef dict,
CFStringRef prop, CFTypeRef val);
void
my_CFDictionarySetIPAddressAsArrayValue(CFMutableDictionaryRef dict,
CFStringRef prop,
struct in_addr ip_addr);
void
my_CFDictionarySetIPAddressAsString(CFMutableDictionaryRef dict,
CFStringRef prop,
struct in_addr ip_addr);
void
my_CFDictionarySetIPv6Addresses(CFMutableDictionaryRef dict,
CFStringRef prop,
const struct in6_addr * ip6_addrs,
int count);
void
my_CFDictionarySetIPv6AddressAsString(CFMutableDictionaryRef dict,
CFStringRef prop,
const struct in6_addr * ip6_addr);
void
my_CFDictionarySetCString(CFMutableDictionaryRef dict,
CFStringRef prop,
const char * str);
void
my_CFDictionarySetAbsoluteTime(CFMutableDictionaryRef dict,
CFStringRef prop,
CFAbsoluteTime time);
void
my_CFDictionarySetUInt64(CFMutableDictionaryRef dict, CFStringRef prop,
UInt64 val);
void
my_CFArrayAppendUniqueValue(CFMutableArrayRef arr, CFTypeRef new);
CFStringRef
my_CFStringCopyComponent(CFStringRef path, CFStringRef separator,
CFIndex component_index);
CFStringRef
my_CFStringCreateWithIPAddress(const struct in_addr ip);
CFStringRef
my_CFStringCreateWithIPv6Address(const void * ip6_addr);
void
my_CFStringAppendBytesAsHex(CFMutableStringRef str, const uint8_t * bytes,
int length, char sep);
char *
my_CFStringToCString(CFStringRef cfstr, CFStringEncoding encoding);
char *
my_CFStringToCStringWithRange(CFStringRef cfstr,
CFRange range, CFStringEncoding encoding);
void
my_CFStringPrint(FILE * f, CFStringRef str);
CFDataRef
my_CFStringCreateData(CFStringRef str);
Boolean
my_CFEqual(CFTypeRef val1, CFTypeRef val2);
#define STRING_APPEND(__string, __format, ...) \
CFStringAppendFormat(__string, NULL, \
CFSTR(__format), \
## __VA_ARGS__)
#define STRING_APPEND_STR(__string, __arg) \
CFStringAppend(__string, CFSTR(__arg))
CFArrayRef
my_CFStringArrayCreate(const char * * strings, CFIndex strings_count);
CFStringRef
my_CFUUIDStringCreate(CFAllocatorRef alloc);
CFStringRef
my_CFStringCreateWithBytes(const uint8_t * bytes, int bytes_length);
CFPropertyListRef
my_CFPropertyListCreateWithBytePtrAndLength(const void * data, int data_len);
vm_address_t
my_CFPropertyListCreateVMData(CFPropertyListRef plist,
mach_msg_type_number_t * ret_data_len);
CFPropertyListRef
my_CFPropertyListCreateWithBytePtrAndLength(const void * data, int data_len);
#endif