diff options
-rw-r--r-- | adb/Android.mk | 4 | ||||
-rw-r--r-- | adb/client/usb_libusb.cpp | 8 | ||||
-rw-r--r-- | adb/transport_local.cpp | 2 | ||||
-rw-r--r-- | fingerprintd/FingerprintDaemonProxy.cpp | 2 | ||||
-rw-r--r-- | gatekeeperd/gatekeeperd.cpp | 9 | ||||
-rw-r--r-- | healthd/Android.mk | 12 | ||||
-rw-r--r-- | healthd/healthd.cpp | 42 | ||||
-rw-r--r-- | healthd/healthd_mode_charger.cpp | 11 | ||||
-rw-r--r-- | healthd/include/healthd/healthd.h | 7 | ||||
-rw-r--r-- | include/system/qemu_pipe.h | 134 | ||||
-rw-r--r-- | libcutils/fs_config.c | 11 | ||||
-rw-r--r-- | libcutils/include/private/fs_config.h | 37 | ||||
-rw-r--r-- | libsuspend/autosuspend_wakeup_count.c | 24 | ||||
-rw-r--r-- | logd/LogBuffer.cpp | 8 | ||||
-rw-r--r-- | qemu_pipe/Android.mk | 19 | ||||
-rw-r--r-- | qemu_pipe/include/qemu_pipe.h | 64 | ||||
-rw-r--r-- | qemu_pipe/qemu_pipe.cpp | 108 |
17 files changed, 247 insertions, 255 deletions
diff --git a/adb/Android.mk b/adb/Android.mk index 8a43e37bc..e84120542 100644 --- a/adb/Android.mk +++ b/adb/Android.mk @@ -124,12 +124,11 @@ LOCAL_SRC_FILES := \ adbd_auth.cpp \ jdwp_service.cpp \ -LOCAL_C_INCLUDES := system/core/qemu_pipe/include LOCAL_SANITIZE := $(adb_target_sanitize) # Even though we're building a static library (and thus there's no link step for # this to take effect), this adds the includes to our path. -LOCAL_STATIC_LIBRARIES := libcrypto_utils libcrypto libqemu_pipe libbase +LOCAL_STATIC_LIBRARIES := libcrypto_utils libcrypto libbase LOCAL_WHOLE_STATIC_LIBRARIES := libadbd_usb @@ -362,7 +361,6 @@ LOCAL_STRIP_MODULE := keep_symbols LOCAL_STATIC_LIBRARIES := \ libadbd \ libbase \ - libqemu_pipe \ libbootloader_message \ libfs_mgr \ libfec \ diff --git a/adb/client/usb_libusb.cpp b/adb/client/usb_libusb.cpp index 7adb26213..c48a2517b 100644 --- a/adb/client/usb_libusb.cpp +++ b/adb/client/usb_libusb.cpp @@ -306,14 +306,6 @@ static void poll_for_devices() { } device_serial.resize(rc); - // Try to reset the device. - rc = libusb_reset_device(handle_raw); - if (rc != 0) { - LOG(WARNING) << "failed to reset opened device '" << device_serial - << "': " << libusb_error_name(rc); - continue; - } - // WARNING: this isn't released via RAII. rc = libusb_claim_interface(handle.get(), interface_num); if (rc != 0) { diff --git a/adb/transport_local.cpp b/adb/transport_local.cpp index 12b98ba3b..4198a5247 100644 --- a/adb/transport_local.cpp +++ b/adb/transport_local.cpp @@ -289,7 +289,7 @@ static void server_socket_thread(void* arg) { #define open adb_open #define read adb_read #define write adb_write -#include <qemu_pipe.h> +#include <system/qemu_pipe.h> #undef open #undef read #undef write diff --git a/fingerprintd/FingerprintDaemonProxy.cpp b/fingerprintd/FingerprintDaemonProxy.cpp index 1c7da30c3..b3c0cd7d4 100644 --- a/fingerprintd/FingerprintDaemonProxy.cpp +++ b/fingerprintd/FingerprintDaemonProxy.cpp @@ -31,7 +31,7 @@ namespace android { FingerprintDaemonProxy* FingerprintDaemonProxy::sInstance = NULL; // Supported fingerprint HAL version -static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 0); +static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 1); FingerprintDaemonProxy::FingerprintDaemonProxy() : mModule(NULL), mDevice(NULL), mCallback(NULL) { diff --git a/gatekeeperd/gatekeeperd.cpp b/gatekeeperd/gatekeeperd.cpp index d4a92e57d..96bda07a5 100644 --- a/gatekeeperd/gatekeeperd.cpp +++ b/gatekeeperd/gatekeeperd.cpp @@ -166,7 +166,14 @@ public: enrolled_password_handle, enrolled_password_handle_length); } - if (ret == 0) { + if (ret == GATEKEEPER_RESPONSE_OK && (*enrolled_password_handle == nullptr || + *enrolled_password_handle_length != sizeof(password_handle_t))) { + ret = GATEKEEPER_RESPONSE_ERROR; + ALOGE("HAL: password_handle=%p size_of_handle=%" PRIu32 "\n", + *enrolled_password_handle, *enrolled_password_handle_length); + } + + if (ret == GATEKEEPER_RESPONSE_OK) { gatekeeper::password_handle_t *handle = reinterpret_cast<gatekeeper::password_handle_t *>(*enrolled_password_handle); store_sid(uid, handle->user_id); diff --git a/healthd/Android.mk b/healthd/Android.mk index 7c5e35bac..b292725b9 100644 --- a/healthd/Android.mk +++ b/healthd/Android.mk @@ -21,6 +21,10 @@ LOCAL_STATIC_LIBRARIES := libutils libbase libbinder include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) +ifeq ($(strip $(BOARD_CHARGER_ENABLE_SUSPEND)),true) +LOCAL_CFLAGS += -DCHARGER_ENABLE_SUSPEND +LOCAL_SHARED_LIBRARIES += libsuspend +endif LOCAL_SRC_FILES := \ healthd_mode_android.cpp \ healthd_mode_charger.cpp \ @@ -90,6 +94,14 @@ endif LOCAL_C_INCLUDES := bootable/recovery $(LOCAL_PATH)/include +ifneq ($(BOARD_PERIODIC_CHORES_INTERVAL_FAST),) +LOCAL_CFLAGS += -DBOARD_PERIODIC_CHORES_INTERVAL_FAST=$(BOARD_PERIODIC_CHORES_INTERVAL_FAST) +endif + +ifneq ($(BOARD_PERIODIC_CHORES_INTERVAL_SLOW),) +LOCAL_CFLAGS += -DBOARD_PERIODIC_CHORES_INTERVAL_SLOW=$(BOARD_PERIODIC_CHORES_INTERVAL_SLOW) +endif + LOCAL_STATIC_LIBRARIES := \ libhealthd_internal \ libbatterymonitor \ diff --git a/healthd/healthd.cpp b/healthd/healthd.cpp index 20a6bf6c3..aa6735d71 100644 --- a/healthd/healthd.cpp +++ b/healthd/healthd.cpp @@ -35,9 +35,19 @@ using namespace android; -// Periodic chores intervals in seconds -#define DEFAULT_PERIODIC_CHORES_INTERVAL_FAST (60 * 1) -#define DEFAULT_PERIODIC_CHORES_INTERVAL_SLOW (60 * 10) +#ifndef BOARD_PERIODIC_CHORES_INTERVAL_FAST + // Periodic chores fast interval in seconds + #define DEFAULT_PERIODIC_CHORES_INTERVAL_FAST (60 * 1) +#else + #define DEFAULT_PERIODIC_CHORES_INTERVAL_FAST (BOARD_PERIODIC_CHORES_INTERVAL_FAST) +#endif + +#ifndef BOARD_PERIODIC_CHORES_INTERVAL_SLOW + // Periodic chores fast interval in seconds + #define DEFAULT_PERIODIC_CHORES_INTERVAL_SLOW (60 * 10) +#else + #define DEFAULT_PERIODIC_CHORES_INTERVAL_SLOW (BOARD_PERIODIC_CHORES_INTERVAL_SLOW) +#endif static struct healthd_config healthd_config = { .periodic_chores_interval_fast = DEFAULT_PERIODIC_CHORES_INTERVAL_FAST, @@ -143,10 +153,14 @@ static void healthd_mode_nop_battery_update( struct android::BatteryProperties* /*props*/) { } -int healthd_register_event(int fd, void (*handler)(uint32_t)) { +int healthd_register_event(int fd, void (*handler)(uint32_t), EventWakeup wakeup) { struct epoll_event ev; - ev.events = EPOLLIN | EPOLLWAKEUP; + ev.events = EPOLLIN; + + if (wakeup == EVENT_WAKEUP_FD) + ev.events |= EPOLLWAKEUP; + ev.data.ptr = (void *)handler; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) { KLOG_ERROR(LOG_TAG, @@ -252,7 +266,7 @@ static void uevent_init(void) { } fcntl(uevent_fd, F_SETFL, O_NONBLOCK); - if (healthd_register_event(uevent_fd, uevent_event)) + if (healthd_register_event(uevent_fd, uevent_event, EVENT_WAKEUP_FD)) KLOG_ERROR(LOG_TAG, "register for uevent events failed\n"); } @@ -275,7 +289,7 @@ static void wakealarm_init(void) { return; } - if (healthd_register_event(wakealarm_fd, wakealarm_event)) + if (healthd_register_event(wakealarm_fd, wakealarm_event, EVENT_WAKEUP_FD)) KLOG_ERROR(LOG_TAG, "Registration of wakealarm event failed\n"); @@ -283,17 +297,22 @@ static void wakealarm_init(void) { } static void healthd_mainloop(void) { + int nevents = 0; while (1) { struct epoll_event events[eventct]; - int nevents; int timeout = awake_poll_interval; int mode_timeout; + /* Don't wait for first timer timeout to run periodic chores */ + if (!nevents) + periodic_chores(); + + healthd_mode_ops->heartbeat(); + mode_timeout = healthd_mode_ops->preparetowait(); if (timeout < 0 || (mode_timeout > 0 && mode_timeout < timeout)) timeout = mode_timeout; nevents = epoll_wait(epollfd, events, eventct, timeout); - if (nevents == -1) { if (errno == EINTR) continue; @@ -305,11 +324,6 @@ static void healthd_mainloop(void) { if (events[n].data.ptr) (*(void (*)(int))events[n].data.ptr)(events[n].events); } - - if (!nevents) - periodic_chores(); - - healthd_mode_ops->heartbeat(); } return; diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp index 2f6937201..91774c6bc 100644 --- a/healthd/healthd_mode_charger.cpp +++ b/healthd/healthd_mode_charger.cpp @@ -343,14 +343,19 @@ static void draw_clock(const animation& anim) static void draw_percent(const animation& anim) { - if (anim.cur_level <= 0 || anim.cur_status != BATTERY_STATUS_CHARGING) return; + int cur_level = anim.cur_level; + if (anim.cur_status == BATTERY_STATUS_FULL) { + cur_level = 100; + } + + if (cur_level <= 0) return; const animation::text_field& field = anim.text_percent; if (field.font == nullptr || field.font->char_width == 0 || field.font->char_height == 0) { return; } - std::string str = base::StringPrintf("%d%%", anim.cur_level); + std::string str = base::StringPrintf("%d%%", cur_level); int x, y; determine_xy(field, str.size(), &x, &y); @@ -840,7 +845,7 @@ void healthd_mode_charger_init(struct healthd_config* config) std::placeholders::_2)); if (!ret) { epollfd = ev_get_epollfd(); - healthd_register_event(epollfd, charger_event_handler); + healthd_register_event(epollfd, charger_event_handler, EVENT_WAKEUP_FD); } struct animation* anim = init_animation(); diff --git a/healthd/include/healthd/healthd.h b/healthd/include/healthd/healthd.h index 34ea55f66..17efbd62a 100644 --- a/healthd/include/healthd/healthd.h +++ b/healthd/include/healthd/healthd.h @@ -73,9 +73,14 @@ struct healthd_config { bool (*screen_on)(android::BatteryProperties *props); }; +enum EventWakeup { + EVENT_NO_WAKEUP_FD, + EVENT_WAKEUP_FD, +}; + // Global helper functions -int healthd_register_event(int fd, void (*handler)(uint32_t)); +int healthd_register_event(int fd, void (*handler)(uint32_t), EventWakeup wakeup = EVENT_NO_WAKEUP_FD); void healthd_battery_update(); android::status_t healthd_get_property(int id, struct android::BatteryProperty *val); diff --git a/include/system/qemu_pipe.h b/include/system/qemu_pipe.h new file mode 100644 index 000000000..af2507997 --- /dev/null +++ b/include/system/qemu_pipe.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2011 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. + */ +#ifndef ANDROID_INCLUDE_SYSTEM_QEMU_PIPE_H +#define ANDROID_INCLUDE_SYSTEM_QEMU_PIPE_H + +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> + +// Define QEMU_PIPE_DEBUG if you want to print error messages when an error +// occurs during pipe operations. The macro should simply take a printf-style +// formatting string followed by optional arguments. +#ifndef QEMU_PIPE_DEBUG +# define QEMU_PIPE_DEBUG(...) (void)0 +#endif + +// Try to open a new Qemu fast-pipe. This function returns a file descriptor +// that can be used to communicate with a named service managed by the +// emulator. +// +// This file descriptor can be used as a standard pipe/socket descriptor. +// +// 'pipeName' is the name of the emulator service you want to connect to, +// and must begin with 'pipe:' (e.g. 'pipe:camera' or 'pipe:opengles'). +// +// On success, return a valid file descriptor, or -1/errno on failure. E.g.: +// +// EINVAL -> unknown/unsupported pipeName +// ENOSYS -> fast pipes not available in this system. +// +// ENOSYS should never happen, except if you're trying to run within a +// misconfigured emulator. +// +// You should be able to open several pipes to the same pipe service, +// except for a few special cases (e.g. GSM modem), where EBUSY will be +// returned if more than one client tries to connect to it. +static __inline__ int qemu_pipe_open(const char* pipeName) { + // Sanity check. + if (!pipeName || memcmp(pipeName, "pipe:", 5) != 0) { + errno = EINVAL; + return -1; + } + + int fd = TEMP_FAILURE_RETRY(open("/dev/qemu_pipe", O_RDWR)); + if (fd < 0) { + QEMU_PIPE_DEBUG("%s: Could not open /dev/qemu_pipe: %s", __FUNCTION__, + strerror(errno)); + return -1; + } + + // Write the pipe name, *including* the trailing zero which is necessary. + size_t pipeNameLen = strlen(pipeName); + ssize_t ret = TEMP_FAILURE_RETRY(write(fd, pipeName, pipeNameLen + 1U)); + if (ret != (ssize_t)pipeNameLen + 1) { + QEMU_PIPE_DEBUG("%s: Could not connect to %s pipe service: %s", + __FUNCTION__, pipeName, strerror(errno)); + if (ret == 0) { + errno = ECONNRESET; + } else if (ret > 0) { + errno = EINVAL; + } + return -1; + } + return fd; +} + +// Send a framed message |buff| of |len| bytes through the |fd| descriptor. +// This really adds a 4-hexchar prefix describing the payload size. +// Returns 0 on success, and -1 on error. +static int __inline__ qemu_pipe_frame_send(int fd, + const void* buff, + size_t len) { + char header[5]; + snprintf(header, sizeof(header), "%04zx", len); + ssize_t ret = TEMP_FAILURE_RETRY(write(fd, header, 4)); + if (ret != 4) { + QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno)); + return -1; + } + ret = TEMP_FAILURE_RETRY(write(fd, buff, len)); + if (ret != (ssize_t)len) { + QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno)); + return -1; + } + return 0; +} + +// Read a frame message from |fd|, and store it into |buff| of |len| bytes. +// If the framed message is larger than |len|, then this returns -1 and the +// content is lost. Otherwise, this returns the size of the message. NOTE: +// empty messages are possible in a framed wire protocol and do not mean +// end-of-stream. +static int __inline__ qemu_pipe_frame_recv(int fd, void* buff, size_t len) { + char header[5]; + ssize_t ret = TEMP_FAILURE_RETRY(read(fd, header, 4)); + if (ret != 4) { + QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno)); + return -1; + } + header[4] = '\0'; + size_t size; + if (sscanf(header, "%04zx", &size) != 1) { + QEMU_PIPE_DEBUG("Malformed qemud frame header: [%.*s]", 4, header); + return -1; + } + if (size > len) { + QEMU_PIPE_DEBUG("Oversized qemud frame (% bytes, expected <= %)", size, + len); + return -1; + } + ret = TEMP_FAILURE_RETRY(read(fd, buff, size)); + if (ret != (ssize_t)size) { + QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s", + strerror(errno)); + return -1; + } + return size; +} + +#endif /* ANDROID_INCLUDE_HARDWARE_QEMUD_PIPE_H */ diff --git a/libcutils/fs_config.c b/libcutils/fs_config.c index 6a57a41f8..daa9ff545 100644 --- a/libcutils/fs_config.c +++ b/libcutils/fs_config.c @@ -35,22 +35,13 @@ #include <log/log.h> #include <private/android_filesystem_config.h> +#include <private/fs_config.h> #include <utils/Compat.h> #ifndef O_BINARY #define O_BINARY 0 #endif -/* The following structure is stored little endian */ -struct fs_path_config_from_file { - uint16_t len; - uint16_t mode; - uint16_t uid; - uint16_t gid; - uint64_t capabilities; - char prefix[]; -} __attribute__((__aligned__(sizeof(uint64_t)))); - /* My kingdom for <endian.h> */ static inline uint16_t get2LE(const uint8_t* src) { return src[0] | (src[1] << 8); } diff --git a/libcutils/include/private/fs_config.h b/libcutils/include/private/fs_config.h new file mode 100644 index 000000000..7dad668aa --- /dev/null +++ b/libcutils/include/private/fs_config.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#ifndef _LIBS_CUTILS_PRIVATE_FS_CONFIG_H +#define _LIBS_CUTILS_PRIVATE_FS_CONFIG_H + +#include <stdint.h> + +/* + * binary format for the runtime <partition>/etc/fs_config_(dirs|files) + * filesystem override files. + */ + +/* The following structure is stored little endian */ +struct fs_path_config_from_file { + uint16_t len; + uint16_t mode; + uint16_t uid; + uint16_t gid; + uint64_t capabilities; + char prefix[]; +} __attribute__((__aligned__(sizeof(uint64_t)))); + +#endif /* _LIBS_CUTILS_PRIVATE_FS_CONFIG_H */ diff --git a/libsuspend/autosuspend_wakeup_count.c b/libsuspend/autosuspend_wakeup_count.c index 2da204ae0..4dedf7f9f 100644 --- a/libsuspend/autosuspend_wakeup_count.c +++ b/libsuspend/autosuspend_wakeup_count.c @@ -24,7 +24,6 @@ #include <stddef.h> #include <stdbool.h> #include <string.h> -#include <sys/param.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> @@ -36,24 +35,12 @@ #define SYS_POWER_STATE "/sys/power/state" #define SYS_POWER_WAKEUP_COUNT "/sys/power/wakeup_count" -#define BASE_SLEEP_TIME 100000 - static int state_fd; static int wakeup_count_fd; static pthread_t suspend_thread; static sem_t suspend_lockout; static const char *sleep_state = "mem"; static void (*wakeup_func)(bool success) = NULL; -static int sleep_time = BASE_SLEEP_TIME; - -static void update_sleep_time(bool success) { - if (success) { - sleep_time = BASE_SLEEP_TIME; - return; - } - // double sleep time after each failure up to one minute - sleep_time = MIN(sleep_time * 2, 60000000); -} static void *suspend_thread_func(void *arg __attribute__((unused))) { @@ -61,12 +48,10 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) char wakeup_count[20]; int wakeup_count_len; int ret; - bool success = true; + bool success; while (1) { - update_sleep_time(success); - usleep(sleep_time); - success = false; + usleep(100000); ALOGV("%s: read wakeup_count\n", __func__); lseek(wakeup_count_fd, 0, SEEK_SET); wakeup_count_len = TEMP_FAILURE_RETRY(read(wakeup_count_fd, wakeup_count, @@ -90,6 +75,7 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) continue; } + success = true; ALOGV("%s: write %*s to wakeup_count\n", __func__, wakeup_count_len, wakeup_count); ret = TEMP_FAILURE_RETRY(write(wakeup_count_fd, wakeup_count, wakeup_count_len)); if (ret < 0) { @@ -98,8 +84,8 @@ static void *suspend_thread_func(void *arg __attribute__((unused))) } else { ALOGV("%s: write %s to %s\n", __func__, sleep_state, SYS_POWER_STATE); ret = TEMP_FAILURE_RETRY(write(state_fd, sleep_state, strlen(sleep_state))); - if (ret >= 0) { - success = true; + if (ret < 0) { + success = false; } void (*func)(bool success) = wakeup_func; if (func != NULL) { diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp index 0984e8116..0c7019ad8 100644 --- a/logd/LogBuffer.cpp +++ b/logd/LogBuffer.cpp @@ -1091,8 +1091,10 @@ log_time LogBuffer::flushTo(SocketClient* reader, const log_time& start, it = mLogElements.begin(); } else { LogBufferElementCollection::iterator last; - // 30 second limit to continue search for out-of-order entries. - log_time min = start - log_time(30, 0); + // 3 second limit to continue search for out-of-order entries. + log_time min = start - log_time(3, 0); + // Cap to 300 iterations we look back for out-of-order entries. + size_t count = 300; // Client wants to start from some specified time. Chances are // we are better off starting from the end of the time sorted list. for (last = it = mLogElements.end(); it != mLogElements.begin(); @@ -1101,7 +1103,7 @@ log_time LogBuffer::flushTo(SocketClient* reader, const log_time& start, LogBufferElement* element = *it; if (element->getRealTime() > start) { last = it; - } else if (element->getRealTime() < min) { + } else if (!--count || (element->getRealTime() < min)) { break; } } diff --git a/qemu_pipe/Android.mk b/qemu_pipe/Android.mk deleted file mode 100644 index 6e0144ce1..000000000 --- a/qemu_pipe/Android.mk +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2011 The Android Open Source Project - -LOCAL_PATH:= $(call my-dir) - -common_static_libraries := \ - libbase -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_SANITIZE := integer -LOCAL_SRC_FILES:= \ - qemu_pipe.cpp -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/include \ - system/base/include -LOCAL_MODULE:= libqemu_pipe -LOCAL_STATIC_LIBRARIES := $(common_static_libraries) -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -LOCAL_CFLAGS := -Werror -include $(BUILD_STATIC_LIBRARY) diff --git a/qemu_pipe/include/qemu_pipe.h b/qemu_pipe/include/qemu_pipe.h deleted file mode 100644 index 098749899..000000000 --- a/qemu_pipe/include/qemu_pipe.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2011 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. - */ -#ifndef ANDROID_CORE_INCLUDE_QEMU_PIPE_H -#define ANDROID_CORE_INCLUDE_QEMU_PIPE_H - -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif -// Try to open a new Qemu fast-pipe. This function returns a file descriptor -// that can be used to communicate with a named service managed by the -// emulator. -// -// This file descriptor can be used as a standard pipe/socket descriptor. -// -// 'pipeName' is the name of the emulator service you want to connect to, -// and should begin with 'pipe:' (e.g. 'pipe:camera' or 'pipe:opengles'). -// For backward compatibility, the 'pipe:' prefix can be omitted, and in -// that case, qemu_pipe_open will add it for you. - -// On success, return a valid file descriptor, or -1/errno on failure. E.g.: -// -// EINVAL -> unknown/unsupported pipeName -// ENOSYS -> fast pipes not available in this system. -// -// ENOSYS should never happen, except if you're trying to run within a -// misconfigured emulator. -// -// You should be able to open several pipes to the same pipe service, -// except for a few special cases (e.g. GSM modem), where EBUSY will be -// returned if more than one client tries to connect to it. -int qemu_pipe_open(const char* pipeName); - -// Send a framed message |buff| of |len| bytes through the |fd| descriptor. -// This really adds a 4-hexchar prefix describing the payload size. -// Returns 0 on success, and -1 on error. -int qemu_pipe_frame_send(int fd, const void* buff, size_t len); - -// Read a frame message from |fd|, and store it into |buff| of |len| bytes. -// If the framed message is larger than |len|, then this returns -1 and the -// content is lost. Otherwise, this returns the size of the message. NOTE: -// empty messages are possible in a framed wire protocol and do not mean -// end-of-stream. -int qemu_pipe_frame_recv(int fd, void* buff, size_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* ANDROID_CORE_INCLUDE_QEMU_PIPE_H */ diff --git a/qemu_pipe/qemu_pipe.cpp b/qemu_pipe/qemu_pipe.cpp deleted file mode 100644 index beeccb07f..000000000 --- a/qemu_pipe/qemu_pipe.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2011 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 "qemu_pipe.h" - -#include <unistd.h> -#include <fcntl.h> -#include <string.h> -#include <errno.h> -#include <stdio.h> - -#include <android-base/file.h> - -using android::base::ReadFully; -using android::base::WriteFully; - -// Define QEMU_PIPE_DEBUG if you want to print error messages when an error -// occurs during pipe operations. The macro should simply take a printf-style -// formatting string followed by optional arguments. -#ifndef QEMU_PIPE_DEBUG -# define QEMU_PIPE_DEBUG(...) (void)0 -#endif - -int qemu_pipe_open(const char* pipeName) { - // Sanity check. - if (!pipeName) { - errno = EINVAL; - return -1; - } - - int fd = TEMP_FAILURE_RETRY(open("/dev/qemu_pipe", O_RDWR)); - if (fd < 0) { - QEMU_PIPE_DEBUG("%s: Could not open /dev/qemu_pipe: %s", __FUNCTION__, - strerror(errno)); - return -1; - } - - // Write the pipe name, *including* the trailing zero which is necessary. - size_t pipeNameLen = strlen(pipeName); - if (WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - - // now, add 'pipe:' prefix and try again - // Note: host side will wait for the trailing '\0' to start - // service lookup. - const char pipe_prefix[] = "pipe:"; - if (WriteFully(fd, pipe_prefix, strlen(pipe_prefix)) && - WriteFully(fd, pipeName, pipeNameLen + 1U)) { - return fd; - } - QEMU_PIPE_DEBUG("%s: Could not write to %s pipe service: %s", - __FUNCTION__, pipeName, strerror(errno)); - close(fd); - return -1; -} - -int qemu_pipe_frame_send(int fd, const void* buff, size_t len) { - char header[5]; - snprintf(header, sizeof(header), "%04zx", len); - if (!WriteFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno)); - return -1; - } - if (!WriteFully(fd, buff, len)) { - QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno)); - return -1; - } - return 0; -} - -int qemu_pipe_frame_recv(int fd, void* buff, size_t len) { - char header[5]; - if (!ReadFully(fd, header, 4)) { - QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno)); - return -1; - } - header[4] = '\0'; - size_t size; - if (sscanf(header, "%04zx", &size) != 1) { - QEMU_PIPE_DEBUG("Malformed qemud frame header: [%.*s]", 4, header); - return -1; - } - if (size > len) { - QEMU_PIPE_DEBUG("Oversized qemud frame (% bytes, expected <= %)", size, - len); - return -1; - } - if (!ReadFully(fd, buff, size)) { - QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s", - strerror(errno)); - return -1; - } - return size; -} |