]> git.saurik.com Git - apple/configd.git/blobdiff - scutil.tproj/net_service.c
configd-802.20.7.tar.gz
[apple/configd.git] / scutil.tproj / net_service.c
index 30c00b3e7af8fec624d6d7636b27c3fec5e96742..3d7d9dc351d7a457c2962b99f45c654b2d36454c 100644 (file)
@@ -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@
  * 
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
 #include "net_service.h"
 #include "net_interface.h"
 #include "net_protocol.h"
 #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)
 {
 static SCNetworkServiceRef
 _find_service(char *match)
 {
@@ -242,8 +210,6 @@ create_service(int argc, char **argv)
        SCNetworkInterfaceRef   interface;
        CFStringRef             interfaceName;
        Boolean                 ok;
        SCNetworkInterfaceRef   interface;
        CFStringRef             interfaceName;
        Boolean                 ok;
-       CFArrayRef              order;
-       CFMutableArrayRef       newOrder;
        SCNetworkServiceRef     service         = NULL;
        CFStringRef             serviceName;
        CFStringRef             setName;
        SCNetworkServiceRef     service         = NULL;
        CFStringRef             serviceName;
        CFStringRef             setName;
@@ -267,9 +233,11 @@ create_service(int argc, char **argv)
 
                interface = net_interface;
        } else {
 
                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) {
        }
 
        if (interface == NULL) {
@@ -292,60 +260,33 @@ create_service(int argc, char **argv)
                Boolean         ok;
 
                serviceName = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
                Boolean         ok;
 
                serviceName = CFStringCreateWithCString(NULL, argv[0], kCFStringEncodingUTF8);
-               argv++;
-               argc--;
+//             argv++;
+//             argc--;
 
                ok = SCNetworkServiceSetName(service, serviceName);
                CFRelease(serviceName);
                if (!ok) {
 
                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;
        }
 
        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) {
        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;
        }
 
                (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_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);
        }
 
        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) {
 
        interfaceName = SCNetworkInterfaceGetLocalizedDisplayName(interface);
        if (interfaceName == NULL) {
@@ -434,8 +378,7 @@ disable_service(int argc, char **argv)
                return;
        }
 
                return;
        }
 
-       net_changed = TRUE;
-
+       _prefs_changed = TRUE;
        return;
 }
 
        return;
 }
 
@@ -466,8 +409,7 @@ enable_service(int argc, char **argv)
                return;
        }
 
                return;
        }
 
-       net_changed = TRUE;
-
+       _prefs_changed = TRUE;
        return;
 }
 
        return;
 }
 
@@ -498,7 +440,7 @@ remove_service(int argc, char **argv)
                goto done;
        }
 
                goto done;
        }
 
-       net_changed = TRUE;
+       _prefs_changed = TRUE;
 
        serviceName = SCNetworkServiceGetName(service);
        if (serviceName != NULL) {
 
        serviceName = SCNetworkServiceGetName(service);
        if (serviceName != NULL) {
@@ -655,7 +597,7 @@ set_service(int argc, char **argv)
                                return;
                        }
 
                                return;
                        }
 
-                       net_changed = TRUE;
+                       _prefs_changed = TRUE;
                } else if (strcmp(command, "order") == 0) {
 
                        char            *end;
                } else if (strcmp(command, "order") == 0) {
 
                        char            *end;
@@ -718,7 +660,7 @@ set_service(int argc, char **argv)
                                                return;
                                        }
 
                                                return;
                                        }
 
-                                       net_changed = TRUE;
+                                       _prefs_changed = TRUE;
                                } else {
                                        SCPrint(TRUE, stdout, CFSTR("set order to what?\n"));
                                        return;
                                } 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;
                        }
                                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"));
                }
                } 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,
                                CFSTR("%s%@%*s : %@\n"),
                                prefix,
                                protocolType,
-                               sizeof("Interface") - CFStringGetLength(protocolType) - 1,
+                               (int)(sizeof("Interface") - CFStringGetLength(protocolType) - 1),
                                "",
                                description);
                        CFRelease(description);
                                "",
                                description);
                        CFRelease(description);
@@ -809,10 +821,11 @@ __private_extern__
 void
 show_service(int argc, char **argv)
 {
 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]);
 
        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(""));
 
        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;
        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)),
                        sorted = CFArrayCreateMutableCopy(NULL, 0, services);
                        CFArraySortValues(sorted,
                                          CFRangeMake(0, CFArrayGetCount(sorted)),
-                                         _compare_services,
+                                         _SCNetworkServiceCompare,
                                          (void *)order);
                        CFRelease(services);
                        services = sorted;
                                          (void *)order);
                        CFRelease(services);
                        services = sorted;
@@ -955,11 +990,11 @@ show_services(int argc, char **argv)
                serviceName = SCNetworkServiceGetName(service);
                if (serviceName == NULL) serviceName = CFSTR("");
 
                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,
                        ((net_service != NULL) && CFEqual(service, net_service)) ? '>' : ' ',
                        i + 1,
                        serviceName,
-                       30 - CFStringGetLength(serviceName),
+                       (int)(30 - CFStringGetLength(serviceName)),
                        " ",
                        serviceID,
                        SCNetworkServiceGetEnabled(service) ? "" : " *DISABLED*");
                        " ",
                        serviceID,
                        SCNetworkServiceGetEnabled(service) ? "" : " *DISABLED*");