Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 124e1a0e authored by Elliott Hughes's avatar Elliott Hughes Committed by Luca Stefani
Browse files

libbase: add ConsumePrefix/ConsumeSuffix.

adb was already using ConsumePrefix, and now we have another would-be
user in cutils. (There appears to be one place in adb that should use
ConsumeSuffix, so I'm assuming we'll want that sooner or later.)

I've kept these inline because adb and google3's versions both were, and
I'm easily led.

Test: treehugger
Change-Id: I29d99032f6f6ccbfaefece59725db8afb02a4c87
parent a9981a8f
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -1052,9 +1052,9 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty
        // New transport selection protocol:
        // This is essentially identical to the previous version, except it returns the selected
        // transport id to the caller as well.
        if (ConsumePrefix(&service, "tport:")) {
        if (android::base::ConsumePrefix(&service, "tport:")) {
            legacy = false;
            if (ConsumePrefix(&service, "serial:")) {
            if (android::base::ConsumePrefix(&service, "serial:")) {
                serial_storage = service;
                serial = serial_storage.c_str();
            } else if (service == "usb") {
@@ -1068,7 +1068,7 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty
            // Selection by id is unimplemented, since you obviously already know the transport id
            // you're connecting to.
        } else {
            if (ConsumePrefix(&service, "transport-id:")) {
            if (android::base::ConsumePrefix(&service, "transport-id:")) {
                if (!ParseUint(&transport_id, service)) {
                    SendFail(reply_fd, "invalid transport id");
                    return HostRequestResult::Handled;
@@ -1079,7 +1079,7 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty
                type = kTransportLocal;
            } else if (service == "transport-any") {
                type = kTransportAny;
            } else if (ConsumePrefix(&service, "transport:")) {
            } else if (android::base::ConsumePrefix(&service, "transport:")) {
                serial_storage = service;
                serial = serial_storage.c_str();
            }
@@ -1220,7 +1220,7 @@ HostRequestResult handle_host_request(std::string_view service, TransportType ty
    }

    // Indicates a new emulator instance has started.
    if (ConsumePrefix(&service, "emulator:")) {
    if (android::base::ConsumePrefix(&service, "emulator:")) {
        unsigned int port;
        if (!ParseUint(&port, service)) {
          LOG(ERROR) << "received invalid port for emulator: " << service;
+0 −8
Original line number Diff line number Diff line
@@ -141,11 +141,3 @@ inline bool ParseUint(T* result, std::string_view str, std::string_view* remaini

    return true;
}

inline bool ConsumePrefix(std::string_view* str, std::string_view prefix) {
  if (str->starts_with(prefix)) {
    str->remove_prefix(prefix.size());
    return true;
  }
  return false;
}
+3 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <sys/wait.h>

#include <android-base/cmsg.h>
#include <android-base/strings.h>
#include <cmd.h>

#include "adb.h"
@@ -87,9 +88,9 @@ int main(int argc, char* const argv[]) {

        std::string_view name = data;
        auto protocol = SubprocessProtocol::kShell;
        if (ConsumePrefix(&name, "abb:")) {
        if (android::base::ConsumePrefix(&name, "abb:")) {
            protocol = SubprocessProtocol::kShell;
        } else if (ConsumePrefix(&name, "abb_exec:")) {
        } else if (android::base::ConsumePrefix(&name, "abb_exec:")) {
            protocol = SubprocessProtocol::kNone;
        } else {
            LOG(FATAL) << "Unknown command prefix for abb: " << data;
+11 −11
Original line number Diff line number Diff line
@@ -223,13 +223,13 @@ asocket* daemon_service_to_socket(std::string_view name) {
        return create_jdwp_service_socket();
    } else if (name == "track-jdwp") {
        return create_jdwp_tracker_service_socket();
    } else if (ConsumePrefix(&name, "sink:")) {
    } else if (android::base::ConsumePrefix(&name, "sink:")) {
        uint64_t byte_count = 0;
        if (!ParseUint(&byte_count, name)) {
            return nullptr;
        }
        return new SinkSocket(byte_count);
    } else if (ConsumePrefix(&name, "source:")) {
    } else if (android::base::ConsumePrefix(&name, "source:")) {
        uint64_t byte_count = 0;
        if (!ParseUint(&byte_count, name)) {
            return nullptr;
@@ -250,11 +250,11 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) {
#if defined(__ANDROID__)
    if (name.starts_with("framebuffer:")) {
        return create_service_thread("fb", framebuffer_service);
    } else if (ConsumePrefix(&name, "remount:")) {
    } else if (android::base::ConsumePrefix(&name, "remount:")) {
        std::string arg(name);
        return create_service_thread("remount",
                                     std::bind(remount_service, std::placeholders::_1, arg));
    } else if (ConsumePrefix(&name, "reboot:")) {
    } else if (android::base::ConsumePrefix(&name, "reboot:")) {
        std::string arg(name);
        return create_service_thread("reboot",
                                     std::bind(reboot_service, std::placeholders::_1, arg));
@@ -262,7 +262,7 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) {
        return create_service_thread("root", restart_root_service);
    } else if (name.starts_with("unroot:")) {
        return create_service_thread("unroot", restart_unroot_service);
    } else if (ConsumePrefix(&name, "backup:")) {
    } else if (android::base::ConsumePrefix(&name, "backup:")) {
        std::string cmd = "/system/bin/bu backup ";
        cmd += name;
        return StartSubprocess(cmd, nullptr, SubprocessType::kRaw, SubprocessProtocol::kNone);
@@ -275,7 +275,7 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) {
    } else if (name.starts_with("enable-verity:")) {
        return create_service_thread("verity-off", std::bind(set_verity_enabled_state_service,
                                                             std::placeholders::_1, true));
    } else if (ConsumePrefix(&name, "tcpip:")) {
    } else if (android::base::ConsumePrefix(&name, "tcpip:")) {
        std::string str(name);

        int port;
@@ -289,22 +289,22 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* transport) {
    }
#endif

    if (ConsumePrefix(&name, "dev:")) {
    if (android::base::ConsumePrefix(&name, "dev:")) {
        return unique_fd{unix_open(name, O_RDWR | O_CLOEXEC)};
    } else if (ConsumePrefix(&name, "jdwp:")) {
    } else if (android::base::ConsumePrefix(&name, "jdwp:")) {
        pid_t pid;
        if (!ParseUint(&pid, name)) {
            return unique_fd{};
        }
        return create_jdwp_connection_fd(pid);
    } else if (ConsumePrefix(&name, "shell")) {
    } else if (android::base::ConsumePrefix(&name, "shell")) {
        return ShellService(name, transport);
    } else if (ConsumePrefix(&name, "exec:")) {
    } else if (android::base::ConsumePrefix(&name, "exec:")) {
        return StartSubprocess(std::string(name), nullptr, SubprocessType::kRaw,
                               SubprocessProtocol::kNone);
    } else if (name.starts_with("sync:")) {
        return create_service_thread("sync", file_sync_service);
    } else if (ConsumePrefix(&name, "reverse:")) {
    } else if (android::base::ConsumePrefix(&name, "reverse:")) {
        return reverse_service(name, transport);
    } else if (name == "reconnect") {
        return create_service_thread(
+5 −5
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ asocket* host_service_to_socket(std::string_view name, std::string_view serial,
        return create_device_tracker(false);
    } else if (name == "track-devices-l") {
        return create_device_tracker(true);
    } else if (ConsumePrefix(&name, "wait-for-")) {
    } else if (android::base::ConsumePrefix(&name, "wait-for-")) {
        std::shared_ptr<state_info> sinfo = std::make_shared<state_info>();
        if (sinfo == nullptr) {
            fprintf(stderr, "couldn't allocate state_info: %s", strerror(errno));
@@ -212,11 +212,11 @@ asocket* host_service_to_socket(std::string_view name, std::string_view serial,
        sinfo->serial = serial;
        sinfo->transport_id = transport_id;

        if (ConsumePrefix(&name, "local")) {
        if (android::base::ConsumePrefix(&name, "local")) {
            sinfo->transport_type = kTransportLocal;
        } else if (ConsumePrefix(&name, "usb")) {
        } else if (android::base::ConsumePrefix(&name, "usb")) {
            sinfo->transport_type = kTransportUsb;
        } else if (ConsumePrefix(&name, "any")) {
        } else if (android::base::ConsumePrefix(&name, "any")) {
            sinfo->transport_type = kTransportAny;
        } else {
            return nullptr;
@@ -243,7 +243,7 @@ asocket* host_service_to_socket(std::string_view name, std::string_view serial,
        unique_fd fd = create_service_thread(
                "wait", [sinfo](unique_fd fd) { wait_for_state(std::move(fd), sinfo.get()); });
        return create_local_socket(std::move(fd));
    } else if (ConsumePrefix(&name, "connect:")) {
    } else if (android::base::ConsumePrefix(&name, "connect:")) {
        std::string host(name);
        unique_fd fd = create_service_thread(
                "connect", std::bind(connect_service, std::placeholders::_1, host));
Loading