diff options
| -rw-r--r-- | adb/adb.c | 13 | ||||
| -rw-r--r-- | adb/services.c | 12 | ||||
| -rw-r--r-- | include/cutils/native_handle.h | 47 | ||||
| -rw-r--r-- | include/sysutils/FrameworkClient.h | 4 | ||||
| -rw-r--r-- | include/sysutils/SocketClient.h | 4 | ||||
| -rw-r--r-- | include/sysutils/SocketListener.h | 4 | ||||
| -rw-r--r-- | libcutils/Android.mk | 1 | ||||
| -rw-r--r-- | libcutils/native_handle.c | 60 | ||||
| -rw-r--r-- | libsysutils/src/FrameworkClient.cpp | 5 | ||||
| -rw-r--r-- | libsysutils/src/SocketClient.cpp | 21 | ||||
| -rw-r--r-- | libsysutils/src/SocketListener.cpp | 4 | ||||
| -rw-r--r-- | nexus/OpenVpnController.cpp | 24 | ||||
| -rw-r--r-- | nexus/OpenVpnController.h | 5 |
13 files changed, 147 insertions, 57 deletions
@@ -818,19 +818,6 @@ int adb_main(int is_daemon) #if !ADB_HOST int secure = 0; char value[PROPERTY_VALUE_MAX]; - - // prevent the OOM killer from killing us - char text[64]; - snprintf(text, sizeof text, "/proc/%d/oom_adj", (int)getpid()); - int fd = adb_open(text, O_WRONLY); - if (fd >= 0) { - // -17 should make us immune to OOM - snprintf(text, sizeof text, "%d", -17); - adb_write(fd, text, strlen(text)); - adb_close(fd); - } else { - D("adb: unable to open %s\n", text); - } #endif atexit(adb_cleanup); diff --git a/adb/services.c b/adb/services.c index 1de55e6c..0a5edcf4 100644 --- a/adb/services.c +++ b/adb/services.c @@ -244,6 +244,18 @@ static int create_subprocess(const char *cmd, const char *arg0, const char *arg1 cmd, strerror(errno), errno); exit(-1); } else { +#if !ADB_HOST + // set child's OOM adjustment to zero + char text[64]; + snprintf(text, sizeof text, "/proc/%d/oom_adj", pid); + int fd = adb_open(text, O_WRONLY); + if (fd >= 0) { + adb_write(fd, "0", 1); + adb_close(fd); + } else { + D("adb: unable to open %s\n", text); + } +#endif return ptm; } #endif /* !HAVE_WIN32_PROC */ diff --git a/include/cutils/native_handle.h b/include/cutils/native_handle.h index 2b648935..8a44b729 100644 --- a/include/cutils/native_handle.h +++ b/include/cutils/native_handle.h @@ -17,12 +17,55 @@ #ifndef NATIVE_HANDLE_H_ #define NATIVE_HANDLE_H_ +#include <sys/cdefs.h> + +__BEGIN_DECLS + typedef struct { - int version; /* sizeof(native_handle) */ + int version; /* sizeof(native_handle_t) */ int numFds; /* number of file-descriptors at &data[0] */ int numInts; /* number of ints at &data[numFds] */ int data[0]; /* numFds + numInts ints */ -} native_handle; +} native_handle_t; + + +/* keep the old definition for backward source-compatibility */ +typedef native_handle_t native_handle; + +/* + * native_handle_close + * + * closes the file descriptors contained in this native_handle_t + * + * return 0 on success, or a negative error code on failure + * + */ +int native_handle_close(const native_handle_t* h); + + +/* + * native_handle_create + * + * creates a native_handle_t and initializes it. must be destroyed with + * native_handle_delete(). + * + */ +native_handle_t* native_handle_create(int numFds, int numInts); + +/* + * native_handle_delete + * + * frees a native_handle_t allocated with native_handle_create(). + * This ONLY frees the memory allocated for the native_handle_t, but doesn't + * close the file descriptors; which can be achieved with native_handle_close(). + * + * return 0 on success, or a negative error code on failure + * + */ +int native_handle_delete(native_handle_t* h); + + +__END_DECLS #endif /* NATIVE_HANDLE_H_ */ diff --git a/include/sysutils/FrameworkClient.h b/include/sysutils/FrameworkClient.h index 1eb112a5..0ef07537 100644 --- a/include/sysutils/FrameworkClient.h +++ b/include/sysutils/FrameworkClient.h @@ -13,8 +13,8 @@ public: FrameworkClient(int sock); virtual ~FrameworkClient() {} - int sendMsg(char *msg); - int sendMsg(char *msg, char *data); + int sendMsg(const char *msg); + int sendMsg(const char *msg, const char *data); }; typedef android::List<FrameworkClient *> FrameworkClientCollection; diff --git a/include/sysutils/SocketClient.h b/include/sysutils/SocketClient.h index cde64a54..469dd9d0 100644 --- a/include/sysutils/SocketClient.h +++ b/include/sysutils/SocketClient.h @@ -15,8 +15,8 @@ public: int getSocket() { return mSocket; } - int sendMsg(int code, char *msg, bool addErrno); - int sendMsg(char *msg); + int sendMsg(int code, const char *msg, bool addErrno); + int sendMsg(const char *msg); }; typedef android::List<SocketClient *> SocketClientCollection; diff --git a/include/sysutils/SocketListener.h b/include/sysutils/SocketListener.h index 30d050d4..68dcb8f4 100644 --- a/include/sysutils/SocketListener.h +++ b/include/sysutils/SocketListener.h @@ -37,8 +37,8 @@ public: int startListener(); int stopListener(); - void sendBroadcast(int code, char *msg, bool addErrno); - void sendBroadcast(char *msg); + void sendBroadcast(int code, const char *msg, bool addErrno); + void sendBroadcast(const char *msg); protected: virtual bool onDataAvailable(SocketClient *c) = 0; diff --git a/libcutils/Android.mk b/libcutils/Android.mk index f5e49f5f..18d0ee31 100644 --- a/libcutils/Android.mk +++ b/libcutils/Android.mk @@ -20,6 +20,7 @@ commonSources := \ array.c \ hashmap.c \ atomic.c \ + native_handle.c \ buffer.c \ socket_inaddr_any_server.c \ socket_local_client.c \ diff --git a/libcutils/native_handle.c b/libcutils/native_handle.c new file mode 100644 index 00000000..40899685 --- /dev/null +++ b/libcutils/native_handle.c @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2007 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. + */ + +#define LOG_TAG "NativeHandle" + +#include <stdint.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +#include <cutils/log.h> +#include <cutils/native_handle.h> + +native_handle_t* native_handle_create(int numFds, int numInts) +{ + native_handle_t* h = malloc( + sizeof(native_handle_t) + sizeof(int)*(numFds+numInts)); + + h->version = sizeof(native_handle_t); + h->numFds = numFds; + h->numInts = numInts; + return h; +} + +int native_handle_delete(native_handle_t* h) +{ + if (h) { + if (h->version != sizeof(native_handle_t)) + return -EINVAL; + free(h); + } + return 0; +} + +int native_handle_close(const native_handle_t* h) +{ + if (h->version != sizeof(native_handle_t)) + return -EINVAL; + + const int numFds = h->numFds; + int i; + for (i=0 ; i<numFds ; i++) { + close(h->data[i]); + } + return 0; +} diff --git a/libsysutils/src/FrameworkClient.cpp b/libsysutils/src/FrameworkClient.cpp index 237bb60f..16869961 100644 --- a/libsysutils/src/FrameworkClient.cpp +++ b/libsysutils/src/FrameworkClient.cpp @@ -13,8 +13,7 @@ FrameworkClient::FrameworkClient(int socket) { pthread_mutex_init(&mWriteMutex, NULL); } -int FrameworkClient::sendMsg(char *msg) { - LOGD("FrameworkClient::sendMsg(%s)", msg); +int FrameworkClient::sendMsg(const char *msg) { if (mSocket < 0) { errno = EHOSTUNREACH; return -1; @@ -28,7 +27,7 @@ int FrameworkClient::sendMsg(char *msg) { return 0; } -int FrameworkClient::sendMsg(char *msg, char *data) { +int FrameworkClient::sendMsg(const char *msg, const char *data) { char *buffer = (char *) alloca(strlen(msg) + strlen(data) + 1); if (!buffer) { errno = -ENOMEM; diff --git a/libsysutils/src/SocketClient.cpp b/libsysutils/src/SocketClient.cpp index ab020ca7..b229627f 100644 --- a/libsysutils/src/SocketClient.cpp +++ b/libsysutils/src/SocketClient.cpp @@ -14,7 +14,7 @@ SocketClient::SocketClient(int socket) { pthread_mutex_init(&mWriteMutex, NULL); } -int SocketClient::sendMsg(int code, char *msg, bool addErrno) { +int SocketClient::sendMsg(int code, const char *msg, bool addErrno) { char *buf; if (addErrno) { @@ -27,23 +27,24 @@ int SocketClient::sendMsg(int code, char *msg, bool addErrno) { return sendMsg(buf); } -int SocketClient::sendMsg(char *msg) { +int SocketClient::sendMsg(const char *msg) { if (mSocket < 0) { errno = EHOSTUNREACH; return -1; } - char *bp; - + char *tmp; + const char *bp = msg; + if (msg[strlen(msg)] != '\n') { - bp = (char *) alloca(strlen(msg) + 1); - strcpy(bp, msg); - strcat(bp, "\n"); - } else - bp = msg; + tmp = (char *) alloca(strlen(msg) + 1); + strcpy(tmp, msg); + strcat(tmp, "\n"); + bp = tmp; + } int rc = 0; - char *p = bp; + const char *p = bp; int brtw = strlen(bp); pthread_mutex_lock(&mWriteMutex); diff --git a/libsysutils/src/SocketListener.cpp b/libsysutils/src/SocketListener.cpp index acc4a67d..cb7dd808 100644 --- a/libsysutils/src/SocketListener.cpp +++ b/libsysutils/src/SocketListener.cpp @@ -173,7 +173,7 @@ void SocketListener::runListener() { } } -void SocketListener::sendBroadcast(int code, char *msg, bool addErrno) { +void SocketListener::sendBroadcast(int code, const char *msg, bool addErrno) { pthread_mutex_lock(&mClientsLock); SocketClientCollection::iterator i; @@ -185,7 +185,7 @@ void SocketListener::sendBroadcast(int code, char *msg, bool addErrno) { pthread_mutex_unlock(&mClientsLock); } -void SocketListener::sendBroadcast(char *msg) { +void SocketListener::sendBroadcast(const char *msg) { pthread_mutex_lock(&mClientsLock); SocketClientCollection::iterator i; diff --git a/nexus/OpenVpnController.cpp b/nexus/OpenVpnController.cpp index d326ad5d..411a0c76 100644 --- a/nexus/OpenVpnController.cpp +++ b/nexus/OpenVpnController.cpp @@ -26,6 +26,7 @@ #include "OpenVpnController.h" #define DAEMON_PROP_NAME "vpn.openvpn.status" + #define DAEMON_CONFIG_FILE "/data/misc/openvpn/openvpn.conf" OpenVpnController::OpenVpnController() : @@ -46,13 +47,16 @@ int OpenVpnController::stop() { } int OpenVpnController::enable() { - - if (validateConfig()) { - LOGE("Error validating configuration file"); + char svc[PROPERTY_VALUE_MAX]; + char tmp[64]; + + if (!getProperty("vpn.gateway", tmp, sizeof(tmp))) { + LOGE("Error reading property 'vpn.gateway' (%s)", strerror(errno)); return -1; } + snprintf(svc, sizeof(svc), "openvpn:--remote %s 1194", tmp); - if (mServiceManager->start("openvpn")) + if (mServiceManager->start(svc)) return -1; return 0; @@ -64,15 +68,3 @@ int OpenVpnController::disable() { return -1; return 0; } - -int OpenVpnController::validateConfig() { - unlink(DAEMON_CONFIG_FILE); - - FILE *fp = fopen(DAEMON_CONFIG_FILE, "w"); - if (!fp) - return -1; - - fprintf(fp, "remote %s 1194\n", inet_ntoa(getVpnGateway())); - fclose(fp); - return 0; -} diff --git a/nexus/OpenVpnController.h b/nexus/OpenVpnController.h index 7bcc098f..b3210299 100644 --- a/nexus/OpenVpnController.h +++ b/nexus/OpenVpnController.h @@ -33,11 +33,6 @@ public: int stop(); int enable(); int disable(); - -protected: - -private: - int validateConfig(); }; #endif |
