summaryrefslogtreecommitdiffstats
path: root/minadbd
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--minadbd.old/Android.mk30
-rw-r--r--minadbd.old/README.txt39
-rw-r--r--minadbd.old/adb.c (renamed from minadbd/adb.c)0
-rw-r--r--minadbd.old/adb.h (renamed from minadbd/adb.h)0
-rw-r--r--minadbd.old/fdevent.c (renamed from minadbd/fdevent.c)0
-rw-r--r--minadbd.old/fdevent.h (renamed from minadbd/fdevent.h)0
-rw-r--r--minadbd.old/fuse_adb_provider.c (renamed from minadbd/fuse_adb_provider.c)0
-rw-r--r--minadbd.old/fuse_adb_provider.h22
-rw-r--r--minadbd.old/mutex_list.h (renamed from minadbd/mutex_list.h)0
-rw-r--r--minadbd.old/services.c (renamed from minadbd/services.c)0
-rw-r--r--minadbd.old/sockets.c (renamed from minadbd/sockets.c)0
-rw-r--r--minadbd.old/sysdeps.h (renamed from minadbd/sysdeps.h)0
-rw-r--r--minadbd.old/transport.c (renamed from minadbd/transport.c)0
-rw-r--r--minadbd.old/transport.h (renamed from minadbd/transport.h)0
-rw-r--r--minadbd.old/transport_usb.c (renamed from minadbd/transport_usb.c)0
-rw-r--r--minadbd.old/usb_linux_client.c (renamed from minadbd/usb_linux_client.c)0
-rw-r--r--minadbd.old/utils.c (renamed from minadbd/utils.c)0
-rw-r--r--minadbd.old/utils.h (renamed from minadbd/utils.h)0
-rw-r--r--minadbd/Android.mk48
-rw-r--r--minadbd/README.txt37
-rw-r--r--minadbd/adb_main.cpp49
-rw-r--r--minadbd/fuse_adb_provider.cpp61
-rw-r--r--minadbd/fuse_adb_provider.h10
-rw-r--r--minadbd/fuse_adb_provider_test.cpp88
-rw-r--r--minadbd/services.cpp106
25 files changed, 436 insertions, 54 deletions
diff --git a/minadbd.old/Android.mk b/minadbd.old/Android.mk
new file mode 100644
index 000000000..19c8b6047
--- /dev/null
+++ b/minadbd.old/Android.mk
@@ -0,0 +1,30 @@
+# Copyright 2005 The Android Open Source Project
+#
+# Android.mk for adb
+#
+
+LOCAL_PATH:= $(call my-dir)
+
+# minadbd library
+# =========================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ adb.c \
+ fdevent.c \
+ fuse_adb_provider.c \
+ transport.c \
+ transport_usb.c \
+ sockets.c \
+ services.c \
+ usb_linux_client.c \
+ utils.c
+
+LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter
+LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE := libminadbd
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../
+LOCAL_SHARED_LIBRARIES := libfusesideload libcutils libc
+include $(BUILD_SHARED_LIBRARY)
diff --git a/minadbd.old/README.txt b/minadbd.old/README.txt
new file mode 100644
index 000000000..c9df484c3
--- /dev/null
+++ b/minadbd.old/README.txt
@@ -0,0 +1,39 @@
+The contents of this directory are copied from system/core/adb, with
+the following changes:
+
+adb.c
+ - much support for host mode and non-linux OS's stripped out; this
+ version only runs as adbd on the device.
+ - always setuid/setgid's itself to the shell user
+ - only uses USB transport
+ - references to JDWP removed
+ - main() removed
+ - all ADB_HOST and win32 code removed
+ - removed listeners, logging code, background server (for host)
+
+adb.h
+ - minor changes to match adb.c changes
+
+sockets.c
+ - references to JDWP removed
+ - ADB_HOST code removed
+
+services.c
+ - all services except echo_service (which is commented out) removed
+ - all host mode support removed
+ - sideload_service() added; this is the only service supported. It
+ receives a single blob of data, writes it to a fixed filename, and
+ makes the process exit.
+
+Android.mk
+ - only builds in adbd mode; builds as static library instead of a
+ standalone executable.
+
+sysdeps.h
+ - changes adb_creat() to use O_NOFOLLOW
+
+transport.c
+ - removed ADB_HOST code
+
+transport_usb.c
+ - removed ADB_HOST code
diff --git a/minadbd/adb.c b/minadbd.old/adb.c
index c35e8300b..c35e8300b 100644
--- a/minadbd/adb.c
+++ b/minadbd.old/adb.c
diff --git a/minadbd/adb.h b/minadbd.old/adb.h
index 08ee989d6..08ee989d6 100644
--- a/minadbd/adb.h
+++ b/minadbd.old/adb.h
diff --git a/minadbd/fdevent.c b/minadbd.old/fdevent.c
index 5c374a71b..5c374a71b 100644
--- a/minadbd/fdevent.c
+++ b/minadbd.old/fdevent.c
diff --git a/minadbd/fdevent.h b/minadbd.old/fdevent.h
index a0ebe2a7e..a0ebe2a7e 100644
--- a/minadbd/fdevent.h
+++ b/minadbd.old/fdevent.h
diff --git a/minadbd/fuse_adb_provider.c b/minadbd.old/fuse_adb_provider.c
index f80533a8c..f80533a8c 100644
--- a/minadbd/fuse_adb_provider.c
+++ b/minadbd.old/fuse_adb_provider.c
diff --git a/minadbd.old/fuse_adb_provider.h b/minadbd.old/fuse_adb_provider.h
new file mode 100644
index 000000000..0eb1f79d1
--- /dev/null
+++ b/minadbd.old/fuse_adb_provider.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2014 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 __FUSE_ADB_PROVIDER_H
+#define __FUSE_ADB_PROVIDER_H
+
+int run_adb_fuse(int sfd, uint64_t file_size, uint32_t block_size);
+
+#endif
diff --git a/minadbd/mutex_list.h b/minadbd.old/mutex_list.h
index 652dd7341..652dd7341 100644
--- a/minadbd/mutex_list.h
+++ b/minadbd.old/mutex_list.h
diff --git a/minadbd/services.c b/minadbd.old/services.c
index 218b84a38..218b84a38 100644
--- a/minadbd/services.c
+++ b/minadbd.old/services.c
diff --git a/minadbd/sockets.c b/minadbd.old/sockets.c
index 817410d13..817410d13 100644
--- a/minadbd/sockets.c
+++ b/minadbd.old/sockets.c
diff --git a/minadbd/sysdeps.h b/minadbd.old/sysdeps.h
index 800ddb753..800ddb753 100644
--- a/minadbd/sysdeps.h
+++ b/minadbd.old/sysdeps.h
diff --git a/minadbd/transport.c b/minadbd.old/transport.c
index 92679f518..92679f518 100644
--- a/minadbd/transport.c
+++ b/minadbd.old/transport.c
diff --git a/minadbd/transport.h b/minadbd.old/transport.h
index 992e05285..992e05285 100644
--- a/minadbd/transport.h
+++ b/minadbd.old/transport.h
diff --git a/minadbd/transport_usb.c b/minadbd.old/transport_usb.c
index 91cbf6151..91cbf6151 100644
--- a/minadbd/transport_usb.c
+++ b/minadbd.old/transport_usb.c
diff --git a/minadbd/usb_linux_client.c b/minadbd.old/usb_linux_client.c
index ec32bcf91..ec32bcf91 100644
--- a/minadbd/usb_linux_client.c
+++ b/minadbd.old/usb_linux_client.c
diff --git a/minadbd/utils.c b/minadbd.old/utils.c
index 91518bab6..91518bab6 100644
--- a/minadbd/utils.c
+++ b/minadbd.old/utils.c
diff --git a/minadbd/utils.h b/minadbd.old/utils.h
index f70ecd24d..f70ecd24d 100644
--- a/minadbd/utils.h
+++ b/minadbd.old/utils.h
diff --git a/minadbd/Android.mk b/minadbd/Android.mk
index 19c8b6047..36e14a51e 100644
--- a/minadbd/Android.mk
+++ b/minadbd/Android.mk
@@ -1,30 +1,38 @@
# Copyright 2005 The Android Open Source Project
-#
-# Android.mk for adb
-#
LOCAL_PATH:= $(call my-dir)
-# minadbd library
-# =========================================================
+minadbd_cflags := \
+ -Wall -Werror \
+ -Wno-unused-parameter \
+ -Wno-missing-field-initializers \
+ -DADB_HOST=0 \
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
- adb.c \
- fdevent.c \
- fuse_adb_provider.c \
- transport.c \
- transport_usb.c \
- sockets.c \
- services.c \
- usb_linux_client.c \
- utils.c
-
-LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter
-LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
-LOCAL_MODULE_TAGS := eng
+ adb_main.cpp \
+ fuse_adb_provider.cpp \
+ services.cpp \
+ ../fuse_sideload.c
+
LOCAL_MODULE := libminadbd
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../
-LOCAL_SHARED_LIBRARIES := libfusesideload libcutils libc
+LOCAL_CFLAGS := $(minadbd_cflags)
+LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. system/core/adb
+LOCAL_WHOLE_STATIC_LIBRARIES := libadbd
+LOCAL_SHARED_LIBRARIES := libbase liblog libmincrypttwrp libcutils libc
+
include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_CLANG := true
+LOCAL_MODULE := minadbd_test
+LOCAL_SRC_FILES := fuse_adb_provider_test.cpp
+LOCAL_CFLAGS := $(minadbd_cflags)
+LOCAL_C_INCLUDES := $(LOCAL_PATH) system/core/adb
+LOCAL_STATIC_LIBRARIES := libminadbd
+LOCAL_SHARED_LIBRARIES := liblog libbase libcutils
+
+include $(BUILD_NATIVE_TEST)
diff --git a/minadbd/README.txt b/minadbd/README.txt
index c9df484c3..e69dc87c6 100644
--- a/minadbd/README.txt
+++ b/minadbd/README.txt
@@ -1,39 +1,8 @@
-The contents of this directory are copied from system/core/adb, with
-the following changes:
+minadbd is now mostly built from libadbd. The fuse features are unique to
+minadbd, and services.c has been modified as follows:
-adb.c
- - much support for host mode and non-linux OS's stripped out; this
- version only runs as adbd on the device.
- - always setuid/setgid's itself to the shell user
- - only uses USB transport
- - references to JDWP removed
- - main() removed
- - all ADB_HOST and win32 code removed
- - removed listeners, logging code, background server (for host)
-
-adb.h
- - minor changes to match adb.c changes
-
-sockets.c
- - references to JDWP removed
- - ADB_HOST code removed
-
-services.c
- - all services except echo_service (which is commented out) removed
+ - all services removed
- all host mode support removed
- sideload_service() added; this is the only service supported. It
receives a single blob of data, writes it to a fixed filename, and
makes the process exit.
-
-Android.mk
- - only builds in adbd mode; builds as static library instead of a
- standalone executable.
-
-sysdeps.h
- - changes adb_creat() to use O_NOFOLLOW
-
-transport.c
- - removed ADB_HOST code
-
-transport_usb.c
- - removed ADB_HOST code
diff --git a/minadbd/adb_main.cpp b/minadbd/adb_main.cpp
new file mode 100644
index 000000000..7fae99a9a
--- /dev/null
+++ b/minadbd/adb_main.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define TRACE_TAG TRACE_ADB
+
+#include "sysdeps.h"
+
+#include "adb.h"
+#include "adb_auth.h"
+#include "transport.h"
+
+int adb_main(int is_daemon, int server_port)
+{
+ atexit(usb_cleanup);
+
+ adb_device_banner = "sideload";
+
+ // No SIGCHLD. Let the service subproc handle its children.
+ signal(SIGPIPE, SIG_IGN);
+
+ // We can't require authentication for sideloading. http://b/22025550.
+ auth_required = false;
+
+ init_transport_registration();
+ usb_init();
+
+ D("Event loop starting\n");
+ fdevent_loop();
+
+ return 0;
+}
diff --git a/minadbd/fuse_adb_provider.cpp b/minadbd/fuse_adb_provider.cpp
new file mode 100644
index 000000000..d71807dfb
--- /dev/null
+++ b/minadbd/fuse_adb_provider.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "sysdeps.h"
+
+#include "adb.h"
+#include "adb_io.h"
+#include "fuse_adb_provider.h"
+#include "fuse_sideload.h"
+
+int read_block_adb(void* data, uint32_t block, uint8_t* buffer, uint32_t fetch_size) {
+ adb_data* ad = reinterpret_cast<adb_data*>(data);
+
+ if (!WriteFdFmt(ad->sfd, "%08u", block)) {
+ fprintf(stderr, "failed to write to adb host: %s\n", strerror(errno));
+ return -EIO;
+ }
+
+ if (!ReadFdExactly(ad->sfd, buffer, fetch_size)) {
+ fprintf(stderr, "failed to read from adb host: %s\n", strerror(errno));
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static void close_adb(void* data) {
+ adb_data* ad = reinterpret_cast<adb_data*>(data);
+ WriteFdExactly(ad->sfd, "DONEDONE");
+}
+
+int run_adb_fuse(int sfd, uint64_t file_size, uint32_t block_size) {
+ adb_data ad;
+ ad.sfd = sfd;
+ ad.file_size = file_size;
+ ad.block_size = block_size;
+
+ provider_vtab vtab;
+ vtab.read_block = read_block_adb;
+ vtab.close = close_adb;
+
+ return run_fuse_sideload(&vtab, &ad, file_size, block_size);
+}
diff --git a/minadbd/fuse_adb_provider.h b/minadbd/fuse_adb_provider.h
index 0eb1f79d1..9941709b9 100644
--- a/minadbd/fuse_adb_provider.h
+++ b/minadbd/fuse_adb_provider.h
@@ -17,6 +17,16 @@
#ifndef __FUSE_ADB_PROVIDER_H
#define __FUSE_ADB_PROVIDER_H
+#include <stdint.h>
+
+struct adb_data {
+ int sfd; // file descriptor for the adb channel
+
+ uint64_t file_size;
+ uint32_t block_size;
+};
+
+int read_block_adb(void* cookie, uint32_t block, uint8_t* buffer, uint32_t fetch_size);
int run_adb_fuse(int sfd, uint64_t file_size, uint32_t block_size);
#endif
diff --git a/minadbd/fuse_adb_provider_test.cpp b/minadbd/fuse_adb_provider_test.cpp
new file mode 100644
index 000000000..0f2e881c7
--- /dev/null
+++ b/minadbd/fuse_adb_provider_test.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "fuse_adb_provider.h"
+
+#include <gtest/gtest.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+
+#include <string>
+
+#include "adb_io.h"
+
+TEST(fuse_adb_provider, read_block_adb) {
+ adb_data data = {};
+ int sockets[2];
+
+ ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sockets));
+ data.sfd = sockets[0];
+
+ int host_socket = sockets[1];
+ fcntl(host_socket, F_SETFL, O_NONBLOCK);
+
+ const char expected_data[] = "foobar";
+ char block_data[sizeof(expected_data)] = {};
+
+ // If we write the result of read_block_adb's request before the request is
+ // actually made we can avoid needing an extra thread for this test.
+ ASSERT_TRUE(WriteFdExactly(host_socket, expected_data,
+ strlen(expected_data)));
+
+ uint32_t block = 1234U;
+ const char expected_block[] = "00001234";
+ ASSERT_EQ(0, read_block_adb(reinterpret_cast<void*>(&data), block,
+ reinterpret_cast<uint8_t*>(block_data),
+ sizeof(expected_data) - 1));
+
+ // Check that read_block_adb requested the right block.
+ char block_req[sizeof(expected_block)] = {};
+ ASSERT_TRUE(ReadFdExactly(host_socket, block_req, 8));
+ ASSERT_EQ(0, block_req[8]);
+ ASSERT_EQ(8U, strlen(block_req));
+ ASSERT_STREQ(expected_block, block_req);
+
+ // Check that read_block_adb returned the right data.
+ ASSERT_EQ(0, block_req[8]);
+ ASSERT_STREQ(expected_data, block_data);
+
+ // Check that nothing else was written to the socket.
+ char tmp;
+ errno = 0;
+ ASSERT_EQ(-1, read(host_socket, &tmp, 1));
+ ASSERT_EQ(EWOULDBLOCK, errno);
+
+ close(sockets[0]);
+ close(sockets[1]);
+}
+
+TEST(fuse_adb_provider, read_block_adb_fail_write) {
+ adb_data data = {};
+ int sockets[2];
+
+ ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sockets));
+ data.sfd = sockets[0];
+
+ ASSERT_EQ(0, close(sockets[1]));
+
+ char buf[1];
+ ASSERT_EQ(-EIO, read_block_adb(reinterpret_cast<void*>(&data), 0,
+ reinterpret_cast<uint8_t*>(buf), 1));
+
+ close(sockets[0]);
+}
diff --git a/minadbd/services.cpp b/minadbd/services.cpp
new file mode 100644
index 000000000..dd1fd7c4b
--- /dev/null
+++ b/minadbd/services.cpp
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "sysdeps.h"
+
+#define TRACE_TAG TRACE_SERVICES
+#include "adb.h"
+#include "fdevent.h"
+#include "fuse_adb_provider.h"
+
+typedef struct stinfo stinfo;
+
+struct stinfo {
+ void (*func)(int fd, void *cookie);
+ int fd;
+ void *cookie;
+};
+
+void* service_bootstrap_func(void* x) {
+ stinfo* sti = reinterpret_cast<stinfo*>(x);
+ sti->func(sti->fd, sti->cookie);
+ free(sti);
+ return 0;
+}
+
+static void sideload_host_service(int sfd, void* data) {
+ const char* args = reinterpret_cast<const char*>(data);
+ int file_size;
+ int block_size;
+ if (sscanf(args, "%d:%d", &file_size, &block_size) != 2) {
+ printf("bad sideload-host arguments: %s\n", args);
+ exit(1);
+ }
+
+ printf("sideload-host file size %d block size %d\n", file_size, block_size);
+
+ int result = run_adb_fuse(sfd, file_size, block_size);
+
+ printf("sideload_host finished\n");
+ sleep(1);
+ exit(result == 0 ? 0 : 1);
+}
+
+static int create_service_thread(void (*func)(int, void *), void *cookie)
+{
+ int s[2];
+ if(adb_socketpair(s)) {
+ printf("cannot create service socket pair\n");
+ return -1;
+ }
+
+ stinfo* sti = reinterpret_cast<stinfo*>(malloc(sizeof(stinfo)));
+ if(sti == 0) fatal("cannot allocate stinfo");
+ sti->func = func;
+ sti->cookie = cookie;
+ sti->fd = s[1];
+
+ adb_thread_t t;
+ if (adb_thread_create( &t, service_bootstrap_func, sti)){
+ free(sti);
+ adb_close(s[0]);
+ adb_close(s[1]);
+ printf("cannot create service thread\n");
+ return -1;
+ }
+
+ D("service thread started, %d:%d\n",s[0], s[1]);
+ return s[0];
+}
+
+int service_to_fd(const char* name) {
+ int ret = -1;
+
+ if (!strncmp(name, "sideload:", 9)) {
+ // this exit status causes recovery to print a special error
+ // message saying to use a newer adb (that supports
+ // sideload-host).
+ exit(3);
+ } else if (!strncmp(name, "sideload-host:", 14)) {
+ ret = create_service_thread(sideload_host_service, (void*)(name + 14));
+ }
+ if (ret >= 0) {
+ close_on_exec(ret);
+ }
+ return ret;
+}