Make "adb get-serialno" interruptible
All process executions must be interruptible, so that Ctrl+c reacts immediately.
This commit is contained in:
parent
ea454e9cee
commit
0426ae885c
3 changed files with 34 additions and 36 deletions
|
@ -233,37 +233,8 @@ adb_install(const char *serial, const char *local) {
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
sc_pid
|
||||||
adb_execute_for_output(const char *serial, const char *const adb_cmd[],
|
adb_get_serialno(sc_pipe *pout) {
|
||||||
size_t adb_cmd_len, char *buf, size_t buf_len,
|
|
||||||
const char *name) {
|
|
||||||
sc_pipe pout;
|
|
||||||
sc_pid pid = adb_execute_p(serial, adb_cmd, adb_cmd_len, NULL, &pout, NULL);
|
|
||||||
if (pid == SC_PROCESS_NONE) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t r = sc_pipe_read_all(pout, buf, buf_len);
|
|
||||||
sc_pipe_close(pout);
|
|
||||||
|
|
||||||
if (!sc_process_check_success(pid, name, true)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
adb_get_serialno(void) {
|
|
||||||
char buf[128];
|
|
||||||
|
|
||||||
const char *const adb_cmd[] = {"get-serialno"};
|
const char *const adb_cmd[] = {"get-serialno"};
|
||||||
ssize_t r = adb_execute_for_output(NULL, adb_cmd, ARRAY_LEN(adb_cmd),
|
return adb_execute_p(NULL, adb_cmd, ARRAY_LEN(adb_cmd), NULL, pout, NULL);
|
||||||
buf, sizeof(buf), "get-serialno");
|
|
||||||
if (r <= 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sc_str_truncate(buf, r, "\r\n");
|
|
||||||
return strdup(buf);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,12 @@ adb_push(const char *serial, const char *local, const char *remote);
|
||||||
sc_pid
|
sc_pid
|
||||||
adb_install(const char *serial, const char *local);
|
adb_install(const char *serial, const char *local);
|
||||||
|
|
||||||
// Return the result of "adb get-serialno".
|
/**
|
||||||
char *
|
* Execute `adb get-serialno`
|
||||||
adb_get_serialno(void);
|
*
|
||||||
|
* The result can be read from the output parameter `pout`.
|
||||||
|
*/
|
||||||
|
sc_pid
|
||||||
|
adb_get_serialno(sc_pipe *pout);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -422,6 +422,29 @@ sc_server_on_terminated(void *userdata) {
|
||||||
LOGD("Server terminated");
|
LOGD("Server terminated");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
sc_server_get_serialno(struct sc_intr *intr) {
|
||||||
|
sc_pipe pout;
|
||||||
|
sc_pid pid = adb_get_serialno(&pout);
|
||||||
|
if (pid == SC_PROCESS_NONE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
ssize_t r = sc_pipe_read_all_intr(intr, pid, pout, buf, sizeof(buf));
|
||||||
|
sc_pipe_close(pout);
|
||||||
|
|
||||||
|
bool ok =
|
||||||
|
sc_process_check_success_intr(intr, pid, "adb get-serialno", true);
|
||||||
|
if (!ok) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sc_str_truncate(buf, r, " \r\n");
|
||||||
|
|
||||||
|
return strdup(buf);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
sc_server_fill_serial(struct sc_server *server) {
|
sc_server_fill_serial(struct sc_server *server) {
|
||||||
// Retrieve the actual device immediately if not provided, so that all
|
// Retrieve the actual device immediately if not provided, so that all
|
||||||
|
@ -430,7 +453,7 @@ sc_server_fill_serial(struct sc_server *server) {
|
||||||
// device/emulator" error)
|
// device/emulator" error)
|
||||||
if (!server->params.serial) {
|
if (!server->params.serial) {
|
||||||
// The serial is owned by sc_server_params, and will be freed on destroy
|
// The serial is owned by sc_server_params, and will be freed on destroy
|
||||||
server->params.serial = adb_get_serialno();
|
server->params.serial = sc_server_get_serialno(&server->intr);
|
||||||
if (!server->params.serial) {
|
if (!server->params.serial) {
|
||||||
LOGE("Could not get device serial");
|
LOGE("Could not get device serial");
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue