this repo has no description
at fixPythonPipStalling 127 lines 3.6 kB view raw
1#include <unistd.h> 2#include <sys/types.h> 3#include <stdlib.h> 4#include <pwd.h> 5#include <sys/utsname.h> 6//#include "log.h" 7 8#include <CoreFoundation/CFString.h> 9#include <SystemConfiguration/SCDynamicStoreCopySpecific.h> 10#include <SystemConfiguration/SCSchemaDefinitions.h> 11#include <vector> 12 13#define MAX_PASSENTRY_LENGTH 4096 14 15 16 17CFStringRef SCDynamicStoreCopyComputerName (SCDynamicStoreRef store, CFStringEncoding *nameEncoding) 18{ 19 char hostname[100]; 20 if (gethostname(hostname, sizeof(hostname)) != 0) 21 return nullptr; 22 hostname[sizeof(hostname)-1] = '\0'; 23 24 if (nameEncoding) 25 *nameEncoding = kCFStringEncodingUTF8; 26 27 return CFStringCreateWithCString(nullptr, hostname, kCFStringEncodingUTF8); 28} 29 30CFStringRef SCDynamicStoreCopyConsoleUser (SCDynamicStoreRef store, uid_t *uid, gid_t *gid){ 31 struct passwd pwent, *pwentp; 32 char buffer[MAX_PASSENTRY_LENGTH]; 33 char *user; 34 35 if (uid) *uid = getuid(); 36 if (gid) *gid = getgid(); 37 38 user = getenv("USER"); 39 if (user) 40 return CFStringCreateWithCString(NULL, user, kCFStringEncodingUTF8); 41 42 if (getpwuid_r(getuid(), &pwent, buffer, MAX_PASSENTRY_LENGTH, &pwentp)) 43 return CFStringCreateWithCString(NULL, pwentp->pw_name, kCFStringEncodingUTF8); 44 45 return NULL; 46} 47 48CFStringRef SCDynamicStoreCopyLocalHostName (SCDynamicStoreRef store){ 49 struct utsname info; 50 51 if (uname(&info) != 0) 52 return NULL; 53 54 return CFStringCreateWithCString(NULL, info.nodename, kCFStringEncodingUTF8); 55} 56 57CFStringRef SCDynamicStoreCopyLocation (SCDynamicStoreRef store){ 58 //LOG << "fixme: SCDynamicStoreCopyLocation() - stub" << std::endl; 59 return NULL; 60} 61 62static CFNumberRef cfNumber(int n) 63{ 64 return CFNumberCreate(nullptr, kCFNumberSInt32Type, &n); 65} 66 67static void fillProxy(std::vector<CFStringRef>& keys, std::vector<CFTypeRef>& values, 68 const char* envVarName, 69 CFStringRef enabledKey, CFStringRef hostKey, CFStringRef portKey) 70{ 71 const char* var = getenv(envVarName); 72 if (!var) 73 { 74 keys.push_back(enabledKey); 75 values.push_back(cfNumber(0)); 76 } 77 else 78 { 79 keys.push_back(enabledKey); 80 values.push_back(cfNumber(1)); 81 82 CFURLRef url = CFURLCreateWithBytes(nullptr, (const UInt8*) var, strlen(var), kCFStringEncodingUTF8, nullptr); 83 84 if (url != nullptr) 85 { 86 keys.push_back(hostKey); 87 values.push_back(CFURLCopyHostName(url)); 88 89 int port = CFURLGetPortNumber(url); 90 if (port == -1) 91 port = 80; 92 93 keys.push_back(portKey); 94 values.push_back(cfNumber(port)); 95 96 CFRelease(url); 97 } 98 } 99} 100 101CFDictionaryRef SCDynamicStoreCopyProxies (SCDynamicStoreRef store) 102{ 103 // NOTE: Proxy username and password are supposed to be accessed via Security.framework 104 // https://stackoverflow.com/a/15085066/479753 105 106 std::vector<CFStringRef> keys; 107 std::vector<CFTypeRef> values; 108 109 keys.push_back(kSCPropNetProxiesGopherEnable); 110 values.push_back(cfNumber(0)); 111 112 fillProxy(keys, values, "http_proxy", kSCPropNetProxiesHTTPEnable, kSCPropNetProxiesHTTPProxy, kSCPropNetProxiesHTTPPort); 113 fillProxy(keys, values, "https_proxy", kSCPropNetProxiesHTTPSEnable, kSCPropNetProxiesHTTPSProxy, kSCPropNetProxiesHTTPSPort); 114 fillProxy(keys, values, "ftp_proxy", kSCPropNetProxiesFTPEnable, kSCPropNetProxiesFTPProxy, kSCPropNetProxiesFTPPort); 115 116 CFDictionaryRef rv = CFDictionaryCreate(nullptr, (const void**) keys.data(), (const void**) values.data(), keys.size(), 117 &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 118 119 for (CFTypeRef cf : values) 120 CFRelease(cf); 121 return rv; 122} 123 124CFDictionaryRef SCDynamicStoreCopyProxiesWithOptions(SCDynamicStoreRef store, CFDictionaryRef options) 125{ 126 return SCDynamicStoreCopyProxies(store); 127}