--- a/packages/modules/adb/daemon/services.cpp +++ b/packages/modules/adb/daemon/services.cpp @@ -273,6 +273,22 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) { ADB_LOG(Service) << "transport " << transport->serial_name() << " opening service " << name; + +#if !defined(__ANDROID__) + // AGNOS is Linux: use Linux tools instead of Android's property service. + if (name.starts_with("root:")) { + return create_service_thread("root", [](unique_fd fd) { + WriteFdExactly(fd.get(), "adbd is already running as root\n"); + }); + } else if (android::base::ConsumePrefix(&name, "reboot:")) { + std::string cmd = "/sbin/reboot"; + if (!name.empty()) cmd += " -- " + escape_arg(std::string(name)); + return StartSubprocess(cmd, nullptr, SubprocessType::kRaw, SubprocessProtocol::kNone); + } else if (name.starts_with("remount:")) { + return StartSubprocess("/bin/mount -o remount,rw /", nullptr, SubprocessType::kRaw, + SubprocessProtocol::kNone); + } +#endif #if defined(__ANDROID__) && !defined(__ANDROID_RECOVERY__) if (name.starts_with("abb:") || name.starts_with("abb_exec:")) { --- a/packages/modules/adb/transport.cpp +++ b/packages/modules/adb/transport.cpp @@ -1300,7 +1300,9 @@ kFeatureAbb, kFeatureFixedPushSymlinkTimestamp, kFeatureAbbExec, +#if ADB_HOST || defined(__ANDROID__) kFeatureRemountShell, +#endif kFeatureTrackApp, kFeatureSendRecv2, kFeatureSendRecv2Brotli, --- a/packages/modules/adb/daemon/main.cpp +++ b/packages/modules/adb/daemon/main.cpp @@ -310,7 +310,7 @@ D("adbd_main(): post init_jdwp()"); #if defined(__linux__) - sd_notify(1, "READY=1"); + if (!is_usb) sd_notify(1, "READY=1"); #endif D("Event loop starting"); --- a/packages/modules/adb/daemon/usb_ffs.cpp +++ b/packages/modules/adb/daemon/usb_ffs.cpp @@ -23,6 +23,12 @@ #include #include +#if defined(__linux__) && !defined(__ANDROID__) +#include +#include +#endif + +#include #include #include #include @@ -317,5 +323,25 @@ *out_control = std::move(control); *out_bulk_in = std::move(bulk_in); *out_bulk_out = std::move(bulk_out); +#if defined(__linux__) && !defined(__ANDROID__) + // Rebind after descriptors are recreated. The controller's sysfs name + // differs between downstream and mainline kernels. + std::string controller; + if (DIR* dir = opendir("/sys/class/udc")) { + while (dirent* entry = readdir(dir)) { + if (entry->d_name[0] != '.') { + controller = entry->d_name; + break; + } + } + closedir(dir); + } + if (controller.empty() || + !android::base::WriteStringToFile(controller, "/config/usb_gadget/g1/UDC")) { + PLOG(ERROR) << "failed to bind AGNOS USB gadget"; + return false; + } + sd_notify(1, "READY=1"); +#endif return true; }