diff options
51 files changed, 493 insertions, 694 deletions
diff --git a/adb/.clang-format b/adb/.clang-format index 2b83a1f..0395c8e 100644 --- a/adb/.clang-format +++ b/adb/.clang-format @@ -4,8 +4,8 @@ AllowShortFunctionsOnASingleLine: false CommentPragmas: NOLINT:.* DerivePointerAlignment: false -IndentWidth: 2 +IndentWidth: 4 PointerAlignment: Left -TabWidth: 2 +TabWidth: 4 UseTab: Never PenaltyExcessCharacter: 32 diff --git a/adb/adb.cpp b/adb/adb.cpp index ffa93f4..d37ca36 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -14,21 +14,24 @@ * limitations under the License. */ -#define TRACE_TAG TRACE_ADB +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" +#include "adb.h" -#include <stdio.h> -#include <stdlib.h> #include <ctype.h> -#include <stdarg.h> #include <errno.h> +#include <stdarg.h> #include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> #include <string.h> -#include <time.h> #include <sys/time.h> -#include <stdint.h> +#include <time.h> + +#include <string> -#include "sysdeps.h" -#include "adb.h" #include "adb_auth.h" #include "adb_io.h" #include "adb_listeners.h" @@ -74,17 +77,71 @@ void fatal_errno(const char *fmt, ...) exit(-1); } -int adb_trace_mask; +#if !ADB_HOST +void start_device_log(void) { + adb_mkdir("/data/adb", 0775); -/* read a comma/space/colum/semi-column separated list of tags - * from the ADB_TRACE environment variable and build the trace - * mask from it. note that '1' and 'all' are special cases to - * enable all tracing - */ -void adb_trace_init(void) -{ - const char* p = getenv("ADB_TRACE"); - const char* q; + struct tm now; + time_t t; + tzset(); + time(&t); + localtime_r(&t, &now); + + char path[PATH_MAX]; + strftime(path, sizeof(path), "/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt", &now); + + int fd = unix_open(path, O_WRONLY | O_CREAT | O_TRUNC, 0640); + if (fd == -1) { + return; + } + + // redirect stdout and stderr to the log file + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid()); + adb_close(fd); + + fd = unix_open("/dev/null", O_RDONLY); + dup2(fd, 0); + adb_close(fd); +} +#endif + +int adb_trace_mask; + +std::string get_trace_setting_from_env() { + const char* setting = getenv("ADB_TRACE"); + if (setting == nullptr) { + setting = ""; + } + + return std::string(setting); +} + +#if !ADB_HOST +std::string get_trace_setting_from_prop() { + char buf[PROPERTY_VALUE_MAX]; + property_get("persist.adb.trace_mask", buf, ""); + return std::string(buf); +} +#endif + +std::string get_trace_setting() { +#if ADB_HOST + return get_trace_setting_from_env(); +#else + return get_trace_setting_from_prop(); +#endif +} + +// Split the comma/space/colum/semi-column separated list of tags from the trace +// setting and build the trace mask from it. note that '1' and 'all' are special +// cases to enable all tracing. +// +// adb's trace setting comes from the ADB_TRACE environment variable, whereas +// adbd's comes from the system property persist.adb.trace_mask. +void adb_trace_init() { + const std::string trace_setting = get_trace_setting(); static const struct { const char* tag; @@ -106,25 +163,25 @@ void adb_trace_init(void) { NULL, 0 } }; - if (p == NULL) - return; + if (trace_setting.empty()) { + return; + } - /* use a comma/column/semi-colum/space separated list */ + // Use a comma/colon/semi-colon/space separated list + const char* p = trace_setting.c_str(); while (*p) { int len, tagn; - q = strpbrk(p, " ,:;"); + const char* q = strpbrk(p, " ,:;"); if (q == NULL) { q = p + strlen(p); } len = q - p; - for (tagn = 0; tags[tagn].tag != NULL; tagn++) - { + for (tagn = 0; tags[tagn].tag != NULL; tagn++) { int taglen = strlen(tags[tagn].tag); - if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) - { + if (len == taglen && !memcmp(tags[tagn].tag, p, len)) { int flag = tags[tagn].flag; if (flag == 0) { adb_trace_mask = ~0; @@ -138,6 +195,10 @@ void adb_trace_init(void) if (*p) p++; } + +#if !ADB_HOST + start_device_log(); +#endif } apacket* get_apacket(void) diff --git a/adb/adb_auth.cpp b/adb/adb_auth.cpp index c236b64..dc01825 100644 --- a/adb/adb_auth.cpp +++ b/adb/adb_auth.cpp @@ -14,7 +14,10 @@ * limitations under the License. */ -#define TRACE_TAG TRACE_ADB +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" +#include "adb_auth.h" #include <errno.h> #include <stdio.h> @@ -23,9 +26,7 @@ #include <unistd.h> #include "adb.h" -#include "adb_auth.h" #include "transport.h" -#include "sysdeps.h" int auth_enabled = 0; diff --git a/adb/adb_auth.h b/adb/adb_auth.h index e0425ad..635556e 100644 --- a/adb/adb_auth.h +++ b/adb/adb_auth.h @@ -17,6 +17,8 @@ #ifndef __ADB_AUTH_H #define __ADB_AUTH_H +#include "adb.h" + #ifdef __cplusplus extern "C" { #endif diff --git a/adb/adb_auth_client.cpp b/adb/adb_auth_client.cpp index 5dadcd9..8e7d38b 100644 --- a/adb/adb_auth_client.cpp +++ b/adb/adb_auth_client.cpp @@ -14,23 +14,23 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_AUTH + +#include "sysdeps.h" +#include "adb_auth.h" + #include <resolv.h> #include <stdio.h> #include <string.h> -#include "sysdeps.h" - -#include "adb.h" -#include "adb_auth.h" #include "cutils/list.h" #include "cutils/sockets.h" -#include "fdevent.h" #include "mincrypt/rsa.h" #include "mincrypt/sha.h" -#include "transport.h" - -#define TRACE_TAG TRACE_AUTH +#include "adb.h" +#include "fdevent.h" +#include "transport.h" struct adb_public_key { struct listnode node; diff --git a/adb/adb_auth_host.cpp b/adb/adb_auth_host.cpp index aba23d4..7c2bcfb 100644 --- a/adb/adb_auth_host.cpp +++ b/adb/adb_auth_host.cpp @@ -14,8 +14,14 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_AUTH + +#include "sysdeps.h" +#include "adb_auth.h" + #include <stdio.h> #include <stdlib.h> +#include <string.h> #ifdef _WIN32 # ifndef WIN32_LEAN_AND_MEAN @@ -28,11 +34,8 @@ # include <sys/stat.h> # include <unistd.h> #endif -#include <string.h> -#include "sysdeps.h" #include "adb.h" -#include "adb_auth.h" /* HACK: we need the RSAPublicKey struct * but RSA_verify conflits with openssl */ @@ -52,12 +55,9 @@ #include <openssl/base64.h> #endif -#define TRACE_TAG TRACE_AUTH - #define ANDROID_PATH ".android" #define ADB_KEY_FILE "adbkey" - struct adb_private_key { struct listnode node; RSA *rsa; diff --git a/adb/adb_client.cpp b/adb/adb_client.cpp index a485aa2..4751bff 100644 --- a/adb/adb_client.cpp +++ b/adb/adb_client.cpp @@ -14,6 +14,11 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" +#include "adb_client.h" + #include <errno.h> #include <limits.h> #include <stdarg.h> @@ -23,10 +28,6 @@ #include <sys/stat.h> #include <sys/types.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_ADB -#include "adb_client.h" #include "adb_io.h" static transport_type __adb_transport = kTransportAny; diff --git a/adb/adb_io.cpp b/adb/adb_io.cpp index 4dd9f4d..d89f304 100644 --- a/adb/adb_io.cpp +++ b/adb/adb_io.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define TRACE_TAG TRACE_RWX +#define TRACE_TAG TRACE_RWX #include "sysdeps.h" #include "adb_io.h" @@ -79,6 +79,8 @@ bool WriteFdExactly(int fd, const void* buf, size_t len) { D("writex: fd=%d disconnected\n", fd); errno = 0; return false; + } else { + return false; } } else { len -= r; diff --git a/adb/adb_io_test.cpp b/adb/adb_io_test.cpp index 0c69bc9..da340b2 100644 --- a/adb/adb_io_test.cpp +++ b/adb/adb_io_test.cpp @@ -18,8 +18,11 @@ #include <gtest/gtest.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> #include <unistd.h> #include <string> @@ -127,6 +130,15 @@ TEST(io, WriteFdExactly_partial) { EXPECT_EQ(expected, s); } +TEST(io, WriteFdExactly_ENOSPC) { + int fd = open("/dev/full", O_WRONLY); + ASSERT_NE(-1, fd); + + char buf[] = "foo"; + ASSERT_FALSE(WriteFdExactly(fd, buf, sizeof(buf))); + ASSERT_EQ(ENOSPC, errno); +} + TEST(io, WriteStringFully) { const char str[] = "Foobar"; TemporaryFile tf; diff --git a/adb/adb_main.cpp b/adb/adb_main.cpp index 1d9cc3b..c1e4b13 100644 --- a/adb/adb_main.cpp +++ b/adb/adb_main.cpp @@ -14,15 +14,15 @@ * limitations under the License. */ -#define TRACE_TAG TRACE_ADB +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> -#include "sysdeps.h" - #include "adb.h" #include "adb_auth.h" #include "adb_listeners.h" @@ -148,42 +148,6 @@ static bool should_drop_privileges() { return true; // "adb root" not allowed, always drop privileges. #endif /* ALLOW_ADBD_ROOT */ } - -void start_device_log(void) -{ - int fd; - char path[PATH_MAX]; - struct tm now; - time_t t; - char value[PROPERTY_VALUE_MAX]; - - // read the trace mask from persistent property persist.adb.trace_mask - // give up if the property is not set or cannot be parsed - property_get("persist.adb.trace_mask", value, ""); - if (sscanf(value, "%x", &adb_trace_mask) != 1) - return; - - adb_mkdir("/data/adb", 0775); - tzset(); - time(&t); - localtime_r(&t, &now); - strftime(path, sizeof(path), - "/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt", - &now); - fd = unix_open(path, O_WRONLY | O_CREAT | O_TRUNC, 0640); - if (fd < 0) - return; - - // redirect stdout and stderr to the log file - dup2(fd, 1); - dup2(fd, 2); - fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid()); - adb_close(fd); - - fd = unix_open("/dev/null", O_RDONLY); - dup2(fd, 0); - adb_close(fd); -} #endif /* ADB_HOST */ /* Constructs a local name of form tcp:port. @@ -385,18 +349,20 @@ int adb_main(int is_daemon, int server_port) return 0; } -int main(int argc, char **argv) -{ +int main(int argc, char **argv) { #if ADB_HOST adb_sysdeps_init(); +#endif adb_trace_init(); + +#if ADB_HOST D("Handling commandline()\n"); return adb_commandline(argc - 1, const_cast<const char**>(argv + 1)); #else /* If adbd runs inside the emulator this will enable adb tracing via * adb-debug qemud service in the emulator. */ adb_qemu_trace_init(); - while(1) { + while (1) { int c; int option_index = 0; static struct option opts[] = { @@ -418,7 +384,6 @@ int main(int argc, char **argv) } } - start_device_log(); D("Handling main()\n"); return adb_main(0, DEFAULT_ADB_PORT); #endif diff --git a/adb/commandline.cpp b/adb/commandline.cpp index 4538b04..c9b1eab 100644 --- a/adb/commandline.cpp +++ b/adb/commandline.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" + #include <assert.h> #include <ctype.h> #include <errno.h> @@ -31,9 +35,6 @@ #include <unistd.h> #endif -#include "sysdeps.h" - -#define TRACE_TAG TRACE_ADB #include "adb.h" #include "adb_auth.h" #include "adb_client.h" diff --git a/adb/fdevent.cpp b/adb/fdevent.cpp index 45d33db..0c43c5e 100644 --- a/adb/fdevent.cpp +++ b/adb/fdevent.cpp @@ -15,25 +15,23 @@ ** limitations under the License. */ -#include <sys/ioctl.h> +#define TRACE_TAG TRACE_FDEVENT -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> +#include "sysdeps.h" +#include "fdevent.h" +#include <errno.h> #include <fcntl.h> - #include <stdarg.h> #include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/ioctl.h> +#include <unistd.h> #include "adb_io.h" #include "adb_trace.h" -#include "fdevent.h" -#include "sysdeps.h" - -#define TRACE_TAG TRACE_FDEVENT /* !!! Do not enable DEBUG for the adb that will run as the server: ** both stdout and stderr are used to communicate between the client @@ -587,6 +585,7 @@ void fdevent_destroy(fdevent *fde) FATAL("fde %p not created by fdevent_create()\n", fde); } fdevent_remove(fde); + free(fde); } void fdevent_install(fdevent *fde, int fd, fd_func func, void *arg) diff --git a/adb/file_sync_service.cpp b/adb/file_sync_service.cpp index ac01678..e8e9a0f 100644 --- a/adb/file_sync_service.cpp +++ b/adb/file_sync_service.cpp @@ -14,6 +14,11 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_SYNC + +#include "sysdeps.h" +#include "file_sync_service.h" + #include <dirent.h> #include <errno.h> #include <selinux/android.h> @@ -25,12 +30,8 @@ #include <unistd.h> #include <utime.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_SYNC #include "adb.h" #include "adb_io.h" -#include "file_sync_service.h" #include "private/android_filesystem_config.h" static bool should_use_fs_config(const char* path) { diff --git a/adb/jdwp_service.cpp b/adb/jdwp_service.cpp index f0b4ba7..9cf084e 100644 --- a/adb/jdwp_service.cpp +++ b/adb/jdwp_service.cpp @@ -1,12 +1,32 @@ +/* + * 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. + */ + /* implement the "debug-ports" and "track-debug-ports" device services */ + +#define TRACE_TAG TRACE_JDWP + #include "sysdeps.h" -#define TRACE_TAG TRACE_JDWP -#include "adb.h" + #include <errno.h> #include <stdio.h> #include <string.h> #include <unistd.h> +#include "adb.h" + /* here's how these things work. when adbd starts, it creates a unix server socket diff --git a/adb/remount_service.cpp b/adb/remount_service.cpp index a83d5b1..483ca3d 100644 --- a/adb/remount_service.cpp +++ b/adb/remount_service.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" + #include <errno.h> #include <fcntl.h> #include <mntent.h> @@ -25,9 +29,6 @@ #include <string> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_ADB #include "adb.h" #include "adb_io.h" #include "cutils/properties.h" diff --git a/adb/services.cpp b/adb/services.cpp index e7bf6b0..abf8ea5 100644 --- a/adb/services.cpp +++ b/adb/services.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_SERVICES + +#include "sysdeps.h" + #include <errno.h> #include <stddef.h> #include <stdio.h> @@ -32,9 +36,6 @@ #include "cutils/properties.h" #endif -#include "sysdeps.h" - -#define TRACE_TAG TRACE_SERVICES #include "adb.h" #include "adb_io.h" #include "file_sync_service.h" diff --git a/adb/set_verity_enable_state_service.cpp b/adb/set_verity_enable_state_service.cpp index 139b074..b75ed4c 100644 --- a/adb/set_verity_enable_state_service.cpp +++ b/adb/set_verity_enable_state_service.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_ADB + +#include "sysdeps.h" + #include <fcntl.h> #include <inttypes.h> #include <stdarg.h> @@ -21,13 +25,12 @@ #include <stdio.h> #include <sys/stat.h> -#define TRACE_TAG TRACE_ADB -#include "adb.h" #include "cutils/properties.h" + +#include "adb.h" #include "ext4_sb.h" #include "fs_mgr.h" #include "remount_service.h" -#include "sysdeps.h" #define FSTAB_PREFIX "/fstab." struct fstab *fstab; diff --git a/adb/sockets.cpp b/adb/sockets.cpp index 12bc8d8..48d02d6 100644 --- a/adb/sockets.cpp +++ b/adb/sockets.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_SOCKETS + +#include "sysdeps.h" + #include <ctype.h> #include <errno.h> #include <stdio.h> @@ -21,14 +25,12 @@ #include <string.h> #include <unistd.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_SOCKETS -#include "adb.h" -#include "adb_io.h" #if !ADB_HOST #include "cutils/properties.h" #endif + +#include "adb.h" +#include "adb_io.h" #include "transport.h" ADB_MUTEX_DEFINE( socket_list_lock ); diff --git a/adb/sysdeps_win32.c b/adb/sysdeps_win32.c index f132b8c..c28e031 100644 --- a/adb/sysdeps_win32.c +++ b/adb/sysdeps_win32.c @@ -1,10 +1,30 @@ +/* + * 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. + */ + +#define TRACE_TAG TRACE_SYSDEPS + #include "sysdeps.h" -#include <winsock2.h> + +#include <winsock2.h> /* winsock.h *must* be included before windows.h. */ #include <windows.h> + +#include <errno.h> #include <stdio.h> #include <stdlib.h> -#include <errno.h> -#define TRACE_TAG TRACE_SYSDEPS + #include "adb.h" extern void fatal(const char *fmt, ...); diff --git a/adb/transport.cpp b/adb/transport.cpp index 1f8ac03..0a960ff 100644 --- a/adb/transport.cpp +++ b/adb/transport.cpp @@ -14,8 +14,9 @@ * limitations under the License. */ -#include "sysdeps.h" +#define TRACE_TAG TRACE_TRANSPORT +#include "sysdeps.h" #include "transport.h" #include <ctype.h> @@ -25,7 +26,6 @@ #include <string.h> #include <unistd.h> -#define TRACE_TAG TRACE_TRANSPORT #include "adb.h" static void transport_unref(atransport *t); diff --git a/adb/transport_local.cpp b/adb/transport_local.cpp index 440d4c5..fe3c87f 100644 --- a/adb/transport_local.cpp +++ b/adb/transport_local.cpp @@ -14,21 +14,23 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_TRANSPORT + +#include "sysdeps.h" +#include "transport.h" + #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_TRANSPORT -#include "adb.h" -#include "adb_io.h" #if !ADB_HOST #include "cutils/properties.h" #endif -#include "transport.h" + +#include "adb.h" +#include "adb_io.h" #if ADB_HOST /* we keep a list of opened transports. The atransport struct knows to which diff --git a/adb/transport_usb.cpp b/adb/transport_usb.cpp index 37a8219..cdabffe 100644 --- a/adb/transport_usb.cpp +++ b/adb/transport_usb.cpp @@ -14,15 +14,16 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_TRANSPORT + +#include "sysdeps.h" +#include "transport.h" + #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sysdeps.h> - -#define TRACE_TAG TRACE_TRANSPORT #include "adb.h" -#include "transport.h" static int remote_read(apacket *p, atransport *t) { diff --git a/adb/usb_linux.cpp b/adb/usb_linux.cpp index c01ec8c..6fd2b40 100644 --- a/adb/usb_linux.cpp +++ b/adb/usb_linux.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_USB + +#include "sysdeps.h" + #include <ctype.h> #include <dirent.h> #include <errno.h> @@ -33,9 +37,6 @@ #include <linux/usb_ch9.h> #endif -#include "sysdeps.h" - -#define TRACE_TAG TRACE_USB #include "adb.h" #include "transport.h" diff --git a/adb/usb_linux_client.c b/adb/usb_linux_client.c index c88b258..434451c 100644 --- a/adb/usb_linux_client.c +++ b/adb/usb_linux_client.c @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_USB + +#include "sysdeps.h" + #include <dirent.h> #include <errno.h> #include <linux/usb/ch9.h> @@ -25,9 +29,6 @@ #include <sys/types.h> #include <unistd.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_USB #include "adb.h" #include "transport.h" diff --git a/adb/usb_osx.c b/adb/usb_osx.c index aa7e1ea..94c8cfe 100644 --- a/adb/usb_osx.c +++ b/adb/usb_osx.c @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_USB + +#include "sysdeps.h" + #include <CoreFoundation/CoreFoundation.h> #include <IOKit/IOKitLib.h> @@ -24,9 +28,6 @@ #include <stdio.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_USB #include "adb.h" #include "transport.h" diff --git a/adb/usb_windows.cpp b/adb/usb_windows.cpp index 3c5533b..d2bd58c 100644 --- a/adb/usb_windows.cpp +++ b/adb/usb_windows.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#define TRACE_TAG TRACE_USB + +#include "sysdeps.h" + #include <winsock2.h> // winsock.h *must* be included before windows.h. #include <adb_api.h> #include <errno.h> @@ -23,9 +27,6 @@ #include <windows.h> #include <winerror.h> -#include "sysdeps.h" - -#define TRACE_TAG TRACE_USB #include "adb.h" #include "transport.h" diff --git a/base/Android.mk b/base/Android.mk index 0e1a9b6..17d6ece 100644 --- a/base/Android.mk +++ b/base/Android.mk @@ -56,7 +56,6 @@ include $(BUILD_SHARED_LIBRARY) # ------------------------------------------------------------------------------ include $(CLEAR_VARS) LOCAL_MODULE := libbase -LOCAL_CLANG := true LOCAL_SRC_FILES := $(libbase_src_files) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CPPFLAGS := $(libbase_cppflags) @@ -66,7 +65,6 @@ include $(BUILD_HOST_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libbase -LOCAL_CLANG := true LOCAL_WHOLE_STATIC_LIBRARIES := libbase LOCAL_SHARED_LIBRARIES := liblog LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include @@ -88,7 +86,6 @@ include $(BUILD_NATIVE_TEST) include $(CLEAR_VARS) LOCAL_MODULE := libbase_test -LOCAL_CLANG := true LOCAL_SRC_FILES := $(libbase_test_src_files) LOCAL_CPPFLAGS := $(libbase_cppflags) LOCAL_SHARED_LIBRARIES := libbase diff --git a/fastboot/Android.mk b/fastboot/Android.mk index aa5b14a..b9e957f 100644 --- a/fastboot/Android.mk +++ b/fastboot/Android.mk @@ -19,10 +19,11 @@ include $(CLEAR_VARS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../mkbootimg \ $(LOCAL_PATH)/../../extras/ext4_utils \ $(LOCAL_PATH)/../../extras/f2fs_utils -LOCAL_SRC_FILES := protocol.c engine.c bootimg.c fastboot.c util.c fs.c +LOCAL_SRC_FILES := protocol.c engine.c bootimg_utils.cpp fastboot.cpp util.c fs.c LOCAL_MODULE := fastboot LOCAL_MODULE_TAGS := debug -LOCAL_CFLAGS += -std=gnu99 -Werror +LOCAL_CONLYFLAGS += -std=gnu99 +LOCAL_CFLAGS += -Wall -Wextra -Werror ifeq ($(HOST_OS),linux) LOCAL_SRC_FILES += usb_linux.c util_linux.c @@ -52,9 +53,11 @@ endif LOCAL_STATIC_LIBRARIES := \ $(EXTRA_STATIC_LIBS) \ - libzipfile \ + libziparchive-host \ libext4_utils_host \ libsparse_host \ + libutils \ + liblog \ libz ifneq ($(HOST_OS),windows) diff --git a/fastboot/bootimg.c b/fastboot/bootimg_utils.cpp index 240784f..d8905a6 100644 --- a/fastboot/bootimg.c +++ b/fastboot/bootimg_utils.cpp @@ -26,12 +26,12 @@ * SUCH DAMAGE. */ +#include "bootimg_utils.h" + #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <bootimg.h> - void bootimg_set_cmdline(boot_img_hdr *h, const char *cmdline) { strcpy((char*) h->cmdline, cmdline); @@ -47,7 +47,6 @@ boot_img_hdr *mkbootimg(void *kernel, unsigned kernel_size, unsigned kernel_offs unsigned ramdisk_actual; unsigned second_actual; unsigned page_mask; - boot_img_hdr *hdr; page_mask = page_size - 1; @@ -57,9 +56,8 @@ boot_img_hdr *mkbootimg(void *kernel, unsigned kernel_size, unsigned kernel_offs *bootimg_size = page_size + kernel_actual + ramdisk_actual + second_actual; - hdr = calloc(*bootimg_size, 1); - - if(hdr == 0) { + boot_img_hdr* hdr = reinterpret_cast<boot_img_hdr*>(calloc(*bootimg_size, 1)); + if (hdr == 0) { return hdr; } diff --git a/fastboot/bootimg_utils.h b/fastboot/bootimg_utils.h new file mode 100644 index 0000000..b1a86cd --- /dev/null +++ b/fastboot/bootimg_utils.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _FASTBOOT_BOOTIMG_UTILS_H_ +#define _FASTBOOT_BOOTIMG_UTILS_H_ + +#include <bootimg.h> + +#if defined(__cplusplus) +extern "C" { +#endif + +void bootimg_set_cmdline(boot_img_hdr *h, const char *cmdline); +boot_img_hdr *mkbootimg(void *kernel, unsigned kernel_size, unsigned kernel_offset, + void *ramdisk, unsigned ramdisk_size, unsigned ramdisk_offset, + void *second, unsigned second_size, unsigned second_offset, + unsigned page_size, unsigned base, unsigned tags_offset, + unsigned *bootimg_size); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/fastboot/fastboot.c b/fastboot/fastboot.cpp index fc544a6..6dc7d34 100644 --- a/fastboot/fastboot.c +++ b/fastboot/fastboot.cpp @@ -44,10 +44,10 @@ #include <sys/types.h> #include <unistd.h> -#include <bootimg.h> #include <sparse/sparse.h> -#include <zipfile/zipfile.h> +#include <ziparchive/zip_archive.h> +#include "bootimg_utils.h" #include "fastboot.h" #include "fs.h" @@ -59,14 +59,6 @@ char cur_product[FB_RESPONSE_SZ + 1]; -void bootimg_set_cmdline(boot_img_hdr *h, const char *cmdline); - -boot_img_hdr *mkbootimg(void *kernel, unsigned kernel_size, unsigned kernel_offset, - void *ramdisk, unsigned ramdisk_size, unsigned ramdisk_offset, - void *second, unsigned second_size, unsigned second_offset, - unsigned page_size, unsigned base, unsigned tags_offset, - unsigned *bootimg_size); - static usb_handle *usb = 0; static const char *serial = 0; static const char *product = 0; @@ -106,12 +98,10 @@ static struct { {"vendor.img", "vendor.sig", "vendor", true}, }; -void get_my_path(char *path); - char *find_item(const char *item, const char *product) { char *dir; - char *fn; + const char *fn; char path[PATH_MAX + 128]; if(!strcmp(item,"boot")) { @@ -234,7 +224,7 @@ int match_fastboot(usb_ifc_info *info) int list_devices_callback(usb_ifc_info *info) { if (match_fastboot_with_serial(info, NULL) == 0) { - char* serial = info->serial_number; + const char* serial = info->serial_number; if (!info->writable) { serial = "no permissions"; // like "adb devices" } @@ -389,30 +379,26 @@ void *load_bootable_image(const char *kernel, const char *ramdisk, return bdata; } -void *unzip_file(zipfile_t zip, const char *name, unsigned *sz) +static void* unzip_file(ZipArchiveHandle zip, const char* entry_name, unsigned* sz) { - void *data; - zipentry_t entry; - unsigned datasz; - - entry = lookup_zipentry(zip, name); - if (entry == NULL) { - fprintf(stderr, "archive does not contain '%s'\n", name); + ZipEntryName zip_entry_name(entry_name); + ZipEntry zip_entry; + if (FindEntry(zip, zip_entry_name, &zip_entry) != 0) { + fprintf(stderr, "archive does not contain '%s'\n", entry_name); return 0; } - *sz = get_zipentry_size(entry); + *sz = zip_entry.uncompressed_length; - datasz = *sz * 1.001; - data = malloc(datasz); - - if(data == 0) { - fprintf(stderr, "failed to allocate %d bytes\n", *sz); + uint8_t* data = reinterpret_cast<uint8_t*>(malloc(zip_entry.uncompressed_length)); + if (data == NULL) { + fprintf(stderr, "failed to allocate %u bytes for '%s'\n", *sz, entry_name); return 0; } - if (decompress_zipentry(entry, data, datasz)) { - fprintf(stderr, "failed to unzip '%s' from archive\n", name); + int error = ExtractToMemory(zip, &zip_entry, data, zip_entry.uncompressed_length); + if (error != 0) { + fprintf(stderr, "failed to extract '%s': %s\n", entry_name, ErrorCodeString(error)); free(data); return 0; } @@ -420,27 +406,28 @@ void *unzip_file(zipfile_t zip, const char *name, unsigned *sz) return data; } -static int unzip_to_file(zipfile_t zip, char *name) -{ - int fd; - char *data; - unsigned sz; - - fd = fileno(tmpfile()); - if (fd < 0) { +static int unzip_to_file(ZipArchiveHandle zip, char* entry_name) { + FILE* fp = tmpfile(); + if (fp == NULL) { + fprintf(stderr, "failed to create temporary file for '%s': %s\n", + entry_name, strerror(errno)); return -1; } - data = unzip_file(zip, name, &sz); - if (data == 0) { + ZipEntryName zip_entry_name(entry_name); + ZipEntry zip_entry; + if (FindEntry(zip, zip_entry_name, &zip_entry) != 0) { + fprintf(stderr, "archive does not contain '%s'\n", entry_name); return -1; } - if (write(fd, data, sz) != (ssize_t)sz) { - fd = -1; + int fd = fileno(fp); + int error = ExtractEntryToFile(zip, &zip_entry, fd); + if (error != 0) { + fprintf(stderr, "failed to extract '%s': %s\n", entry_name, ErrorCodeString(error)); + return -1; } - free(data); lseek(fd, 0, SEEK_SET); return fd; } @@ -461,7 +448,6 @@ static char *strip(char *s) static int setup_requirement_line(char *name) { char *val[MAX_OPTIONS]; - const char **out; char *prod = NULL; unsigned n, count; char *x; @@ -501,10 +487,11 @@ static int setup_requirement_line(char *name) name = strip(name); if (name == 0) return -1; - /* work around an unfortunate name mismatch */ - if (!strcmp(name,"board")) name = "product"; + const char* var = name; + // Work around an unfortunate name mismatch. + if (!strcmp(name,"board")) var = "product"; - out = malloc(sizeof(char*) * count); + const char** out = reinterpret_cast<const char**>(malloc(sizeof(char*) * count)); if (out == 0) return -1; for(n = 0; n < count; n++) { @@ -518,7 +505,7 @@ static int setup_requirement_line(char *name) } } - fb_queue_require(prod, name, invert, n, out); + fb_queue_require(prod, var, invert, n, out); return 0; } @@ -551,21 +538,17 @@ void queue_info_dump(void) static struct sparse_file **load_sparse_files(int fd, int max_size) { - struct sparse_file *s; - int files; - struct sparse_file **out_s; - - s = sparse_file_import_auto(fd, false); + struct sparse_file* s = sparse_file_import_auto(fd, false); if (!s) { die("cannot sparse read file\n"); } - files = sparse_file_resparse(s, max_size, NULL, 0); + int files = sparse_file_resparse(s, max_size, NULL, 0); if (files < 0) { die("Failed to resparse\n"); } - out_s = calloc(sizeof(struct sparse_file *), files + 1); + sparse_file** out_s = reinterpret_cast<sparse_file**>(calloc(sizeof(struct sparse_file *), files + 1)); if (!out_s) { die("Failed to allocate sparse file array\n"); } @@ -682,11 +665,11 @@ static int load_buf(usb_handle *usb, const char *fname, static void flash_buf(const char *pname, struct fastboot_buffer *buf) { - struct sparse_file **s; + sparse_file** s; switch (buf->type) { case FB_BUFFER_SPARSE: - s = buf->data; + s = reinterpret_cast<sparse_file**>(buf->data); while (*s) { int64_t sz64 = sparse_file_len(*s, true, false); fb_queue_flash_sparse(pname, *s++, sz64); @@ -710,63 +693,44 @@ void do_flash(usb_handle *usb, const char *pname, const char *fname) flash_buf(pname, &buf); } -void do_update_signature(zipfile_t zip, char *fn) +void do_update_signature(ZipArchiveHandle zip, char *fn) { - void *data; unsigned sz; - data = unzip_file(zip, fn, &sz); + void* data = unzip_file(zip, fn, &sz); if (data == 0) return; fb_queue_download("signature", data, sz); fb_queue_command("signature", "installing signature"); } -void do_update(usb_handle *usb, char *fn, int erase_first) +void do_update(usb_handle *usb, const char *filename, int erase_first) { - void *zdata; - unsigned zsize; - void *data; - unsigned sz; - zipfile_t zip; - int fd; - int rc; - struct fastboot_buffer buf; - size_t i; - queue_info_dump(); fb_queue_query_save("product", cur_product, sizeof(cur_product)); - zdata = load_file(fn, &zsize); - if (zdata == 0) die("failed to load '%s': %s", fn, strerror(errno)); - - zip = init_zipfile(zdata, zsize); - if(zip == 0) die("failed to access zipdata in '%s'"); + ZipArchiveHandle zip; + int error = OpenArchive(filename, &zip); + if (error != 0) { + die("failed to open zip file '%s': %s", filename, ErrorCodeString(error)); + } - data = unzip_file(zip, "android-info.txt", &sz); + unsigned sz; + void* data = unzip_file(zip, "android-info.txt", &sz); if (data == 0) { - char *tmp; - /* fallback for older zipfiles */ - data = unzip_file(zip, "android-product.txt", &sz); - if ((data == 0) || (sz < 1)) { - die("update package has no android-info.txt or android-product.txt"); - } - tmp = malloc(sz + 128); - if (tmp == 0) die("out of memory"); - sprintf(tmp,"board=%sversion-baseband=0.66.04.19\n",(char*)data); - data = tmp; - sz = strlen(tmp); + die("update package '%s' has no android-info.txt", filename); } - setup_requirements(data, sz); + setup_requirements(reinterpret_cast<char*>(data), sz); - for (i = 0; i < ARRAY_SIZE(images); i++) { - fd = unzip_to_file(zip, images[i].img_name); + for (size_t i = 0; i < ARRAY_SIZE(images); i++) { + int fd = unzip_to_file(zip, images[i].img_name); if (fd < 0) { if (images[i].is_optional) continue; die("update package missing %s", images[i].img_name); } - rc = load_buf_fd(usb, fd, &buf); + fastboot_buffer buf; + int rc = load_buf_fd(usb, fd, &buf); if (rc) die("cannot load %s from flash", images[i].img_name); do_update_signature(zip, images[i].sig_name); if (erase_first && needs_erase(images[i].part_name)) { @@ -778,6 +742,8 @@ void do_update(usb_handle *usb, char *fn, int erase_first) * program exits. */ } + + CloseArchive(zip); } void do_send_signature(char *fn) @@ -800,24 +766,22 @@ void do_send_signature(char *fn) void do_flashall(usb_handle *usb, int erase_first) { - char *fname; - void *data; - unsigned sz; - struct fastboot_buffer buf; - size_t i; - queue_info_dump(); fb_queue_query_save("product", cur_product, sizeof(cur_product)); - fname = find_item("info", product); + char* fname = find_item("info", product); if (fname == 0) die("cannot find android-info.txt"); - data = load_file(fname, &sz); + + unsigned sz; + void* data = load_file(fname, &sz); if (data == 0) die("could not load android-info.txt: %s", strerror(errno)); - setup_requirements(data, sz); - for (i = 0; i < ARRAY_SIZE(images); i++) { + setup_requirements(reinterpret_cast<char*>(data), sz); + + for (size_t i = 0; i < ARRAY_SIZE(images); i++) { fname = find_item(images[i].part_name, product); + fastboot_buffer buf; if (load_buf(usb, fname, &buf)) { if (images[i].is_optional) continue; diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index fc5d4f4..1786e49 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -31,6 +31,10 @@ #include "usb.h" +#if defined(__cplusplus) +extern "C" { +#endif + struct sparse_file; /* protocol.c - fastboot protocol */ @@ -67,7 +71,13 @@ double now(); char *mkmsg(const char *fmt, ...); void die(const char *fmt, ...); +void get_my_path(char *path); + /* Current product */ extern char cur_product[FB_RESPONSE_SZ + 1]; +#if defined(__cplusplus) +} +#endif + #endif diff --git a/fastboot/fs.h b/fastboot/fs.h index 8444081..307772b 100644 --- a/fastboot/fs.h +++ b/fastboot/fs.h @@ -3,10 +3,18 @@ #include <stdint.h> +#if defined(__cplusplus) +extern "C" { +#endif + struct fs_generator; const struct fs_generator* fs_get_generator(const char *fs_type); int fs_generator_generate(const struct fs_generator* gen, int tmpFileNo, long long partSize); +#if defined(__cplusplus) +} +#endif + #endif diff --git a/fastboot/protocol.c b/fastboot/protocol.c index 10a84c1..5b97600 100644 --- a/fastboot/protocol.c +++ b/fastboot/protocol.c @@ -305,7 +305,10 @@ int fb_download_data_sparse(usb_handle *usb, struct sparse_file *s) return -1; } - fb_download_data_sparse_flush(usb); + r = fb_download_data_sparse_flush(usb); + if (r < 0) { + return -1; + } return _command_end(usb); } diff --git a/fastboot/usb.h b/fastboot/usb.h index 17cf0a9..c7b748e 100644 --- a/fastboot/usb.h +++ b/fastboot/usb.h @@ -29,6 +29,10 @@ #ifndef _USB_H_ #define _USB_H_ +#if defined(__cplusplus) +extern "C" { +#endif + typedef struct usb_handle usb_handle; typedef struct usb_ifc_info usb_ifc_info; @@ -64,4 +68,8 @@ int usb_read(usb_handle *h, void *_data, int len); int usb_write(usb_handle *h, const void *_data, int len); int usb_wait_for_disconnect(usb_handle *h); +#if defined(__cplusplus) +} +#endif + #endif diff --git a/init/init.cpp b/init/init.cpp index e1c82a4..5a40fd3 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -15,6 +15,7 @@ */ #include <ctype.h> +#include <dirent.h> #include <errno.h> #include <fcntl.h> #include <libgen.h> @@ -40,6 +41,8 @@ #include <selinux/label.h> #include <selinux/android.h> +#include <base/file.h> +#include <base/stringprintf.h> #include <cutils/android_reboot.h> #include <cutils/fs.h> #include <cutils/iosched_policy.h> @@ -47,6 +50,8 @@ #include <cutils/sockets.h> #include <private/android_filesystem_config.h> +#include <memory> + #include "devices.h" #include "init.h" #include "log.h" @@ -66,8 +71,6 @@ static int property_triggers_enabled = 0; static char console[32]; static char bootmode[32]; -static char hardware[32]; -static unsigned revision = 0; static char qemu[32]; static struct action *cur_action = NULL; @@ -773,6 +776,8 @@ static void export_kernel_boot_props(void) { "ro.boot.mode", "ro.bootmode", "unknown", }, { "ro.boot.baseband", "ro.baseband", "unknown", }, { "ro.boot.bootloader", "ro.bootloader", "unknown", }, + { "ro.boot.hardware", "ro.hardware", "unknown", }, + { "ro.boot.revision", "ro.revision", "0", }, }; for (i = 0; i < ARRAY_SIZE(prop_map); i++) { @@ -791,16 +796,6 @@ static void export_kernel_boot_props(void) property_get("ro.bootmode", tmp); strlcpy(bootmode, tmp, sizeof(bootmode)); - /* if this was given on kernel command line, override what we read - * before (e.g. from /proc/cpuinfo), if anything */ - ret = property_get("ro.boot.hardware", tmp); - if (ret) - strlcpy(hardware, tmp, sizeof(hardware)); - property_set("ro.hardware", hardware); - - snprintf(tmp, PROP_VALUE_MAX, "%d", revision); - property_set("ro.revision", tmp); - /* TODO: these are obsolete. We should delete them */ if (!strcmp(bootmode,"factory")) property_set("ro.factorytest", "1"); @@ -810,6 +805,40 @@ static void export_kernel_boot_props(void) property_set("ro.factorytest", "0"); } +static void process_kernel_dt(void) +{ + static const char android_dir[] = "/proc/device-tree/firmware/android"; + + std::string file_name = android::base::StringPrintf("%s/compatible", android_dir); + + std::string dt_file; + android::base::ReadFileToString(file_name, &dt_file); + if (!dt_file.compare("android,firmware")) { + ERROR("firmware/android is not compatible with 'android,firmware'\n"); + return; + } + + std::unique_ptr<DIR, int(*)(DIR*)>dir(opendir(android_dir), closedir); + if (!dir) + return; + + struct dirent *dp; + while ((dp = readdir(dir.get())) != NULL) { + if (dp->d_type != DT_REG || !strcmp(dp->d_name, "compatible")) + continue; + + file_name = android::base::StringPrintf("%s/%s", android_dir, dp->d_name); + + android::base::ReadFileToString(file_name, &dt_file); + std::replace(dt_file.begin(), dt_file.end(), ',', '.'); + + std::string property_name = android::base::StringPrintf("ro.boot.%s", dp->d_name); + if (property_set(property_name.c_str(), dt_file.c_str())) { + ERROR("Could not set property %s to value %s", property_name.c_str(), dt_file.c_str()); + } + } +} + static void process_kernel_cmdline(void) { /* don't expose the raw commandline to nonpriv processes */ @@ -822,11 +851,6 @@ static void process_kernel_cmdline(void) import_kernel_cmdline(0, import_kernel_nv); if (qemu[0]) import_kernel_cmdline(1, import_kernel_nv); - - /* now propogate the info given on command line to internal variables - * used by init as well as the current required properties - */ - export_kernel_boot_props(); } static int property_service_init_action(int nargs, char **args) @@ -1014,10 +1038,17 @@ int main(int argc, char** argv) { klog_init(); property_init(); - get_hardware_name(hardware, &revision); - + process_kernel_dt(); + /* in case one is passing arguments both on the command line and in DT + * Properties set in DT always have priority over the command-line ones + */ process_kernel_cmdline(); + /* now propogate the kernel variables to internal variables + * used by init as well as the current required properties + */ + export_kernel_boot_props(); + selinux_callback cb; cb.func_log = log_callback; selinux_set_callback(SELINUX_CB_LOG, cb); diff --git a/init/ueventd.cpp b/init/ueventd.cpp index d56b91a..5af6e3d 100644 --- a/init/ueventd.cpp +++ b/init/ueventd.cpp @@ -30,28 +30,13 @@ #include "util.h" #include "devices.h" #include "ueventd_parser.h" - -static char hardware[32]; -static unsigned revision = 0; - -static void import_kernel_nv(char *name, int in_qemu) -{ - if (*name != '\0') { - char *value = strchr(name, '='); - if (value != NULL) { - *value++ = 0; - if (!strcmp(name,"androidboot.hardware")) - { - strlcpy(hardware, value, sizeof(hardware)); - } - } - } -} +#include "property_service.h" int ueventd_main(int argc, char **argv) { struct pollfd ufd; int nr; + char hardware[PROP_VALUE_MAX]; char tmp[32]; /* @@ -83,12 +68,7 @@ int ueventd_main(int argc, char **argv) INFO("starting ueventd\n"); - /* Respect hardware passed in through the kernel cmd line. Here we will look - * for androidboot.hardware param in kernel cmdline, and save its value in - * hardware[]. */ - import_kernel_cmdline(0, import_kernel_nv); - - get_hardware_name(hardware, &revision); + property_get("ro.hardware", hardware); ueventd_parse_config_file("/ueventd.rc"); diff --git a/init/util.cpp b/init/util.cpp index c805083..8b238d4 100644 --- a/init/util.cpp +++ b/init/util.cpp @@ -400,39 +400,6 @@ void open_devnull_stdio(void) exit(1); } -void get_hardware_name(char *hardware, unsigned int *revision) { - // Hardware string was provided on kernel command line. - if (hardware[0]) { - return; - } - - FILE* fp = fopen("/proc/cpuinfo", "re"); - if (fp == NULL) { - return; - } - char buf[1024]; - while (fgets(buf, sizeof(buf), fp) != NULL) { - if (strncmp(buf, "Hardware", 8) == 0) { - const char* hw = strstr(buf, ": "); - if (hw) { - hw += 2; - size_t n = 0; - while (*hw) { - if (!isspace(*hw)) { - hardware[n++] = tolower(*hw); - } - hw++; - if (n == 31) break; - } - hardware[n] = 0; - } - } else if (strncmp(buf, "Revision", 8) == 0) { - sscanf(buf, "Revision : %ux", revision); - } - } - fclose(fp); -} - void import_kernel_cmdline(int in_qemu, void (*import_kernel_nv)(char *name, int in_qemu)) { diff --git a/init/util.h b/init/util.h index 77da3ac..e0b3c69 100644 --- a/init/util.h +++ b/init/util.h @@ -42,7 +42,6 @@ void make_link(const char *oldpath, const char *newpath); void remove_link(const char *oldpath, const char *newpath); int wait_for_file(const char *filename, int timeout); void open_devnull_stdio(void); -void get_hardware_name(char *hardware, unsigned int *revision); void import_kernel_cmdline(int in_qemu, void (*import_kernel_nv)(char *name, int in_qemu)); int make_dir(const char *path, mode_t mode); int restorecon(const char *pathname); diff --git a/libpixelflinger/Android.mk b/libpixelflinger/Android.mk index aa614bc..697db25 100644 --- a/libpixelflinger/Android.mk +++ b/libpixelflinger/Android.mk @@ -62,6 +62,8 @@ LOCAL_SRC_FILES_arm := $(PIXELFLINGER_SRC_FILES_arm) LOCAL_SRC_FILES_arm64 := $(PIXELFLINGER_SRC_FILES_arm64) LOCAL_SRC_FILES_mips := $(PIXELFLINGER_SRC_FILES_mips) LOCAL_CFLAGS := $(PIXELFLINGER_CFLAGS) +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include +LOCAL_C_INCLUDES += $(LOCAL_EXPORT_C_INCLUDE_DIRS) LOCAL_SHARED_LIBRARIES := libcutils liblog # Really this should go away entirely or at least not depend on diff --git a/include/pixelflinger/format.h b/libpixelflinger/include/pixelflinger/format.h index 82eeca4..82eeca4 100644 --- a/include/pixelflinger/format.h +++ b/libpixelflinger/include/pixelflinger/format.h diff --git a/include/pixelflinger/pixelflinger.h b/libpixelflinger/include/pixelflinger/pixelflinger.h index 8a2b442..8a2b442 100644 --- a/include/pixelflinger/pixelflinger.h +++ b/libpixelflinger/include/pixelflinger/pixelflinger.h diff --git a/include/private/pixelflinger/ggl_context.h b/libpixelflinger/include/private/pixelflinger/ggl_context.h index d43655c..d43655c 100644 --- a/include/private/pixelflinger/ggl_context.h +++ b/libpixelflinger/include/private/pixelflinger/ggl_context.h diff --git a/include/private/pixelflinger/ggl_fixed.h b/libpixelflinger/include/private/pixelflinger/ggl_fixed.h index 787f620..787f620 100644 --- a/include/private/pixelflinger/ggl_fixed.h +++ b/libpixelflinger/include/private/pixelflinger/ggl_fixed.h diff --git a/libpixelflinger/tests/arch-arm64/assembler/Android.mk b/libpixelflinger/tests/arch-arm64/assembler/Android.mk index 961f323..448d298 100644 --- a/libpixelflinger/tests/arch-arm64/assembler/Android.mk +++ b/libpixelflinger/tests/arch-arm64/assembler/Android.mk @@ -13,7 +13,7 @@ LOCAL_SHARED_LIBRARIES := \ libpixelflinger LOCAL_C_INCLUDES := \ - system/core/libpixelflinger + $(LOCAL_PATH)/../../.. LOCAL_MODULE:= test-pixelflinger-arm64-assembler-test diff --git a/libpixelflinger/tests/arch-arm64/disassembler/Android.mk b/libpixelflinger/tests/arch-arm64/disassembler/Android.mk index 8f62f09..d8f7e69 100644 --- a/libpixelflinger/tests/arch-arm64/disassembler/Android.mk +++ b/libpixelflinger/tests/arch-arm64/disassembler/Android.mk @@ -7,9 +7,6 @@ LOCAL_SRC_FILES:= \ LOCAL_SHARED_LIBRARIES := -LOCAL_C_INCLUDES := \ - system/core/libpixelflinger/codeflinger - LOCAL_MODULE:= test-pixelflinger-arm64-disassembler-test LOCAL_MODULE_TAGS := tests diff --git a/libpixelflinger/tests/codegen/Android.mk b/libpixelflinger/tests/codegen/Android.mk index bc07015..2f9ca2f 100644 --- a/libpixelflinger/tests/codegen/Android.mk +++ b/libpixelflinger/tests/codegen/Android.mk @@ -9,7 +9,7 @@ LOCAL_SHARED_LIBRARIES := \ libpixelflinger LOCAL_C_INCLUDES := \ - system/core/libpixelflinger + $(LOCAL_PATH)/../.. LOCAL_MODULE:= test-opengl-codegen diff --git a/libpixelflinger/tests/gglmul/Android.mk b/libpixelflinger/tests/gglmul/Android.mk index f479fa1..75bd39e 100644 --- a/libpixelflinger/tests/gglmul/Android.mk +++ b/libpixelflinger/tests/gglmul/Android.mk @@ -7,7 +7,7 @@ LOCAL_SRC_FILES:= \ LOCAL_SHARED_LIBRARIES := LOCAL_C_INCLUDES := \ - system/core/libpixelflinger + $(LOCAL_PATH)/../../include LOCAL_MODULE:= test-pixelflinger-gglmul diff --git a/libsparse/sparse.c b/libsparse/sparse.c index baa30cd..65c09e0 100644 --- a/libsparse/sparse.c +++ b/libsparse/sparse.c @@ -101,26 +101,32 @@ unsigned int sparse_count_chunks(struct sparse_file *s) return chunks; } -static void sparse_file_write_block(struct output_file *out, +static int sparse_file_write_block(struct output_file *out, struct backed_block *bb) { + int ret = -EINVAL; + switch (backed_block_type(bb)) { case BACKED_BLOCK_DATA: - write_data_chunk(out, backed_block_len(bb), backed_block_data(bb)); + ret = write_data_chunk(out, backed_block_len(bb), backed_block_data(bb)); break; case BACKED_BLOCK_FILE: - write_file_chunk(out, backed_block_len(bb), - backed_block_filename(bb), backed_block_file_offset(bb)); + ret = write_file_chunk(out, backed_block_len(bb), + backed_block_filename(bb), + backed_block_file_offset(bb)); break; case BACKED_BLOCK_FD: - write_fd_chunk(out, backed_block_len(bb), - backed_block_fd(bb), backed_block_file_offset(bb)); + ret = write_fd_chunk(out, backed_block_len(bb), + backed_block_fd(bb), + backed_block_file_offset(bb)); break; case BACKED_BLOCK_FILL: - write_fill_chunk(out, backed_block_len(bb), - backed_block_fill_val(bb)); + ret = write_fill_chunk(out, backed_block_len(bb), + backed_block_fill_val(bb)); break; } + + return ret; } static int write_all_blocks(struct sparse_file *s, struct output_file *out) @@ -128,6 +134,7 @@ static int write_all_blocks(struct sparse_file *s, struct output_file *out) struct backed_block *bb; unsigned int last_block = 0; int64_t pad; + int ret = 0; for (bb = backed_block_iter_new(s->backed_block_list); bb; bb = backed_block_iter_next(bb)) { @@ -135,7 +142,9 @@ static int write_all_blocks(struct sparse_file *s, struct output_file *out) unsigned int blocks = backed_block_block(bb) - last_block; write_skip_chunk(out, (int64_t)blocks * s->block_size); } - sparse_file_write_block(out, bb); + ret = sparse_file_write_block(out, bb); + if (ret) + return ret; last_block = backed_block_block(bb) + DIV_ROUND_UP(backed_block_len(bb), s->block_size); } @@ -230,6 +239,7 @@ static struct backed_block *move_chunks_up_to_len(struct sparse_file *from, struct backed_block *bb; struct backed_block *start; int64_t file_len = 0; + int ret; /* * overhead is sparse file header, initial skip chunk, split chunk, end @@ -249,7 +259,11 @@ static struct backed_block *move_chunks_up_to_len(struct sparse_file *from, for (bb = start; bb; bb = backed_block_iter_next(bb)) { count = 0; /* will call out_counter_write to update count */ - sparse_file_write_block(out_counter, bb); + ret = sparse_file_write_block(out_counter, bb); + if (ret) { + bb = NULL; + goto out; + } if (file_len + count > len) { /* * If the remaining available size is more than 1/8th of the @@ -260,16 +274,17 @@ static struct backed_block *move_chunks_up_to_len(struct sparse_file *from, backed_block_split(from->backed_block_list, bb, len - file_len); last_bb = bb; } - goto out; + goto move; } file_len += count; last_bb = bb; } -out: +move: backed_block_list_move(from->backed_block_list, to->backed_block_list, start, last_bb); +out: output_file_close(out_counter); return bb; diff --git a/toolbox/Android.mk b/toolbox/Android.mk index b822ea0..959dc22 100644 --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -60,7 +60,6 @@ OUR_TOOLS := \ restorecon \ route \ runcon \ - schedtop \ sendevent \ setprop \ start \ diff --git a/toolbox/schedtop.c b/toolbox/schedtop.c deleted file mode 100644 index 2fccd2e..0000000 --- a/toolbox/schedtop.c +++ /dev/null @@ -1,330 +0,0 @@ -#include <ctype.h> -#include <dirent.h> -#include <fcntl.h> -#include <pwd.h> -#include <signal.h> -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -struct thread_info { - int pid; - int tid; - char name[64]; - unsigned long long exec_time; - unsigned long long delay_time; - unsigned long long run_count; -}; - -struct thread_table { - size_t allocated; - size_t active; - struct thread_info *data; -}; - -enum { - FLAG_BATCH = 1U << 0, - FLAG_HIDE_IDLE = 1U << 1, - FLAG_SHOW_THREADS = 1U << 2, - FLAG_USE_ALTERNATE_SCREEN = 1U << 3, -}; - -static int time_dp = 9; -static int time_div = 1; -#define NS_TO_S_D(ns) \ - (uint32_t)((ns) / 1000000000), time_dp, ((uint32_t)((ns) % 1000000000) / time_div) - -struct thread_table processes; -struct thread_table last_processes; -struct thread_table threads; -struct thread_table last_threads; - -static void grow_table(struct thread_table *table) -{ - size_t size = table->allocated; - struct thread_info *new_table; - if (size < 128) - size = 128; - else - size *= 2; - - new_table = realloc(table->data, size * sizeof(*table->data)); - if (new_table == NULL) { - fprintf(stderr, "out of memory\n"); - exit(1); - } - table->data = new_table; - table->allocated = size; -} - -static struct thread_info *get_item(struct thread_table *table) -{ - if (table->active >= table->allocated) - grow_table(table); - return table->data + table->active; -} - -static void commit_item(struct thread_table *table) -{ - table->active++; -} - -static int read_line(char *line, size_t line_size) -{ - int fd; - int len; - fd = open(line, O_RDONLY); - if(fd == 0) - return -1; - len = read(fd, line, line_size - 1); - close(fd); - if (len <= 0) - return -1; - line[len] = '\0'; - return 0; -} - -static void add_thread(int pid, int tid, struct thread_info *proc_info) -{ - char line[1024]; - char *name, *name_end; - size_t name_len; - struct thread_info *info; - if(tid == 0) - info = get_item(&processes); - else - info = get_item(&threads); - info->pid = pid; - info->tid = tid; - - if(tid) - sprintf(line, "/proc/%d/task/%d/schedstat", pid, tid); - else - sprintf(line, "/proc/%d/schedstat", pid); - if (read_line(line, sizeof(line))) - return; - if(sscanf(line, "%llu %llu %llu", - &info->exec_time, &info->delay_time, &info->run_count) != 3) - return; - if (proc_info) { - proc_info->exec_time += info->exec_time; - proc_info->delay_time += info->delay_time; - proc_info->run_count += info->run_count; - } - - name = NULL; - if (!tid) { - sprintf(line, "/proc/%d/cmdline", pid); - if (read_line(line, sizeof(line)) == 0 && line[0]) { - name = line; - name_len = strlen(name); - } - } - if (!name) { - if (tid) - sprintf(line, "/proc/%d/task/%d/stat", pid, tid); - else - sprintf(line, "/proc/%d/stat", pid); - if (read_line(line, sizeof(line))) - return; - name = strchr(line, '('); - if (name == NULL) - return; - name_end = strchr(name, ')'); - if (name_end == NULL) - return; - name++; - name_len = name_end - name; - } - if (name_len >= sizeof(info->name)) - name_len = sizeof(info->name) - 1; - memcpy(info->name, name, name_len); - info->name[name_len] = '\0'; - if(tid == 0) - commit_item(&processes); - else - commit_item(&threads); -} - -static void add_threads(int pid, struct thread_info *proc_info) -{ - char path[1024]; - DIR *d; - struct dirent *de; - sprintf(path, "/proc/%d/task", pid); - d = opendir(path); - if(d == 0) return; - while((de = readdir(d)) != 0){ - if(isdigit(de->d_name[0])){ - int tid = atoi(de->d_name); - add_thread(pid, tid, proc_info); - } - } - closedir(d); -} - -static void print_threads(int pid, uint32_t flags) -{ - size_t i, j; - for (i = 0; i < last_threads.active; i++) { - int epid = last_threads.data[i].pid; - int tid = last_threads.data[i].tid; - if (epid != pid) - continue; - for (j = 0; j < threads.active; j++) - if (tid == threads.data[j].tid) - break; - if (j == threads.active) - printf(" %5u died\n", tid); - else if (!(flags & FLAG_HIDE_IDLE) || threads.data[j].run_count - last_threads.data[i].run_count) - printf(" %5u %2u.%0*u %2u.%0*u %5llu %5u.%0*u %5u.%0*u %7llu %s\n", tid, - NS_TO_S_D(threads.data[j].exec_time - last_threads.data[i].exec_time), - NS_TO_S_D(threads.data[j].delay_time - last_threads.data[i].delay_time), - threads.data[j].run_count - last_threads.data[i].run_count, - NS_TO_S_D(threads.data[j].exec_time), NS_TO_S_D(threads.data[j].delay_time), - threads.data[j].run_count, threads.data[j].name); - } -} - -static void update_table(DIR *d, uint32_t flags) -{ - size_t i, j; - struct dirent *de; - - rewinddir(d); - while((de = readdir(d)) != 0){ - if(isdigit(de->d_name[0])){ - int pid = atoi(de->d_name); - struct thread_info *proc_info; - add_thread(pid, 0, NULL); - proc_info = &processes.data[processes.active - 1]; - proc_info->exec_time = 0; - proc_info->delay_time = 0; - proc_info->run_count = 0; - add_threads(pid, proc_info); - } - } - if (!(flags & FLAG_BATCH)) - printf("\e[H\e[0J"); - printf("Processes: %zu, Threads %zu\n", processes.active, threads.active); - switch (time_dp) { - case 3: - printf(" TID --- SINCE LAST ---- ---------- TOTAL ----------\n"); - printf(" PID EXEC_T DELAY SCHED EXEC_TIME DELAY_TIM SCHED NAME\n"); - break; - case 6: - printf(" TID ------ SINCE LAST ------- ------------ TOTAL -----------\n"); - printf(" PID EXEC_TIME DELAY_TIM SCHED EXEC_TIME DELAY_TIME SCHED NAME\n"); - break; - default: - printf(" TID -------- SINCE LAST -------- ------------- TOTAL -------------\n"); - printf(" PID EXEC_TIME DELAY_TIME SCHED EXEC_TIME DELAY_TIME SCHED NAME\n"); - break; - } - for (i = 0; i < last_processes.active; i++) { - int pid = last_processes.data[i].pid; - for (j = 0; j < processes.active; j++) - if (pid == processes.data[j].pid) - break; - if (j == processes.active) - printf("%5u died\n", pid); - else if (!(flags & FLAG_HIDE_IDLE) || processes.data[j].run_count - last_processes.data[i].run_count) { - printf("%5u %2u.%0*u %2u.%0*u %5llu %5u.%0*u %5u.%0*u %7llu %s\n", pid, - NS_TO_S_D(processes.data[j].exec_time - last_processes.data[i].exec_time), - NS_TO_S_D(processes.data[j].delay_time - last_processes.data[i].delay_time), - processes.data[j].run_count - last_processes.data[i].run_count, - NS_TO_S_D(processes.data[j].exec_time), NS_TO_S_D(processes.data[j].delay_time), - processes.data[j].run_count, processes.data[j].name); - if (flags & FLAG_SHOW_THREADS) - print_threads(pid, flags); - } - } - - { - struct thread_table tmp; - tmp = last_processes; - last_processes = processes; - processes = tmp; - processes.active = 0; - tmp = last_threads; - last_threads = threads; - threads = tmp; - threads.active = 0; - } -} - -void -sig_abort(int signum) -{ - printf("\e[?47l"); - exit(0); -} - - -int schedtop_main(int argc, char **argv) -{ - int c; - DIR *d; - uint32_t flags = 0; - int delay = 3000000; - float delay_f; - - while(1) { - c = getopt(argc, argv, "d:ibtamun"); - if (c == EOF) - break; - switch (c) { - case 'd': - delay_f = atof(optarg); - delay = delay_f * 1000000; - break; - case 'b': - flags |= FLAG_BATCH; - break; - case 'i': - flags |= FLAG_HIDE_IDLE; - break; - case 't': - flags |= FLAG_SHOW_THREADS; - break; - case 'a': - flags |= FLAG_USE_ALTERNATE_SCREEN; - break; - case 'm': - time_dp = 3; - time_div = 1000000; - break; - case 'u': - time_dp = 6; - time_div = 1000; - break; - case 'n': - time_dp = 9; - time_div = 1; - break; - } - } - - d = opendir("/proc"); - if(d == 0) return -1; - - if (!(flags & FLAG_BATCH)) { - if(flags & FLAG_USE_ALTERNATE_SCREEN) { - signal(SIGINT, sig_abort); - signal(SIGPIPE, sig_abort); - signal(SIGTERM, sig_abort); - printf("\e7\e[?47h"); - } - printf("\e[2J"); - } - while (1) { - update_table(d, flags); - usleep(delay); - } - closedir(d); - return 0; -} |