/*
- * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2004-2010, 2013, 2014 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#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)
{
SCNetworkInterfaceRef interface;
CFStringRef interfaceName;
Boolean ok;
- CFArrayRef order;
- CFMutableArrayRef newOrder;
SCNetworkServiceRef service = NULL;
CFStringRef serviceName;
CFStringRef setName;
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) {
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);
}
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) {
return;
}
- net_changed = TRUE;
-
+ _prefs_changed = TRUE;
return;
}
return;
}
- net_changed = TRUE;
-
+ _prefs_changed = TRUE;
return;
}
goto done;
}
- net_changed = TRUE;
+ _prefs_changed = TRUE;
serviceName = SCNetworkServiceGetName(service);
if (serviceName != NULL) {
return;
}
- net_changed = TRUE;
+ _prefs_changed = TRUE;
} else if (strcmp(command, "order") == 0) {
char *end;
return;
}
- net_changed = TRUE;
+ _prefs_changed = TRUE;
} else {
SCPrint(TRUE, stdout, CFSTR("set order to what?\n"));
return;
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"));
}
CFSTR("%s%@%*s : %@\n"),
prefix,
protocolType,
- sizeof("Interface") - CFStringGetLength(protocolType) - 1,
+ (int)(sizeof("Interface") - CFStringGetLength(protocolType) - 1),
"",
description);
CFRelease(description);
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]);
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;
sorted = CFArrayCreateMutableCopy(NULL, 0, services);
CFArraySortValues(sorted,
CFRangeMake(0, CFArrayGetCount(sorted)),
- _compare_services,
+ _SCNetworkServiceCompare,
(void *)order);
CFRelease(services);
services = sorted;
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*");