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

Commit 2e70b2d5 authored by Josh Gao's avatar Josh Gao Committed by Gerrit Code Review
Browse files

Merge changes I9757ab85,Idac80a24

* changes:
  adb: change unsigned to uint32_t in sync struct definitions.
  adb: detect when the client disconnects in wait-for-device.
parents 4a908422 69469c4e
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -41,25 +41,25 @@ struct SyncRequest {

union syncmsg {
    struct __attribute__((packed)) {
        unsigned id;
        unsigned mode;
        unsigned size;
        unsigned time;
        uint32_t id;
        uint32_t mode;
        uint32_t size;
        uint32_t time;
    } stat;
    struct __attribute__((packed)) {
        unsigned id;
        unsigned mode;
        unsigned size;
        unsigned time;
        unsigned namelen;
        uint32_t id;
        uint32_t mode;
        uint32_t size;
        uint32_t time;
        uint32_t namelen;
    } dent;
    struct __attribute__((packed)) {
        unsigned id;
        unsigned size;
        uint32_t id;
        uint32_t size;
    } data;
    struct __attribute__((packed)) {
        unsigned id;
        unsigned msglen;
        uint32_t id;
        uint32_t msglen;
    } status;
};

+12 −2
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include "remount_service.h"
#include "services.h"
#include "shell_service.h"
#include "sysdeps.h"
#include "transport.h"

struct stinfo {
@@ -369,12 +370,21 @@ static void wait_for_state(int fd, void* data) {
        std::string error = "unknown error";
        const char* serial = sinfo->serial.length() ? sinfo->serial.c_str() : NULL;
        atransport* t = acquire_one_transport(sinfo->transport_type, serial, &is_ambiguous, &error);

        if (t != nullptr && t->connection_state == sinfo->state) {
            SendOkay(fd);
            break;
        } else if (!is_ambiguous) {
            adb_sleep_ms(1000);
            adb_pollfd pfd = {.fd = fd, .events = POLLIN };
            int rc = adb_poll(&pfd, 1, 1000);
            if (rc < 0) {
                SendFail(fd, error);
                break;
            } else if (rc > 0 && (pfd.revents & POLLHUP) != 0) {
                // The other end of the socket is closed, probably because the other side was
                // terminated, bail out.
                break;
            }

            // Try again...
        } else {
            SendFail(fd, error);
+23 −2
Original line number Diff line number Diff line
@@ -112,9 +112,13 @@ class sysdeps_poll : public ::testing::Test {
    }

    void TearDown() override {
        if (fds[0] >= 0) {
            ASSERT_EQ(0, adb_close(fds[0]));
        }
        if (fds[1] >= 0) {
            ASSERT_EQ(0, adb_close(fds[1]));
        }
    }
};

TEST_F(sysdeps_poll, smoke) {
@@ -190,3 +194,20 @@ TEST_F(sysdeps_poll, duplicate_fd) {
    EXPECT_EQ(POLLRDNORM, pfd[0].revents);
    EXPECT_EQ(POLLRDNORM, pfd[1].revents);
}

TEST_F(sysdeps_poll, disconnect) {
    adb_pollfd pfd;
    pfd.fd = fds[0];
    pfd.events = POLLIN;

    EXPECT_EQ(0, adb_poll(&pfd, 1, 0));
    EXPECT_EQ(0, pfd.revents);

    EXPECT_EQ(0, adb_close(fds[1]));
    fds[1] = -1;

    EXPECT_EQ(1, adb_poll(&pfd, 1, 100));

    // Linux returns POLLIN | POLLHUP, Windows returns just POLLHUP.
    EXPECT_EQ(POLLHUP, pfd.revents & POLLHUP);
}