diff options
author | Elliott Hughes <enh@google.com> | 2013-08-19 18:08:48 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-08-19 18:08:49 +0000 |
commit | b93489270d41bbaf513f0018164ab8b6d6ca9519 (patch) | |
tree | 1be562f47b9bbbc7c8cc6edfdd607d8912b5f384 /core | |
parent | 2a994b343f6d92910c3c9fba2641aa04bf5eb1fd (diff) | |
parent | a11d574fc632158fe7d6cdd06bd3992c3817ca5c (diff) | |
download | frameworks_base-b93489270d41bbaf513f0018164ab8b6d6ca9519.zip frameworks_base-b93489270d41bbaf513f0018164ab8b6d6ca9519.tar.gz frameworks_base-b93489270d41bbaf513f0018164ab8b6d6ca9519.tar.bz2 |
Merge "Remove a fixed-length buffer in the wifi code." into klp-dev
Diffstat (limited to 'core')
-rw-r--r-- | core/jni/Android.mk | 2 | ||||
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 4 | ||||
-rw-r--r-- | core/jni/android_net_wifi_WifiNative.cpp (renamed from core/jni/android_net_wifi_Wifi.cpp) | 137 |
3 files changed, 51 insertions, 92 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 65b3678..d5d746a 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -72,7 +72,7 @@ LOCAL_SRC_FILES:= \ android_net_LocalSocketImpl.cpp \ android_net_NetUtils.cpp \ android_net_TrafficStats.cpp \ - android_net_wifi_Wifi.cpp \ + android_net_wifi_WifiNative.cpp \ android_nio_utils.cpp \ android_text_format_Time.cpp \ android_util_AssetManager.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 63310ab..8472705 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -147,7 +147,7 @@ extern int register_android_print_pdf_PdfDocument(JNIEnv* env); extern int register_android_net_LocalSocketImpl(JNIEnv* env); extern int register_android_net_NetworkUtils(JNIEnv* env); extern int register_android_net_TrafficStats(JNIEnv* env); -extern int register_android_net_wifi_WifiManager(JNIEnv* env); +extern int register_android_net_wifi_WifiNative(JNIEnv* env); extern int register_android_text_AndroidCharacter(JNIEnv *env); extern int register_android_text_AndroidBidi(JNIEnv *env); extern int register_android_opengl_classes(JNIEnv *env); @@ -1184,7 +1184,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_LocalSocketImpl), REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), - REG_JNI(register_android_net_wifi_WifiManager), + REG_JNI(register_android_net_wifi_WifiNative), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_android_hardware_Camera), diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_WifiNative.cpp index aa6dbf3..6e11192 100644 --- a/core/jni/android_net_wifi_Wifi.cpp +++ b/core/jni/android_net_wifi_WifiNative.cpp @@ -25,111 +25,91 @@ #include "wifi.h" -#define WIFI_PKG_NAME "android/net/wifi/WifiNative" -#define BUF_SIZE 256 +#define REPLY_BUF_SIZE 4096 // wpa_supplicant's maximum size. #define EVENT_BUF_SIZE 2048 namespace android { static jint DBG = false; -static int doCommand(char *cmd, char *replybuf, int replybuflen) -{ - size_t reply_len = replybuflen - 1; +static bool doCommand(JNIEnv* env, jstring javaCommand, + char* reply, size_t reply_len) { + ScopedUtfChars command(env, javaCommand); + if (command.c_str() == NULL) { + return false; // ScopedUtfChars already threw on error. + } - if (::wifi_command(cmd, replybuf, &reply_len) != 0) - return -1; - else { - // Strip off trailing newline - if (reply_len > 0 && replybuf[reply_len-1] == '\n') - replybuf[reply_len-1] = '\0'; - else - replybuf[reply_len] = '\0'; - return 0; + if (DBG) { + ALOGD("doCommand: %s", command.c_str()); } -} -static jint doIntCommand(const char* fmt, ...) -{ - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return -1; + --reply_len; // Ensure we have room to add NUL termination. + if (::wifi_command(command.c_str(), reply, &reply_len) != 0) { + return false; + } + + // Strip off trailing newline. + if (reply_len > 0 && reply[reply_len-1] == '\n') { + reply[reply_len-1] = '\0'; + } else { + reply[reply_len] = '\0'; } - char reply[BUF_SIZE]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { + return true; +} + +static jint doIntCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return -1; } return static_cast<jint>(atoi(reply)); } -static jboolean doBooleanCommand(const char* expect, const char* fmt, ...) -{ - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return JNI_FALSE; - } - char reply[BUF_SIZE]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { +static jboolean doBooleanCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return JNI_FALSE; } - return (strcmp(reply, expect) == 0); + return (strcmp(reply, "OK") == 0); } -// Send a command to the supplicant, and return the reply as a String -static jstring doStringCommand(JNIEnv* env, const char* fmt, ...) { - char buf[BUF_SIZE]; - va_list args; - va_start(args, fmt); - int byteCount = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - if (byteCount < 0 || byteCount >= BUF_SIZE) { - return NULL; - } - char reply[4096]; - if (doCommand(buf, reply, sizeof(reply)) != 0) { +// Send a command to the supplicant, and return the reply as a String. +static jstring doStringCommand(JNIEnv* env, jstring javaCommand) { + char reply[REPLY_BUF_SIZE]; + if (!doCommand(env, javaCommand, reply, sizeof(reply))) { return NULL; } - // TODO: why not just NewStringUTF? - String16 str((char *)reply); - return env->NewString((const jchar *)str.string(), str.size()); + return env->NewStringUTF(reply); } static jboolean android_net_wifi_isDriverLoaded(JNIEnv* env, jobject) { - return (jboolean)(::is_wifi_driver_loaded() == 1); + return (::is_wifi_driver_loaded() == 1); } static jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject) { - return (jboolean)(::wifi_load_driver() == 0); + return (::wifi_load_driver() == 0); } static jboolean android_net_wifi_unloadDriver(JNIEnv* env, jobject) { - return (jboolean)(::wifi_unload_driver() == 0); + return (::wifi_unload_driver() == 0); } static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) { - return (jboolean)(::wifi_start_supplicant(p2pSupported) == 0); + return (::wifi_start_supplicant(p2pSupported) == 0); } static jboolean android_net_wifi_killSupplicant(JNIEnv* env, jobject, jboolean p2pSupported) { - return (jboolean)(::wifi_stop_supplicant(p2pSupported) == 0); + return (::wifi_stop_supplicant(p2pSupported) == 0); } static jboolean android_net_wifi_connectToSupplicant(JNIEnv* env, jobject) { - return (jboolean)(::wifi_connect_to_supplicant() == 0); + return (::wifi_connect_to_supplicant() == 0); } static void android_net_wifi_closeSupplicantConnection(JNIEnv* env, jobject) @@ -148,36 +128,16 @@ static jstring android_net_wifi_waitForEvent(JNIEnv* env, jobject) } } -static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - - if (command.c_str() == NULL) { - return JNI_FALSE; - } - if (DBG) ALOGD("doBoolean: %s", command.c_str()); - return doBooleanCommand("OK", "%s", command.c_str()); +static jboolean android_net_wifi_doBooleanCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doBooleanCommand(env, javaCommand); } -static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - - if (command.c_str() == NULL) { - return -1; - } - if (DBG) ALOGD("doInt: %s", command.c_str()); - return doIntCommand("%s", command.c_str()); +static jint android_net_wifi_doIntCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doIntCommand(env, javaCommand); } -static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring jCommand) -{ - ScopedUtfChars command(env, jCommand); - if (command.c_str() == NULL) { - return NULL; - } - if (DBG) ALOGD("doString: %s", command.c_str()); - return doStringCommand(env, "%s", command.c_str()); +static jstring android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand) { + return doStringCommand(env,javaCommand); } @@ -205,10 +165,9 @@ static JNINativeMethod gWifiMethods[] = { (void*) android_net_wifi_doStringCommand }, }; -int register_android_net_wifi_WifiManager(JNIEnv* env) -{ +int register_android_net_wifi_WifiNative(JNIEnv* env) { return AndroidRuntime::registerNativeMethods(env, - WIFI_PKG_NAME, gWifiMethods, NELEM(gWifiMethods)); + "android/net/wifi/WifiNative", gWifiMethods, NELEM(gWifiMethods)); } }; // namespace android |