diff options
Diffstat (limited to 'services/jni')
3 files changed, 69 insertions, 88 deletions
diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp index 8a46ab0..14a4109 100644 --- a/services/jni/com_android_server_InputManager.cpp +++ b/services/jni/com_android_server_InputManager.cpp @@ -69,8 +69,6 @@ static struct { jmethodID interceptKeyBeforeDispatching; jmethodID dispatchUnhandledKey; jmethodID checkInjectEventsPermission; - jmethodID filterTouchEvents; - jmethodID filterJumpyTouchEvents; jmethodID getVirtualKeyQuietTimeMillis; jmethodID getExcludedDeviceNames; jmethodID getKeyRepeatTimeout; @@ -381,18 +379,6 @@ bool NativeInputManager::getDisplayInfo(int32_t displayId, void NativeInputManager::getReaderConfiguration(InputReaderConfiguration* outConfig) { JNIEnv* env = jniEnv(); - jboolean filterTouchEvents = env->CallBooleanMethod(mCallbacksObj, - gCallbacksClassInfo.filterTouchEvents); - if (!checkAndClearExceptionFromCallback(env, "filterTouchEvents")) { - outConfig->filterTouchEvents = filterTouchEvents; - } - - jboolean filterJumpyTouchEvents = env->CallBooleanMethod(mCallbacksObj, - gCallbacksClassInfo.filterJumpyTouchEvents); - if (!checkAndClearExceptionFromCallback(env, "filterJumpyTouchEvents")) { - outConfig->filterJumpyTouchEvents = filterJumpyTouchEvents; - } - jint virtualKeyQuietTime = env->CallIntMethod(mCallbacksObj, gCallbacksClassInfo.getVirtualKeyQuietTimeMillis); if (!checkAndClearExceptionFromCallback(env, "getVirtualKeyQuietTimeMillis")) { @@ -1405,12 +1391,6 @@ int register_android_server_InputManager(JNIEnv* env) { GET_METHOD_ID(gCallbacksClassInfo.checkInjectEventsPermission, clazz, "checkInjectEventsPermission", "(II)Z"); - GET_METHOD_ID(gCallbacksClassInfo.filterTouchEvents, clazz, - "filterTouchEvents", "()Z"); - - GET_METHOD_ID(gCallbacksClassInfo.filterJumpyTouchEvents, clazz, - "filterJumpyTouchEvents", "()Z"); - GET_METHOD_ID(gCallbacksClassInfo.getVirtualKeyQuietTimeMillis, clazz, "getVirtualKeyQuietTimeMillis", "()I"); diff --git a/services/jni/com_android_server_connectivity_Vpn.cpp b/services/jni/com_android_server_connectivity_Vpn.cpp index ae7fbfe..5f920f1 100644 --- a/services/jni/com_android_server_connectivity_Vpn.cpp +++ b/services/jni/com_android_server_connectivity_Vpn.cpp @@ -42,6 +42,9 @@ namespace android { +static int inet4 = -1; +static int inet6 = -1; + static inline in_addr_t *as_in_addr(sockaddr *sa) { return &((sockaddr_in *)sa)->sin_addr.s_addr; } @@ -51,11 +54,9 @@ static inline in_addr_t *as_in_addr(sockaddr *sa) { #define SYSTEM_ERROR -1 #define BAD_ARGUMENT -2 -static int create_interface(int mtu, char *name, int *index) +static int create_interface(char *name, int *index, int mtu) { - int tun = open("/dev/tun", O_RDWR); - int inet4 = socket(AF_INET, SOCK_DGRAM, 0); - int flags; + int tun = open("/dev/tun", O_RDWR | O_NONBLOCK); ifreq ifr4; memset(&ifr4, 0, sizeof(ifr4)); @@ -87,32 +88,20 @@ static int create_interface(int mtu, char *name, int *index) goto error; } - // Make it non-blocking. - flags = fcntl(tun, F_GETFL, 0); - if (flags == -1 || fcntl(tun, F_SETFL, flags | O_NONBLOCK)) { - LOGE("Cannot set non-blocking on %s: %s", ifr4.ifr_name, strerror(errno)); - goto error; - } - - strcpy(name, ifr4.ifr_name); + strncpy(name, ifr4.ifr_name, IFNAMSIZ); *index = ifr4.ifr_ifindex; - close(inet4); return tun; error: close(tun); - close(inet4); return SYSTEM_ERROR; } static int set_addresses(const char *name, int index, const char *addresses) { - int inet4 = socket(AF_INET, SOCK_DGRAM, 0); - int inet6 = socket(AF_INET6, SOCK_DGRAM, 0); - ifreq ifr4; memset(&ifr4, 0, sizeof(ifr4)); - strcpy(ifr4.ifr_name, name); + strncpy(ifr4.ifr_name, name, IFNAMSIZ); ifr4.ifr_addr.sa_family = AF_INET; in6_ifreq ifr6; @@ -121,7 +110,6 @@ static int set_addresses(const char *name, int index, const char *addresses) char address[65]; int prefix; - int chars; int count = 0; @@ -164,7 +152,7 @@ static int set_addresses(const char *name, int index, const char *addresses) break; } } - LOGV("Address added on %s: %s/%d", name, address, prefix); + LOGD("Address added on %s: %s/%d", name, address, prefix); ++count; } @@ -177,16 +165,11 @@ static int set_addresses(const char *name, int index, const char *addresses) count = BAD_ARGUMENT; } - close(inet4); - close(inet6); return count; } static int set_routes(const char *name, int index, const char *routes) { - int inet4 = socket(AF_INET, SOCK_DGRAM, 0); - int inet6 = socket(AF_INET6, SOCK_DGRAM, 0); - rtentry rt4; memset(&rt4, 0, sizeof(rt4)); rt4.rt_dev = (char *)name; @@ -201,7 +184,6 @@ static int set_routes(const char *name, int index, const char *routes) char address[65]; int prefix; - int chars; int count = 0; @@ -211,32 +193,50 @@ static int set_routes(const char *name, int index, const char *routes) if (strchr(address, ':')) { // Add an IPv6 route. if (inet_pton(AF_INET6, address, &rt6.rtmsg_dst) != 1 || - prefix < 1 || prefix > 128) { + prefix < 0 || prefix > 128) { count = BAD_ARGUMENT; break; } - rt6.rtmsg_dst_len = prefix; + rt6.rtmsg_dst_len = prefix ? prefix : 1; if (ioctl(inet6, SIOCADDRT, &rt6) && errno != EEXIST) { count = (errno == EINVAL) ? BAD_ARGUMENT : SYSTEM_ERROR; break; } + + if (!prefix) { + // Split the route instead of replacing the default route. + rt6.rtmsg_dst.s6_addr[0] ^= 0x80; + if (ioctl(inet6, SIOCADDRT, &rt6) && errno != EEXIST) { + count = SYSTEM_ERROR; + break; + } + } } else { // Add an IPv4 route. if (inet_pton(AF_INET, address, as_in_addr(&rt4.rt_dst)) != 1 || - prefix < 1 || prefix > 32) { + prefix < 0 || prefix > 32) { count = BAD_ARGUMENT; break; } - in_addr_t mask = prefix ? (~0 << (32 - prefix)) : 0; + in_addr_t mask = prefix ? (~0 << (32 - prefix)) : 0x80000000; *as_in_addr(&rt4.rt_genmask) = htonl(mask); if (ioctl(inet4, SIOCADDRT, &rt4) && errno != EEXIST) { count = (errno == EINVAL) ? BAD_ARGUMENT : SYSTEM_ERROR; break; } + + if (!prefix) { + // Split the route instead of replacing the default route. + *as_in_addr(&rt4.rt_dst) ^= htonl(0x80000000); + if (ioctl(inet4, SIOCADDRT, &rt4) && errno != EEXIST) { + count = SYSTEM_ERROR; + break; + } + } } - LOGV("Route added on %s: %s/%d", name, address, prefix); + LOGD("Route added on %s: %s/%d", name, address, prefix); ++count; } @@ -250,8 +250,6 @@ static int set_routes(const char *name, int index, const char *routes) count = BAD_ARGUMENT; } - close(inet4); - close(inet6); return count; } @@ -262,31 +260,25 @@ static int get_interface_name(char *name, int tun) LOGE("Cannot get interface name: %s", strerror(errno)); return SYSTEM_ERROR; } - strcpy(name, ifr4.ifr_name); + strncpy(name, ifr4.ifr_name, IFNAMSIZ); return 0; } static int reset_interface(const char *name) { - int inet4 = socket(AF_INET, SOCK_DGRAM, 0); - ifreq ifr4; - ifr4.ifr_flags = 0; strncpy(ifr4.ifr_name, name, IFNAMSIZ); + ifr4.ifr_flags = 0; if (ioctl(inet4, SIOCSIFFLAGS, &ifr4) && errno != ENODEV) { LOGE("Cannot reset %s: %s", name, strerror(errno)); - close(inet4); return SYSTEM_ERROR; } - close(inet4); return 0; } static int check_interface(const char *name) { - int inet4 = socket(AF_INET, SOCK_DGRAM, 0); - ifreq ifr4; strncpy(ifr4.ifr_name, name, IFNAMSIZ); ifr4.ifr_flags = 0; @@ -294,13 +286,12 @@ static int check_interface(const char *name) if (ioctl(inet4, SIOCGIFFLAGS, &ifr4) && errno != ENODEV) { LOGE("Cannot check %s: %s", name, strerror(errno)); } - close(inet4); return ifr4.ifr_flags; } -static int bind_to_interface(int fd, const char *name) +static int bind_to_interface(int socket, const char *name) { - if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))) { + if (setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))) { LOGE("Cannot bind socket to %s: %s", name, strerror(errno)); return SYSTEM_ERROR; } @@ -318,23 +309,22 @@ static void throwException(JNIEnv *env, int error, const char *message) } } -static jint establish(JNIEnv *env, jobject thiz, +static jint configure(JNIEnv *env, jobject thiz, jint mtu, jstring jAddresses, jstring jRoutes) { char name[IFNAMSIZ]; int index; - int tun = create_interface(mtu, name, &index); + int tun = create_interface(name, &index, mtu); if (tun < 0) { throwException(env, tun, "Cannot create interface"); return -1; } - LOGD("%s is created", name); - const char *addresses; - const char *routes; + const char *addresses = NULL; + const char *routes = NULL; int count; - // Addresses are required. + // At least one address must be set. addresses = jAddresses ? env->GetStringUTFChars(jAddresses, NULL) : NULL; if (!addresses) { jniThrowNullPointerException(env, "address"); @@ -348,7 +338,7 @@ static jint establish(JNIEnv *env, jobject thiz, } LOGD("Configured %d address(es) on %s", count, name); - // Routes are optional. + // On the contrary, routes are optional. routes = jRoutes ? env->GetStringUTFChars(jRoutes, NULL) : NULL; if (routes) { count = set_routes(name, index, routes); @@ -368,10 +358,10 @@ error: return -1; } -static jstring getName(JNIEnv *env, jobject thiz, jint fd) +static jstring getName(JNIEnv *env, jobject thiz, jint tun) { char name[IFNAMSIZ]; - if (get_interface_name(name, fd) < 0) { + if (get_interface_name(name, tun) < 0) { throwException(env, SYSTEM_ERROR, "Cannot get interface name"); return NULL; } @@ -380,24 +370,20 @@ static jstring getName(JNIEnv *env, jobject thiz, jint fd) static void reset(JNIEnv *env, jobject thiz, jstring jName) { - const char *name = jName ? - env->GetStringUTFChars(jName, NULL) : NULL; + const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); return; } if (reset_interface(name) < 0) { throwException(env, SYSTEM_ERROR, "Cannot reset interface"); - } else { - LOGD("%s is deactivated", name); } env->ReleaseStringUTFChars(jName, name); } static jint check(JNIEnv *env, jobject thiz, jstring jName) { - const char *name = jName ? - env->GetStringUTFChars(jName, NULL) : NULL; + const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); return 0; @@ -407,15 +393,14 @@ static jint check(JNIEnv *env, jobject thiz, jstring jName) return flags; } -static void protect(JNIEnv *env, jobject thiz, jint fd, jstring jName) +static void protect(JNIEnv *env, jobject thiz, jint socket, jstring jName) { - const char *name = jName ? - env->GetStringUTFChars(jName, NULL) : NULL; + const char *name = jName ? env->GetStringUTFChars(jName, NULL) : NULL; if (!name) { jniThrowNullPointerException(env, "name"); return; } - if (bind_to_interface(fd, name) < 0) { + if (bind_to_interface(socket, name) < 0) { throwException(env, SYSTEM_ERROR, "Cannot protect socket"); } env->ReleaseStringUTFChars(jName, name); @@ -424,15 +409,21 @@ static void protect(JNIEnv *env, jobject thiz, jint fd, jstring jName) //------------------------------------------------------------------------------ static JNINativeMethod gMethods[] = { - {"nativeEstablish", "(ILjava/lang/String;Ljava/lang/String;)I", (void *)establish}, - {"nativeGetName", "(I)Ljava/lang/String;", (void *)getName}, - {"nativeReset", "(Ljava/lang/String;)V", (void *)reset}, - {"nativeCheck", "(Ljava/lang/String;)I", (void *)check}, - {"nativeProtect", "(ILjava/lang/String;)V", (void *)protect}, + {"jniConfigure", "(ILjava/lang/String;Ljava/lang/String;)I", (void *)configure}, + {"jniGetName", "(I)Ljava/lang/String;", (void *)getName}, + {"jniReset", "(Ljava/lang/String;)V", (void *)reset}, + {"jniCheck", "(Ljava/lang/String;)I", (void *)check}, + {"jniProtect", "(ILjava/lang/String;)V", (void *)protect}, }; int register_android_server_connectivity_Vpn(JNIEnv *env) { + if (inet4 == -1) { + inet4 = socket(AF_INET, SOCK_DGRAM, 0); + } + if (inet6 == -1) { + inet6 = socket(AF_INET6, SOCK_DGRAM, 0); + } return jniRegisterNativeMethods(env, "com/android/server/connectivity/Vpn", gMethods, NELEM(gMethods)); } diff --git a/services/jni/com_android_server_location_GpsLocationProvider.cpp b/services/jni/com_android_server_location_GpsLocationProvider.cpp index 6d4ad9a..87ffcba 100755 --- a/services/jni/com_android_server_location_GpsLocationProvider.cpp +++ b/services/jni/com_android_server_location_GpsLocationProvider.cpp @@ -42,6 +42,7 @@ static jmethodID method_xtraDownloadRequest; static jmethodID method_reportNiNotification; static jmethodID method_requestRefLocation; static jmethodID method_requestSetID; +static jmethodID method_requestUtcTime; static const GpsInterface* sGpsInterface = NULL; static const GpsXtraInterface* sGpsXtraInterface = NULL; @@ -122,6 +123,13 @@ static void release_wakelock_callback() release_wake_lock(WAKE_LOCK_NAME); } +static void request_utc_time_callback() +{ + JNIEnv* env = AndroidRuntime::getJNIEnv(); + env->CallVoidMethod(mCallbacksObj, method_requestUtcTime); + checkAndClearExceptionFromCallback(env, __FUNCTION__); +} + static pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg) { return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg); @@ -137,6 +145,7 @@ GpsCallbacks sGpsCallbacks = { acquire_wakelock_callback, release_wakelock_callback, create_thread_callback, + request_utc_time_callback, }; static void xtra_download_request_callback() @@ -232,6 +241,7 @@ static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, "(IIIIILjava/lang/String;Ljava/lang/String;IILjava/lang/String;)V"); method_requestRefLocation = env->GetMethodID(clazz,"requestRefLocation","(I)V"); method_requestSetID = env->GetMethodID(clazz,"requestSetID","(I)V"); + method_requestUtcTime = env->GetMethodID(clazz,"requestUtcTime","()V"); err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); if (err == 0) { |