From 0167d4c382a697a81638af9b84f93ca50a78217f Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Thu, 11 May 2017 14:44:15 -0700 Subject: [PATCH] Don't write to /sys/class/android_usb/android0/enable with configfs. USB configfs doesn't use /s/c/a/a/enable. Trying to set that gives confusing message on screen when sideloading. Bug: 37713851 Test: adb sideload on device using with configfs. Test: adb sideload on marlin. Change-Id: Ifa55f90c2a5fe6bf9e7cee95882de9f6de686d73 --- adb_install.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/adb_install.cpp b/adb_install.cpp index e7d7758f..ac013065 100644 --- a/adb_install.cpp +++ b/adb_install.cpp @@ -26,7 +26,10 @@ #include #include +#include +#include #include +#include #include "common.h" #include "fuse_sideload.h" @@ -34,16 +37,22 @@ #include "ui.h" static void set_usb_driver(bool enabled) { - int fd = open("/sys/class/android_usb/android0/enable", O_WRONLY); - if (fd < 0) { - ui->Print("failed to open driver control: %s\n", strerror(errno)); + // USB configfs doesn't use /s/c/a/a/enable. + if (android::base::GetBoolProperty("sys.usb.configfs", false)) { return; } - if (TEMP_FAILURE_RETRY(write(fd, enabled ? "1" : "0", 1)) == -1) { - ui->Print("failed to set driver control: %s\n", strerror(errno)); + + static constexpr const char* USB_DRIVER_CONTROL = "/sys/class/android_usb/android0/enable"; + android::base::unique_fd fd(open(USB_DRIVER_CONTROL, O_WRONLY)); + if (fd == -1) { + PLOG(ERROR) << "Failed to open driver control"; + return; } - if (close(fd) < 0) { - ui->Print("failed to close driver control: %s\n", strerror(errno)); + // Not using android::base::WriteStringToFile since that will open with O_CREAT and give EPERM + // when USB_DRIVER_CONTROL doesn't exist. When it gives EPERM, we don't know whether that's due + // to non-existent USB_DRIVER_CONTROL or indeed a permission issue. + if (!android::base::WriteStringToFd(enabled ? "1" : "0", fd)) { + PLOG(ERROR) << "Failed to set driver control"; } }