diff options
Diffstat (limited to 'native')
-rw-r--r-- | native/android/Android.mk | 10 | ||||
-rw-r--r-- | native/android/net.c | 85 |
2 files changed, 92 insertions, 3 deletions
diff --git a/native/android/Android.mk b/native/android/Android.mk index b3a74a8..12fdf71 100644 --- a/native/android/Android.mk +++ b/native/android/Android.mk @@ -12,9 +12,10 @@ LOCAL_SRC_FILES:= \ looper.cpp \ native_activity.cpp \ native_window.cpp \ + net.c \ obb.cpp \ sensor.cpp \ - storage_manager.cpp + storage_manager.cpp \ LOCAL_SHARED_LIBRARIES := \ liblog \ @@ -25,14 +26,17 @@ LOCAL_SHARED_LIBRARIES := \ libbinder \ libui \ libgui \ - libandroid_runtime + libandroid_runtime \ + libnetd_client \ LOCAL_STATIC_LIBRARIES := \ libstorage LOCAL_C_INCLUDES += \ frameworks/base/native/include \ - frameworks/base/core/jni/android + frameworks/base/core/jni/android \ + bionic/libc/dns/include \ + system/netd/include \ LOCAL_MODULE := libandroid diff --git a/native/android/net.c b/native/android/net.c new file mode 100644 index 0000000..de4b90c --- /dev/null +++ b/native/android/net.c @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include <android/multinetwork.h> +#include <errno.h> +#include <NetdClient.h> // the functions that communicate with netd +#include <resolv_netid.h> // android_getaddrinfofornet() +#include <stdlib.h> +#include <sys/limits.h> + + +static int getnetidfromhandle(net_handle_t handle, unsigned *netid) { + static const uint32_t k32BitMask = 0xffffffff; + // This value MUST be kept in sync with the corresponding value in + // the android.net.Network#getNetworkHandle() implementation. + static const uint32_t kHandleMagic = 0xfacade; + + // Check for minimum acceptable version of the API in the low bits. + if (handle != NETWORK_UNSPECIFIED && + (handle & k32BitMask) != kHandleMagic) { + return 0; + } + + if (netid != NULL) { + *netid = ((handle >> (CHAR_BIT * sizeof(k32BitMask))) & k32BitMask); + } + return 1; +} + + +int android_setsocknetwork(net_handle_t network, int fd) { + unsigned netid; + if (!getnetidfromhandle(network, &netid)) { + errno = EINVAL; + return -1; + } + + int rval = setNetworkForSocket(netid, fd); + if (rval < 0) { + errno = -rval; + rval = -1; + } + return rval; +} + +int android_setprocnetwork(net_handle_t network) { + unsigned netid; + if (!getnetidfromhandle(network, &netid)) { + errno = EINVAL; + return -1; + } + + int rval = setNetworkForProcess(netid); + if (rval < 0) { + errno = -rval; + rval = -1; + } + return rval; +} + +int android_getaddrinfofornetwork(net_handle_t network, + const char *node, const char *service, + const struct addrinfo *hints, struct addrinfo **res) { + unsigned netid; + if (!getnetidfromhandle(network, &netid)) { + errno = EINVAL; + return EAI_SYSTEM; + } + + return android_getaddrinfofornet(node, service, hints, netid, 0, res); +} |