265 lines
9.0 KiB
Diff
265 lines
9.0 KiB
Diff
|
[PATCH] Fix adbd for non-Ubuntu systems
|
||
|
|
||
|
Remove glib/dbus dependencies and partially restore services.c to be
|
||
|
closer to the original source code in order to run on systems without
|
||
|
sudo.
|
||
|
|
||
|
Signed-off-by: Gary Bisson <gary.bisson@boundarydevices.com>
|
||
|
---
|
||
|
core/adbd/adb.c | 1 -
|
||
|
core/adbd/services.c | 160 ++++-------------------------------------------
|
||
|
debian/makefiles/adbd.mk | 4 +-
|
||
|
3 files changed, 14 insertions(+), 151 deletions(-)
|
||
|
|
||
|
diff --git a/core/adbd/adb.c b/core/adbd/adb.c
|
||
|
index d90e6b8..7fe6445 100644
|
||
|
--- a/core/adbd/adb.c
|
||
|
+++ b/core/adbd/adb.c
|
||
|
@@ -1165,7 +1165,6 @@ void build_local_name(char* target_str, size_t target_size, int server_port)
|
||
|
|
||
|
#if !ADB_HOST
|
||
|
static int should_drop_privileges() {
|
||
|
- return 1;
|
||
|
#ifndef ALLOW_ADBD_ROOT
|
||
|
return 1;
|
||
|
#else /* ALLOW_ADBD_ROOT */
|
||
|
diff --git a/core/adbd/services.c b/core/adbd/services.c
|
||
|
index 05bd0d0..5adcefe 100644
|
||
|
--- a/core/adbd/services.c
|
||
|
+++ b/core/adbd/services.c
|
||
|
@@ -20,15 +20,6 @@
|
||
|
#include <string.h>
|
||
|
#include <errno.h>
|
||
|
#include <pwd.h>
|
||
|
-#include <glib.h>
|
||
|
-#include <gio/gio.h>
|
||
|
-
|
||
|
-#define UNITY_SERVICE "com.canonical.UnityGreeter"
|
||
|
-#define GREETER_OBJ "/"
|
||
|
-#define GREETER_INTERFACE "com.canonical.UnityGreeter"
|
||
|
-#define PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
|
||
|
-#define ACTIVE_PROPERTY "IsActive"
|
||
|
-#define UNLOCK_PATH "/userdata/.adb_onlock"
|
||
|
|
||
|
#include "sysdeps.h"
|
||
|
|
||
|
@@ -268,11 +259,11 @@ static int create_service_thread(void (*func)(int, void *), void *cookie)
|
||
|
}
|
||
|
|
||
|
#if !ADB_HOST
|
||
|
-static int create_subprocess(const char *cmd, const char *arg0, const char *arg1, const char *arg2, const char *arg3, const char *arg4, pid_t *pid)
|
||
|
+static int create_subprocess(const char *cmd, const char *arg0, const char *arg1, pid_t *pid)
|
||
|
{
|
||
|
#ifdef HAVE_WIN32_PROC
|
||
|
- D("create_subprocess(cmd=%s, arg0=%s, arg1=%s, arg2=%s, arg3=%, arg4=%ss)\n", cmd, arg0, arg1, arg2, arg3, arg4);
|
||
|
- fprintf(stderr, "error: create_subprocess not implemented on Win32 (%s %s %s %s %s %s)\n", cmd, arg0, arg1, arg2, arg3, arg4);
|
||
|
+ D("create_subprocess(cmd=%s, arg0=%s, arg1=%s)\n", cmd, arg0, arg1);
|
||
|
+ fprintf(stderr, "error: create_subprocess not implemented on Win32 (%s %s %s)\n", cmd, arg0, arg1);
|
||
|
return -1;
|
||
|
#else /* !HAVE_WIN32_PROC */
|
||
|
char *devname;
|
||
|
@@ -327,7 +318,7 @@ static int create_subprocess(const char *cmd, const char *arg0, const char *arg1
|
||
|
} else {
|
||
|
D("adb: unable to open %s\n", text);
|
||
|
}
|
||
|
- execl(cmd, cmd, arg0, arg1, arg2, arg3, arg4, NULL);
|
||
|
+ execl(cmd, cmd, arg0, arg1, NULL);
|
||
|
fprintf(stderr, "- exec '%s' failed: %s (%d) -\n",
|
||
|
cmd, strerror(errno), errno);
|
||
|
exit(-1);
|
||
|
@@ -342,7 +333,7 @@ static int create_subprocess(const char *cmd, const char *arg0, const char *arg1
|
||
|
}
|
||
|
#endif /* !ABD_HOST */
|
||
|
|
||
|
-#if ADB_HOST
|
||
|
+#if ADB_HOST || ADBD_NON_ANDROID
|
||
|
#define SHELL_COMMAND "/bin/sh"
|
||
|
#else
|
||
|
#define SHELL_COMMAND "/system/bin/sh"
|
||
|
@@ -380,139 +371,16 @@ static void subproc_waiter_service(int fd, void *cookie)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-int is_phone_locked() {
|
||
|
- GError *error = NULL;
|
||
|
- GVariant *variant = NULL;
|
||
|
- GDBusConnection *connection = NULL;
|
||
|
-
|
||
|
- if (g_file_test(UNLOCK_PATH, G_FILE_TEST_EXISTS)) {
|
||
|
- D("unlock path present.");
|
||
|
- return 0;
|
||
|
- }
|
||
|
-
|
||
|
- // check if the environment variable is present, if not we grab it from
|
||
|
- // the phablet user
|
||
|
- if (g_getenv("DBUS_SESSION_BUS_ADDRESS") == NULL) {
|
||
|
- D("DBUS_SESSION_BUS_ADDRESS missing.\n");
|
||
|
- struct passwd *pw = getpwuid(AID_SHELL);
|
||
|
- char user_id[15];
|
||
|
- gchar *path = NULL;
|
||
|
- gchar *contents = NULL;
|
||
|
- gchar *session_path = NULL;
|
||
|
-
|
||
|
- snprintf(user_id, sizeof user_id, "%d", pw->pw_uid);
|
||
|
-
|
||
|
- path = g_build_filename("/run", "user", user_id, "dbus-session", NULL);
|
||
|
-
|
||
|
- g_file_get_contents(path, &contents, NULL, &error);
|
||
|
- session_path = g_strstrip(g_strsplit(contents, "DBUS_SESSION_BUS_ADDRESS=", -1)[1]);
|
||
|
- D("Session bus is %s\n", session_path);
|
||
|
-
|
||
|
- // path is not longer used
|
||
|
- g_free(path);
|
||
|
-
|
||
|
- if (error != NULL) {
|
||
|
- g_clear_error(&error);
|
||
|
- D("Couldn't set session bus\n");
|
||
|
- return 1;
|
||
|
- }
|
||
|
-
|
||
|
- g_setenv("DBUS_SESSION_BUS_ADDRESS", session_path, TRUE);
|
||
|
- g_free(contents);
|
||
|
- }
|
||
|
-
|
||
|
- // set the uid to be able to connect to the phablet user session bus
|
||
|
- setuid(AID_SHELL);
|
||
|
- connection = g_dbus_connection_new_for_address_sync(g_getenv("DBUS_SESSION_BUS_ADDRESS"),
|
||
|
- G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION,
|
||
|
- NULL,
|
||
|
- NULL,
|
||
|
- &error);
|
||
|
- if (connection == NULL) {
|
||
|
- D("session bus not available: %s", error->message);
|
||
|
- g_error_free (error);
|
||
|
- return 1;
|
||
|
- }
|
||
|
-
|
||
|
- variant = g_dbus_connection_call_sync(connection,
|
||
|
- UNITY_SERVICE,
|
||
|
- GREETER_OBJ,
|
||
|
- PROPERTIES_INTERFACE,
|
||
|
- "Get",
|
||
|
- g_variant_new("(ss)", GREETER_INTERFACE, ACTIVE_PROPERTY),
|
||
|
- g_variant_type_new("(v)"),
|
||
|
- G_DBUS_CALL_FLAGS_NONE,
|
||
|
- -1,
|
||
|
- NULL,
|
||
|
- &error);
|
||
|
-
|
||
|
- if (error != NULL) {
|
||
|
- D("Could not get property: %s", error->message);
|
||
|
- g_object_unref(connection);
|
||
|
- g_error_free(error);
|
||
|
- return 1;
|
||
|
- }
|
||
|
-
|
||
|
- if (variant == NULL) {
|
||
|
- D("Failed to get property '%s': %s", "IsActive", error->message);
|
||
|
- g_object_unref(connection);
|
||
|
- g_error_free(error);
|
||
|
- return 1;
|
||
|
- }
|
||
|
-
|
||
|
- variant = g_variant_get_variant(g_variant_get_child_value(variant, 0));
|
||
|
-
|
||
|
- int active = 1;
|
||
|
- if (!g_variant_get_boolean(variant)) {
|
||
|
- active = 0;
|
||
|
- }
|
||
|
-
|
||
|
- // get back to be root and return the value
|
||
|
- g_object_unref(connection);
|
||
|
- g_variant_unref(variant);
|
||
|
- setuid(0);
|
||
|
- return active;
|
||
|
-}
|
||
|
-
|
||
|
static int create_subproc_thread(const char *name)
|
||
|
{
|
||
|
- if (is_phone_locked() ) {
|
||
|
- fprintf(stderr, "device is locked\n");
|
||
|
- return -1;
|
||
|
- }
|
||
|
-
|
||
|
stinfo *sti;
|
||
|
adb_thread_t t;
|
||
|
int ret_fd;
|
||
|
pid_t pid;
|
||
|
-
|
||
|
- struct passwd *user = getpwuid(getuid());
|
||
|
- char *shell;
|
||
|
- char *shellopts = "-c";
|
||
|
- char *home;
|
||
|
- char *sudo = "/usr/bin/sudo";
|
||
|
- char useropt[256] = "-u";
|
||
|
-
|
||
|
- if (user->pw_name)
|
||
|
- strcat(useropt, user->pw_name);
|
||
|
-
|
||
|
- if (user && user->pw_shell) {
|
||
|
- shell = user->pw_shell;
|
||
|
- shellopts = "-cl";
|
||
|
- } else {
|
||
|
- shell = SHELL_COMMAND;
|
||
|
- }
|
||
|
-
|
||
|
- if (user->pw_dir)
|
||
|
- home = user->pw_dir;
|
||
|
- if(chdir(home) < 0 )
|
||
|
- return 1;
|
||
|
-
|
||
|
if(name) {
|
||
|
- ret_fd = create_subprocess(sudo, useropt, "-i", shell, shellopts, name, &pid);
|
||
|
+ ret_fd = create_subprocess(SHELL_COMMAND, "-c", name, &pid);
|
||
|
} else {
|
||
|
- shellopts = "-l";
|
||
|
- ret_fd = create_subprocess(sudo, useropt, "-i", shell, shellopts, 0, &pid);
|
||
|
+ ret_fd = create_subprocess(SHELL_COMMAND, "-", 0, &pid);
|
||
|
}
|
||
|
D("create_subprocess() ret_fd=%d pid=%d\n", ret_fd, pid);
|
||
|
|
||
|
@@ -585,17 +453,13 @@ int service_to_fd(const char *name)
|
||
|
} else if (!strncmp(name, "log:", 4)) {
|
||
|
ret = create_service_thread(log_service, get_log_file_path(name + 4));
|
||
|
} else if(!HOST && !strncmp(name, "shell:", 6)) {
|
||
|
- if (!is_phone_locked() ) {
|
||
|
- if(name[6]) {
|
||
|
- ret = create_subproc_thread(name + 6);
|
||
|
- } else {
|
||
|
- ret = create_subproc_thread(0);
|
||
|
- }
|
||
|
+ if(name[6]) {
|
||
|
+ ret = create_subproc_thread(name + 6);
|
||
|
+ } else {
|
||
|
+ ret = create_subproc_thread(0);
|
||
|
}
|
||
|
} else if(!strncmp(name, "sync:", 5)) {
|
||
|
- if (!is_phone_locked() ) {
|
||
|
- ret = create_service_thread(file_sync_service, NULL);
|
||
|
- }
|
||
|
+ ret = create_service_thread(file_sync_service, NULL);
|
||
|
} else if(!strncmp(name, "remount:", 8)) {
|
||
|
ret = create_service_thread(remount_service, NULL);
|
||
|
} else if(!strncmp(name, "reboot:", 7)) {
|
||
|
diff --git a/debian/makefiles/adbd.mk b/debian/makefiles/adbd.mk
|
||
|
index 49dab8c..22c1816 100644
|
||
|
--- a/debian/makefiles/adbd.mk
|
||
|
+++ b/debian/makefiles/adbd.mk
|
||
|
@@ -40,11 +40,11 @@ CPPFLAGS+= -O2 -g -Wall -Wno-unused-parameter
|
||
|
CPPFLAGS+= -DADB_HOST=0 -DHAVE_FORKEXEC=1 -D_XOPEN_SOURCE -D_GNU_SOURCE -DALLOW_ADBD_ROOT=1
|
||
|
CPPFLAGS+= -DHAVE_SYMLINKS -DBOARD_ALWAYS_INSECURE
|
||
|
CPPFLAGS+= -DHAVE_TERMIO_H
|
||
|
-CPPFLAGS+= `pkg-config --cflags glib-2.0 gio-2.0`
|
||
|
+CPPFLAGS+= -DADBD_NON_ANDROID
|
||
|
CPPFLAGS+= -I$(SRCDIR)/core/adbd
|
||
|
CPPFLAGS+= -I$(SRCDIR)/core/include
|
||
|
|
||
|
-LIBS+= -lc -lpthread -lz -lcrypto -lcrypt `pkg-config --libs glib-2.0 gio-2.0`
|
||
|
+LIBS+= -lc -lpthread -lz -lcrypto -lcrypt
|
||
|
|
||
|
OBJS= $(patsubst %, %.o, $(basename $(SRCS)))
|
||
|
|
||
|
--
|
||
|
2.5.1
|
||
|
|