__private_extern__ void enable_service(int argc, char **argv) { SCNetworkServiceRef service; if (argc == 1) { service = _find_service(argv[0]); } else { if (net_service != NULL) { service = net_service; } else { SCPrint(TRUE, stdout, CFSTR("service not selected\n")); return; } } if (service == NULL) { return; } if (!SCNetworkServiceSetEnabled(service, TRUE)) { SCPrint(TRUE, stdout, CFSTR("%s\n"), SCErrorString(SCError())); return; } _prefs_changed = TRUE; return; }
Boolean SCNetworkSetSetSelectedVPNService(SCNetworkSetRef set, SCNetworkServiceRef service) { Boolean ok = TRUE; CFArrayRef services; if (!isA_SCNetworkSet(set)) { _SCErrorSet(kSCStatusInvalidArgument); return FALSE; } if (!isA_SCNetworkService(service) || !_SCNetworkServiceIsVPN(service)) { _SCErrorSet(kSCStatusInvalidArgument); return FALSE; } services = SCNetworkSetCopyServices(set); if (services != NULL) { CFIndex i; CFIndex n = CFArrayGetCount(services); if (!CFArrayContainsValue(services, CFRangeMake(0, n), service)) { // if selected service not a member of the current set _SCErrorSet(kSCStatusInvalidArgument); ok = FALSE; goto done; } for (i = 0; ok && (i < n); i++) { SCNetworkServiceRef vpn; vpn = CFArrayGetValueAtIndex(services, i); if (!_SCNetworkServiceIsVPN(vpn)) { // if not VPN service continue; } ok = SCNetworkServiceSetEnabled(vpn, CFEqual(service, vpn)); } } done : if (services != NULL) CFRelease(services); return ok; }
/* ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- */ static void nc_select(int argc, char **argv) { SCNetworkSetRef current_set; int exit_code = 1; SCNetworkServiceRef service = NULL; Boolean status; do_prefs_init(); /* initialization */ do_prefs_open(0, NULL); /* open default prefs */ current_set = SCNetworkSetCopyCurrent(prefs); if (current_set == NULL) { SCPrint(TRUE, stderr, CFSTR("No current location\n"), SCErrorString(SCError())); goto done; } service = nc_copy_service_from_arguments(argc, argv, current_set); if (service == NULL) { SCPrint(TRUE, stderr, CFSTR("No service\n")); goto done; } #if !TARGET_OS_IPHONE status = SCNetworkServiceSetEnabled(service, TRUE); if (!status) { SCPrint(TRUE, stderr, CFSTR("Unable to enable service: %s\n"), SCErrorString(SCError())); goto done; } #else status = SCNetworkSetSetSelectedVPNService(current_set, service); if (!status) { SCPrint(TRUE, stderr, CFSTR("Unable to select service: %s\n"), SCErrorString(SCError())); goto done; } #endif _prefs_save(); exit_code = 0; done: my_CFRelease(&service); my_CFRelease(¤t_set); _prefs_close(); exit(exit_code); }