adb: convert more stuff to unique_fd.
Test: adb_test
Test: adbd_test
Test: test_device.py
Change-Id: Ie75f0b811d2c75d508e6ecffb40579308f5789d0
diff --git a/adb/client/adb_client.cpp b/adb/client/adb_client.cpp
index 9a25d10..0a09d1e 100644
--- a/adb/client/adb_client.cpp
+++ b/adb/client/adb_client.cpp
@@ -100,13 +100,11 @@
if (!SendProtocolString(fd, service)) {
*error = perror_str("write failure during connection");
- adb_close(fd);
return -1;
}
D("Switch transport in progress");
if (!adb_status(fd, error)) {
- adb_close(fd);
D("Switch transport failed: %s", error->c_str());
return -1;
}
@@ -194,7 +192,7 @@
int adb_connect(const std::string& service, std::string* error) {
// first query the adb server's version
- int fd = _adb_connect("host:version", error);
+ unique_fd fd(_adb_connect("host:version", error));
D("adb_connect: service %s", service.c_str());
if (fd == -2 && !is_local_socket_spec(__adb_server_socket_spec)) {
@@ -224,12 +222,10 @@
if (fd >= 0) {
std::string version_string;
if (!ReadProtocolString(fd, &version_string, error)) {
- adb_close(fd);
return -1;
}
ReadOrderlyShutdown(fd);
- adb_close(fd);
if (sscanf(&version_string[0], "%04x", &version) != 1) {
*error = android::base::StringPrintf("cannot parse version string: %s",
@@ -258,52 +254,48 @@
return 0;
}
- fd = _adb_connect(service, error);
+ fd.reset(_adb_connect(service, error));
if (fd == -1) {
D("_adb_connect error: %s", error->c_str());
} else if(fd == -2) {
fprintf(stderr, "* daemon still not running\n");
}
- D("adb_connect: return fd %d", fd);
+ D("adb_connect: return fd %d", fd.get());
- return fd;
+ return fd.release();
}
bool adb_command(const std::string& service) {
std::string error;
- int fd = adb_connect(service, &error);
+ unique_fd fd(adb_connect(service, &error));
if (fd < 0) {
fprintf(stderr, "error: %s\n", error.c_str());
return false;
}
- if (!adb_status(fd, &error)) {
+ if (!adb_status(fd.get(), &error)) {
fprintf(stderr, "error: %s\n", error.c_str());
- adb_close(fd);
return false;
}
- ReadOrderlyShutdown(fd);
- adb_close(fd);
+ ReadOrderlyShutdown(fd.get());
return true;
}
bool adb_query(const std::string& service, std::string* result, std::string* error) {
D("adb_query: %s", service.c_str());
- int fd = adb_connect(service, error);
+ unique_fd fd(adb_connect(service, error));
if (fd < 0) {
return false;
}
result->clear();
- if (!ReadProtocolString(fd, result, error)) {
- adb_close(fd);
+ if (!ReadProtocolString(fd.get(), result, error)) {
return false;
}
- ReadOrderlyShutdown(fd);
- adb_close(fd);
+ ReadOrderlyShutdown(fd.get());
return true;
}
diff --git a/adb/client/commandline.cpp b/adb/client/commandline.cpp
index e963e3d..f70b480 100644
--- a/adb/client/commandline.cpp
+++ b/adb/client/commandline.cpp
@@ -794,7 +794,7 @@
static int adb_sideload_legacy(const char* filename, int in_fd, int size) {
std::string error;
- int out_fd = adb_connect(android::base::StringPrintf("sideload:%d", size), &error);
+ unique_fd out_fd(adb_connect(android::base::StringPrintf("sideload:%d", size), &error));
if (out_fd < 0) {
fprintf(stderr, "adb: pre-KitKat sideload connection failed: %s\n", error.c_str());
return -1;
@@ -809,14 +809,12 @@
unsigned xfer = (size > CHUNK_SIZE) ? CHUNK_SIZE : size;
if (!ReadFdExactly(in_fd, buf, xfer)) {
fprintf(stderr, "adb: failed to read data from %s: %s\n", filename, strerror(errno));
- adb_close(out_fd);
return -1;
}
if (!WriteFdExactly(out_fd, buf, xfer)) {
std::string error;
adb_status(out_fd, &error);
fprintf(stderr, "adb: failed to write data: %s\n", error.c_str());
- adb_close(out_fd);
return -1;
}
size -= xfer;
@@ -827,11 +825,9 @@
if (!adb_status(out_fd, &error)) {
fprintf(stderr, "adb: error response: %s\n", error.c_str());
- adb_close(out_fd);
return -1;
}
- adb_close(out_fd);
return 0;
}
@@ -1091,7 +1087,7 @@
int send_shell_command(const std::string& command, bool disable_shell_protocol,
StandardStreamsCallbackInterface* callback) {
- int fd;
+ unique_fd fd;
bool use_shell_protocol = false;
while (true) {
@@ -1114,7 +1110,7 @@
std::string error;
std::string service_string = ShellServiceString(use_shell_protocol, "", command);
- fd = adb_connect(service_string, &error);
+ fd.reset(adb_connect(service_string, &error));
if (fd >= 0) {
break;
}
@@ -1126,13 +1122,7 @@
}
}
- int exit_code = read_and_dump(fd, use_shell_protocol, callback);
-
- if (adb_close(fd) < 0) {
- PLOG(ERROR) << "failure closing FD " << fd;
- }
-
- return exit_code;
+ return read_and_dump(fd.get(), use_shell_protocol, callback);
}
static int logcat(int argc, const char** argv) {
@@ -1196,7 +1186,7 @@
if (argc < 2) error_exit("backup either needs a list of packages or -all/-shared");
adb_unlink(filename);
- int outFd = adb_creat(filename, 0640);
+ unique_fd outFd(adb_creat(filename, 0640));
if (outFd < 0) {
fprintf(stderr, "adb: backup unable to create file '%s': %s\n", filename, strerror(errno));
return EXIT_FAILURE;
@@ -1211,20 +1201,16 @@
D("backup. filename=%s cmd=%s", filename, cmd.c_str());
std::string error;
- int fd = adb_connect(cmd, &error);
+ unique_fd fd(adb_connect(cmd, &error));
if (fd < 0) {
fprintf(stderr, "adb: unable to connect for backup: %s\n", error.c_str());
- adb_close(outFd);
return EXIT_FAILURE;
}
fprintf(stdout, "Now unlock your device and confirm the backup operation...\n");
fflush(stdout);
- copy_to_file(fd, outFd);
-
- adb_close(fd);
- adb_close(outFd);
+ copy_to_file(fd.get(), outFd.get());
return EXIT_SUCCESS;
}
@@ -1232,33 +1218,29 @@
if (argc != 2) error_exit("restore requires an argument");
const char* filename = argv[1];
- int tarFd = adb_open(filename, O_RDONLY);
+ unique_fd tarFd(adb_open(filename, O_RDONLY));
if (tarFd < 0) {
fprintf(stderr, "adb: unable to open file %s: %s\n", filename, strerror(errno));
return -1;
}
std::string error;
- int fd = adb_connect("restore:", &error);
+ unique_fd fd(adb_connect("restore:", &error));
if (fd < 0) {
fprintf(stderr, "adb: unable to connect for restore: %s\n", error.c_str());
- adb_close(tarFd);
return -1;
}
fprintf(stdout, "Now unlock your device and confirm the restore operation.\n");
fflush(stdout);
- copy_to_file(tarFd, fd);
+ copy_to_file(tarFd.get(), fd.get());
// Provide an in-band EOD marker in case the archive file is malformed
- write_zeros(512*2, fd);
+ write_zeros(512 * 2, fd);
// Wait until the other side finishes, or it'll get sent SIGHUP.
- copy_to_file(fd, STDOUT_FILENO);
-
- adb_close(fd);
- adb_close(tarFd);
+ copy_to_file(fd.get(), STDOUT_FILENO);
return 0;
}
@@ -1298,19 +1280,18 @@
static int adb_connect_command(const std::string& command) {
std::string error;
- int fd = adb_connect(command, &error);
+ unique_fd fd(adb_connect(command, &error));
if (fd < 0) {
fprintf(stderr, "error: %s\n", error.c_str());
return 1;
}
read_and_dump(fd);
- adb_close(fd);
return 0;
}
static int adb_connect_command_bidirectional(const std::string& command) {
std::string error;
- int fd = adb_connect(command, &error);
+ unique_fd fd(adb_connect(command, &error));
if (fd < 0) {
fprintf(stderr, "error: %s\n", error.c_str());
return 1;
@@ -1336,11 +1317,10 @@
}
};
- std::thread read(forward, fd, STDOUT_FILENO, true);
- std::thread write(forward, STDIN_FILENO, fd, false);
+ std::thread read(forward, fd.get(), STDOUT_FILENO, true);
+ std::thread write(forward, STDIN_FILENO, fd.get(), false);
read.join();
write.join();
- adb_close(fd);
return 0;
}
@@ -1599,19 +1579,17 @@
}
std::string error;
- int fd = adb_connect(cmd, &error);
+ unique_fd fd(adb_connect(cmd, &error));
if (fd < 0) {
fprintf(stderr, "error: %s\n", error.c_str());
return -1;
}
if (exec_in) {
- copy_to_file(STDIN_FILENO, fd);
+ copy_to_file(STDIN_FILENO, fd.get());
} else {
- copy_to_file(fd, STDOUT_FILENO);
+ copy_to_file(fd.get(), STDOUT_FILENO);
}
-
- adb_close(fd);
return 0;
} else if (!strcmp(argv[0], "kill-server")) {
return adb_kill_server() ? 0 : 1;
@@ -1706,9 +1684,8 @@
error_exit("error: %s", error_message.c_str());
}
- int fd = adb_connect(cmd, &error_message);
- if (fd < 0 || !adb_status(fd, &error_message)) {
- adb_close(fd);
+ unique_fd fd(adb_connect(cmd, &error_message));
+ if (fd < 0 || !adb_status(fd.get(), &error_message)) {
error_exit("error: %s", error_message.c_str());
}
diff --git a/adb/client/console.cpp b/adb/client/console.cpp
index 4e8a3f8..1dbb6e2 100644
--- a/adb/client/console.cpp
+++ b/adb/client/console.cpp
@@ -108,7 +108,7 @@
}
int adb_send_emulator_command(int argc, const char** argv, const char* serial) {
- int fd = connect_to_console(serial);
+ unique_fd fd(connect_to_console(serial));
if (fd == -1) {
return 1;
}
@@ -125,7 +125,6 @@
if (!WriteFdExactly(fd, commands)) {
fprintf(stderr, "error: cannot write to emulator: %s\n",
strerror(errno));
- adb_close(fd);
return 1;
}
@@ -178,7 +177,5 @@
}
printf("%s", emulator_output.c_str() + found);
- adb_close(fd);
-
return 0;
}
diff --git a/adb/client/file_sync_client.cpp b/adb/client/file_sync_client.cpp
index f0f9a80..b8827ef 100644
--- a/adb/client/file_sync_client.cpp
+++ b/adb/client/file_sync_client.cpp
@@ -207,11 +207,10 @@
std::string error;
if (!adb_get_feature_set(&features_, &error)) {
- fd = -1;
Error("failed to get feature set: %s", error.c_str());
} else {
have_stat_v2_ = CanUseFeature(features_, kFeatureStat2);
- fd = adb_connect("sync:", &error);
+ fd.reset(adb_connect("sync:", &error));
if (fd < 0) {
Error("connect failed: %s", error.c_str());
}
@@ -230,7 +229,6 @@
// case, this will wait for the server to do orderly shutdown.
ReadOrderlyShutdown(fd);
}
- adb_close(fd);
line_printer_.KeepInfoLine();
}
@@ -240,7 +238,7 @@
bool IsValid() { return fd >= 0; }
bool ReceivedError(const char* from, const char* to) {
- adb_pollfd pfd = {.fd = fd, .events = POLLIN};
+ adb_pollfd pfd = {.fd = fd.get(), .events = POLLIN};
int rc = adb_poll(&pfd, 1, 0);
if (rc < 0) {
Error("failed to poll: %s", strerror(errno));
@@ -324,7 +322,7 @@
memset(st, 0, sizeof(*st));
if (have_stat_v2_) {
- if (!ReadFdExactly(fd, &msg.stat_v2, sizeof(msg.stat_v2))) {
+ if (!ReadFdExactly(fd.get(), &msg.stat_v2, sizeof(msg.stat_v2))) {
PLOG(FATAL) << "protocol fault: failed to read stat response";
}
@@ -350,7 +348,7 @@
st->st_ctime = msg.stat_v2.ctime;
return true;
} else {
- if (!ReadFdExactly(fd, &msg.stat_v1, sizeof(msg.stat_v1))) {
+ if (!ReadFdExactly(fd.get(), &msg.stat_v1, sizeof(msg.stat_v1))) {
PLOG(FATAL) << "protocol fault: failed to read stat response";
}
@@ -437,7 +435,7 @@
uint64_t total_size = st.st_size;
uint64_t bytes_copied = 0;
- int lfd = adb_open(lpath, O_RDONLY);
+ unique_fd lfd(adb_open(lpath, O_RDONLY));
if (lfd < 0) {
Error("opening '%s' locally failed: %s", lpath, strerror(errno));
return false;
@@ -449,7 +447,6 @@
int bytes_read = adb_read(lfd, sbuf.data, max - sizeof(SyncRequest));
if (bytes_read == -1) {
Error("reading '%s' locally failed: %s", lpath, strerror(errno));
- adb_close(lfd);
return false;
} else if (bytes_read == 0) {
break;
@@ -469,8 +466,6 @@
ReportProgress(rpath, bytes_copied, total_size);
}
- adb_close(lfd);
-
syncmsg msg;
msg.data.id = ID_DONE;
msg.data.size = mtime;
@@ -576,7 +571,7 @@
}
// TODO: add a char[max] buffer here, to replace syncsendbuf...
- int fd;
+ unique_fd fd;
size_t max;
private:
@@ -740,7 +735,7 @@
if (!sc.SendRequest(ID_RECV, rpath)) return false;
adb_unlink(lpath);
- int lfd = adb_creat(lpath, 0644);
+ unique_fd lfd(adb_creat(lpath, 0644));
if (lfd < 0) {
sc.Error("cannot create '%s': %s", lpath, strerror(errno));
return false;
@@ -750,7 +745,6 @@
while (true) {
syncmsg msg;
if (!ReadFdExactly(sc.fd, &msg.data, sizeof(msg.data))) {
- adb_close(lfd);
adb_unlink(lpath);
return false;
}
@@ -758,7 +752,6 @@
if (msg.data.id == ID_DONE) break;
if (msg.data.id != ID_DATA) {
- adb_close(lfd);
adb_unlink(lpath);
sc.ReportCopyFailure(rpath, lpath, msg);
return false;
@@ -766,21 +759,18 @@
if (msg.data.size > sc.max) {
sc.Error("msg.data.size too large: %u (max %zu)", msg.data.size, sc.max);
- adb_close(lfd);
adb_unlink(lpath);
return false;
}
char buffer[SYNC_DATA_MAX];
if (!ReadFdExactly(sc.fd, buffer, msg.data.size)) {
- adb_close(lfd);
adb_unlink(lpath);
return false;
}
if (!WriteFdExactly(lfd, buffer, msg.data.size)) {
sc.Error("cannot write '%s': %s", lpath, strerror(errno));
- adb_close(lfd);
adb_unlink(lpath);
return false;
}
@@ -792,7 +782,6 @@
}
sc.RecordFilesTransferred(1);
- adb_close(lfd);
return true;
}