예제 #1
0
boolean_t
wireless_is_wpa_enterprise(wireless_t wref)
{
    Apple80211Err 	error;
    CFDictionaryRef	info = NULL;
    boolean_t		is_wpa_enterprise = FALSE;
    CFNumberRef		upper_cf;
    uint32_t		upper;
	
	EAPLOG(LOG_ERR, "######## DEBUG ####### - wireless_is_wpa_enterprise");

    error = Apple80211CopyValue((Apple80211Ref)wref, APPLE80211_IOC_AUTH_TYPE,
								NULL, &info);
    if (error != kA11NoErr) {
		EAPLOG(LOG_ERR,
				"Apple80211CopyValue(APPLE80211_IOC_AUTH_TYPE) failed, 0x%x\n",
				error);
		goto done;
    }
    if (info == NULL) {
		goto done;
    }
	
	/*
	size = CFDictionaryGetCount(info);
	CFTypeRef *keysTypeRef = (CFTypeRef *) malloc( size * sizeof(CFTypeRef) );
	CFDictionaryGetKeysAndValues(info, (const void **) keysTypeRef, NULL);
	const void **keys = (const void **) keysTypeRef;
	
	for (int x=0; x < size; x++) {
		EAPLOG(LOG_ERR, "####### DUMP ###### - %d %d %.3s", x, keys[x], keys[x]);
		if (isA_CFString(keys[x])) {
			char *salve = MYCFStringCopyUTF8String(keys[x]);
			EAPLOG(LOG_ERR, "######## DEBUG ####### - EH UM CFSTRING %s", salve);
			free(salve);
		}
		if (isA_CFNumber(keys[x])) {
			EAPLOG(LOG_ERR, "######## DEBUG ####### - EH UM CFNUMBER");
		}
		upper_cf = CFDictionaryGetValue(info, keys[x]);
		if (upper_cf) {
			if (CFNumberGetValue(upper_cf, kCFNumberSInt32Type, &upper) != FALSE) {
				switch (upper) {
					case APPLE80211_AUTHTYPE_WPA:
					case APPLE80211_AUTHTYPE_WPA2:
						EAPLOG(LOG_ERR, "##### DEBUG ##### - Numero %d", upper);
						is_wpa_enterprise = TRUE;
						break;
					default:
						break;
				}
			}
		}
	}
	
	free (keys);*/
	
    upper_cf = CFDictionaryGetValue(info, APPLE80211KEY_AUTH_UPPER);
    if (upper_cf == NULL) {
		goto done;
    }
    if (CFNumberGetValue(upper_cf, kCFNumberSInt32Type, &upper) == FALSE) {
		goto done;
    }
    switch (upper) {
		case APPLE80211_AUTHTYPE_WPA:
		case APPLE80211_AUTHTYPE_WPA2:
			is_wpa_enterprise = TRUE;
			break;
		default:
			break;
    }
	
done:
    my_CFRelease(&info);
    return (is_wpa_enterprise);
}
예제 #2
0
파일: net_location.c 프로젝트: TARRANUM/ppp
static CFStringRef
pollCurrentNAP (struct service *serv, Boolean *wifiErr)
{
	CFDataRef        napDataRef = NULL;
	CFStringRef      nap = NULL;
	char            *interface_buf;
	CFStringRef      interfName = NULL;
	Apple80211Err    err = kA11NoErr;
	int              state;
	
	SCLog(TRUE, LOG_INFO, CFSTR("%s:"), __FUNCTION__);

	// get interface info
	interface_buf = getVPNInterfaceBuf(serv);
	
	// setup update notification (if not already)
	if (!serv->connection_nap_monitor) {
		interfName = copyVPNInterfaceName(serv);
		if (!interfName) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: failed to get CF interface name for %s"), __FUNCTION__,  interface_buf? interface_buf : "null");
			goto init_failed;
		}

		err = Apple80211Open((Apple80211Ref *)&serv->connection_nap_monitor);
		if (err != kA11NoErr) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211Open failed"), __FUNCTION__);
			*wifiErr = true;
			goto init_failed;
		}
		
		err = Apple80211BindToInterface((Apple80211Ref)serv->connection_nap_monitor, interfName);
		if (err != kA11NoErr) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211BindToInterface(%@) failed"),
				  __FUNCTION__, interfName);
			*wifiErr = true;
			goto init_failed;
		}
		
		err = Apple80211EventMonitoringInit((Apple80211Ref)serv->connection_nap_monitor, monitorApple80211Callback, (void*)serv, CFRunLoopGetCurrent());
		if (err != kA11NoErr) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211EventMonitoringInit(%@) failed, %d"),
				  __FUNCTION__, interfName, err);
			goto init_failed;
		}
		err = Apple80211StartMonitoringEvent((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_M_SSID_CHANGED);
		if (err != kA11NoErr) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211StartMonitoringEvent(%@) failed, %d"),
				  __FUNCTION__, interfName, err);
			goto init_failed;
		}
	}
	
	// get current state
	err = Apple80211Get((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_STATE, 0, &state, sizeof(state));
	if (err != kA11NoErr) {
		SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) failed, err = %d"),
			  __FUNCTION__, interfName, err);
		*wifiErr = true;
		goto done;
	}
	if (state != APPLE80211_S_ASSOC && state != APPLE80211_S_RUN) {
		if (state > APPLE80211_S_INIT) {
			SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got invalid state = %d."),
				  __FUNCTION__, interfName, state, WAIT_SSID_TIMEOUT);
		}

		goto done;
	} else {
		SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211GetState(%@) got valid state = %d"),
			  __FUNCTION__, interfName, state);
	}

	err = Apple80211CopyValue((Apple80211Ref)serv->connection_nap_monitor, APPLE80211_IOC_SSID, NULL, &napDataRef);
	if (err != kA11NoErr) {
		SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) failed, err = %d"),
			  __FUNCTION__, interfName, err);
		*wifiErr = true;
		goto done;
	}

	nap = CFStringCreateWithBytes(kCFAllocatorDefault, CFDataGetBytePtr(napDataRef), CFDataGetLength(napDataRef), kCFStringEncodingUTF8, false);

	SCLog(TRUE, LOG_INFO, CFSTR("%s: Apple80211CopyValue(%@, SSID) got %@"),
		  __FUNCTION__, interfName, nap);

	if (napDataRef) {
		CFRelease(napDataRef);
	}

	if (interfName) {
		CFRelease(interfName);
	}

	return nap;

init_failed:
	if (serv->connection_nap_monitor) {
		Apple80211Close((Apple80211Ref)serv->connection_nap_monitor);
		serv->connection_nap_monitor = NULL;
	}
done:
	if (nap) {
		CFRelease(nap);
	}
	if (napDataRef) {
		CFRelease(napDataRef);
	}
	if (interfName) {
		CFRelease(interfName);
	}
	return NULL;
}