X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/dbf6a266c384fc8b55e00a396eebe5cb62e21547..77a550b625b42f93d03018146bc3f0751ff2eed8:/scutil.tproj/net_service.c?ds=sidebyside diff --git a/scutil.tproj/net_service.c b/scutil.tproj/net_service.c index 30c00b3..3d7d9dc 100644 --- a/scutil.tproj/net_service.c +++ b/scutil.tproj/net_service.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2004-2010, 2013, 2014 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -34,44 +34,12 @@ #include "net_service.h" #include "net_interface.h" #include "net_protocol.h" +#include "prefs.h" /* -------------------- */ -__private_extern__ -CFComparisonResult -_compare_services(const void *val1, const void *val2, void *context) -{ - CFStringRef id1; - CFStringRef id2; - CFArrayRef order = (CFArrayRef)context; - SCNetworkServiceRef s1 = (SCNetworkServiceRef)val1; - SCNetworkServiceRef s2 = (SCNetworkServiceRef)val2; - - id1 = SCNetworkServiceGetServiceID(s1); - id2 = SCNetworkServiceGetServiceID(s2); - - if (order != NULL) { - CFIndex o1; - CFIndex o2; - CFRange range; - - range = CFRangeMake(0, CFArrayGetCount(order)); - o1 = CFArrayGetFirstIndexOfValue(order, range, id1); - o2 = CFArrayGetFirstIndexOfValue(order, range, id2); - - if (o1 > o2) { - return (o2 != kCFNotFound) ? kCFCompareGreaterThan : kCFCompareLessThan; - } else if (o1 < o2) { - return (o1 != kCFNotFound) ? kCFCompareLessThan : kCFCompareGreaterThan; - } - } - - return CFStringCompare(id1, id2, 0); -} - - static SCNetworkServiceRef _find_service(char *match) { @@ -242,8 +210,6 @@ create_service(int argc, char **argv) SCNetworkInterfaceRef interface; CFStringRef interfaceName; Boolean ok; - CFArrayRef order; - CFMutableArrayRef newOrder; SCNetworkServiceRef service = NULL; CFStringRef serviceName; CFStringRef setName; @@ -267,9 +233,11 @@ create_service(int argc, char **argv) interface = net_interface; } else { - interface = _find_interface(argv[0]); - argv++; - argc--; + int nArgs; + + interface = _find_interface(argc, argv, &nArgs); + argv += nArgs; + argc -= nArgs; } if (interface == NULL) { @@ -292,60 +260,33 @@ create_service(int argc, char **argv) Boolean ok; serviceName = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8); - argv++; - argc--; +// argv++; +// argc--; ok = SCNetworkServiceSetName(service, serviceName); CFRelease(serviceName); if (!ok) { - SCPrint(TRUE, stdout, CFSTR("service not created: %s\n"), SCErrorString(SCError())); - CFRelease(service); - return; + SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); + (void)SCNetworkServiceRemove(service); + goto done; } } - ok = SCNetworkSetAddService(net_set, service); + ok = SCNetworkServiceEstablishDefaultConfiguration(service); if (!ok) { SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); (void)SCNetworkServiceRemove(service); goto done; } - net_changed = TRUE; - - order = SCNetworkSetGetServiceOrder(net_set); - if (order == NULL) { - newOrder = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); - } else { - newOrder = CFArrayCreateMutableCopy(NULL, 0, order); - } - CFArrayAppendValue(newOrder, SCNetworkServiceGetServiceID(service)); - ok = SCNetworkSetSetServiceOrder(net_set, newOrder); - CFRelease(newOrder); + ok = SCNetworkSetAddService(net_set, service); if (!ok) { - SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); + SCPrint(TRUE, stdout, CFSTR("service not created: %s\n"), SCErrorString(SCError())); (void)SCNetworkServiceRemove(service); goto done; } - interfaceName = SCNetworkInterfaceGetLocalizedDisplayName(interface); - if (interfaceName == NULL) { - interfaceName = SCNetworkInterfaceGetBSDName(interface); - } - if (interfaceName != NULL) { - if (!SCNetworkServiceSetName(service, interfaceName)) { - CFIndex i; - - for (i = 2; i < 100; i++) { - serviceName = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@ %d"), interfaceName, i); - ok = SCNetworkServiceSetName(service, serviceName); - CFRelease(serviceName); - if (ok) { - break; - } - } - } - } + _prefs_changed = TRUE; if (net_service != NULL) CFRelease(net_service); net_service = CFRetain(service); @@ -371,7 +312,10 @@ create_service(int argc, char **argv) } if (net_interface != NULL) CFRelease(net_interface); - net_interface = CFRetain(interface); + net_interface = SCNetworkServiceGetInterface(net_service); + if (net_interface != NULL) { + CFRetain(net_interface); + } interfaceName = SCNetworkInterfaceGetLocalizedDisplayName(interface); if (interfaceName == NULL) { @@ -434,8 +378,7 @@ disable_service(int argc, char **argv) return; } - net_changed = TRUE; - + _prefs_changed = TRUE; return; } @@ -466,8 +409,7 @@ enable_service(int argc, char **argv) return; } - net_changed = TRUE; - + _prefs_changed = TRUE; return; } @@ -498,7 +440,7 @@ remove_service(int argc, char **argv) goto done; } - net_changed = TRUE; + _prefs_changed = TRUE; serviceName = SCNetworkServiceGetName(service); if (serviceName != NULL) { @@ -655,7 +597,7 @@ set_service(int argc, char **argv) return; } - net_changed = TRUE; + _prefs_changed = TRUE; } else if (strcmp(command, "order") == 0) { char *end; @@ -718,7 +660,7 @@ set_service(int argc, char **argv) return; } - net_changed = TRUE; + _prefs_changed = TRUE; } else { SCPrint(TRUE, stdout, CFSTR("set order to what?\n")); return; @@ -727,6 +669,76 @@ set_service(int argc, char **argv) SCPrint(TRUE, stdout, CFSTR("set what?\n")); return; } + } else if (strcmp(command, "rank") == 0) { + SCNetworkServicePrimaryRank rank = kSCNetworkServicePrimaryRankDefault; + SCNetworkServiceRef service = (argc < 2) ? net_service : NULL; + + if (argc < 1) { + SCPrint(TRUE, stdout, CFSTR("rank not specified\n")); + return; + } + + if (strlen(argv[0]) > 0) { + if (strcasecmp(argv[0], "Never") == 0) { + rank = kSCNetworkServicePrimaryRankNever; + } else if ((service != net_service) && (strcasecmp(argv[0], "First") == 0)) { + rank = kSCNetworkServicePrimaryRankFirst; + } else if ((service != net_service) && (strcasecmp(argv[0], "Last") == 0)) { + rank = kSCNetworkServicePrimaryRankLast; + } else if ((service != net_service) && (strcasecmp(argv[0], "Scoped") == 0)) { + rank = kSCNetworkServicePrimaryRankScoped; + } else { + SCPrint(TRUE, stdout, CFSTR("rank not valid\n")); + return; + } + } + argv++; + argc--; + + if (service == NULL) { + CFStringRef serviceID; + SCDynamicStoreRef store; + + store = SCDynamicStoreCreate(NULL, + CFSTR("scutil (set primary rank)"), + NULL, + NULL); + serviceID = SCNetworkServiceGetServiceID(net_service); + service = _SCNetworkServiceCopyActive(store, serviceID); + CFRelease(store); + + argv++; + argc--; + } + + ok = SCNetworkServiceSetPrimaryRank(service, rank); + if (service != net_service) CFRelease(service); + if (ok) { + if (service == net_service) _prefs_changed = TRUE; + } else { + SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); + return; + } + } else if (strcmp(command, "id") == 0) { + CFStringRef serviceID; + + if ((argc < 1) || (strlen(argv[0]) == 0)) { + SCPrint(TRUE, stdout, CFSTR("set id not specified\n")); + return; + } + + serviceID = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8); + argv++; + argc--; + + ok = _SCNetworkServiceSetServiceID(net_service, serviceID); + CFRelease(serviceID); + if (!ok) { + SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); + return; + } + + _prefs_changed = TRUE; } else { SCPrint(TRUE, stdout, CFSTR("set what?\n")); } @@ -793,7 +805,7 @@ __show_service_protocols(SCNetworkServiceRef service, const char *prefix, Boolea CFSTR("%s%@%*s : %@\n"), prefix, protocolType, - sizeof("Interface") - CFStringGetLength(protocolType) - 1, + (int)(sizeof("Interface") - CFStringGetLength(protocolType) - 1), "", description); CFRelease(description); @@ -809,10 +821,11 @@ __private_extern__ void show_service(int argc, char **argv) { - SCNetworkInterfaceRef interface; - CFArrayRef protocols; - SCNetworkServiceRef service; - CFStringRef serviceName; + SCNetworkInterfaceRef interface; + CFArrayRef protocols; + SCNetworkServiceRef service; + CFStringRef serviceName; + SCNetworkServicePrimaryRank serviceRank; if (argc == 1) { service = _find_service(argv[0]); @@ -835,6 +848,28 @@ show_service(int argc, char **argv) SCPrint(TRUE, stdout, CFSTR("name = %@\n"), (serviceName != NULL) ? serviceName : CFSTR("")); + serviceRank = SCNetworkServiceGetPrimaryRank(service); + switch (serviceRank) { + case kSCNetworkServicePrimaryRankDefault : + // nothing to report + break; + case kSCNetworkServicePrimaryRankFirst : + SCPrint(TRUE, stdout, CFSTR("primary rank = FIRST\n")); + break; + case kSCNetworkServicePrimaryRankLast : + SCPrint(TRUE, stdout, CFSTR("primary rank = LAST\n")); + break; + case kSCNetworkServicePrimaryRankNever : + SCPrint(TRUE, stdout, CFSTR("primary rank = NEVER\n")); + break; + case kSCNetworkServicePrimaryRankScoped : + SCPrint(TRUE, stdout, CFSTR("primary rank = SCOPED\n")); + break; + default : + SCPrint(TRUE, stdout, CFSTR("primary rank = %d\n"), serviceRank); + break; + } + interface = SCNetworkServiceGetInterface(service); if (interface != NULL) { CFStringRef interfaceName; @@ -932,7 +967,7 @@ show_services(int argc, char **argv) sorted = CFArrayCreateMutableCopy(NULL, 0, services); CFArraySortValues(sorted, CFRangeMake(0, CFArrayGetCount(sorted)), - _compare_services, + _SCNetworkServiceCompare, (void *)order); CFRelease(services); services = sorted; @@ -955,11 +990,11 @@ show_services(int argc, char **argv) serviceName = SCNetworkServiceGetName(service); if (serviceName == NULL) serviceName = CFSTR(""); - SCPrint(TRUE, stdout, CFSTR("%c%2d: %@%-*s (%@)%s\n"), + SCPrint(TRUE, stdout, CFSTR("%c%2ld: %@%-*s (%@)%s\n"), ((net_service != NULL) && CFEqual(service, net_service)) ? '>' : ' ', i + 1, serviceName, - 30 - CFStringGetLength(serviceName), + (int)(30 - CFStringGetLength(serviceName)), " ", serviceID, SCNetworkServiceGetEnabled(service) ? "" : " *DISABLED*");