Make apk_install more portable

This commit is contained in:
topjohnwu 2018-12-05 18:36:27 -05:00
parent bdea796121
commit 109891d668
3 changed files with 8 additions and 26 deletions

View File

@ -561,17 +561,19 @@ static void install_apk(const char *apk) {
setfilecon(apk, "u:object_r:" SEPOL_FILE_DOMAIN ":s0"); setfilecon(apk, "u:object_r:" SEPOL_FILE_DOMAIN ":s0");
while (1) { while (1) {
sleep(5); sleep(5);
LOGD("apk_install: attempting to install APK"); LOGD("apk_install: attempting to install APK\n");
int apk_res = -1, pid; int fd = -1, pid;
pid = exec_command(true, &apk_res, nullptr, "/system/bin/pm", "install", "-r", apk, nullptr); pid = exec_command(true, &fd, nullptr, "/system/bin/sh",
"/system/bin/pm", "install", "-r", apk, nullptr);
FILE *res = fdopen(fd, "r");
if (pid != -1) { if (pid != -1) {
int err = 0; bool err = false;
while (fdgets(buf, PATH_MAX, apk_res) > 0) { while (fgets(buf, PATH_MAX, res)) {
LOGD("apk_install: %s", buf); LOGD("apk_install: %s", buf);
err |= strstr(buf, "Error:") != nullptr; err |= strstr(buf, "Error:") != nullptr;
} }
waitpid(pid, nullptr, 0); waitpid(pid, nullptr, 0);
close(apk_res); fclose(res);
// Keep trying until pm is started // Keep trying until pm is started
if (err) if (err)
continue; continue;

View File

@ -92,7 +92,6 @@ int xpoll(struct pollfd *fds, nfds_t nfds, int timeout);
unsigned get_shell_uid(); unsigned get_shell_uid();
unsigned get_system_uid(); unsigned get_system_uid();
unsigned get_radio_uid(); unsigned get_radio_uid();
ssize_t fdgets(char *buf, size_t size, int fd);
int exec_command_sync(const char *argv0, ...); int exec_command_sync(const char *argv0, ...);
int fork_dont_care(); int fork_dont_care();
void gen_rand_str(char *buf, int len); void gen_rand_str(char *buf, int len);

View File

@ -39,25 +39,6 @@ unsigned get_radio_uid() {
return ppwd->pw_uid; return ppwd->pw_uid;
} }
/* Read a whole line from file descriptor */
ssize_t fdgets(char *buf, const size_t size, int fd) {
ssize_t len = 0;
buf[0] = '\0';
while (len < size - 1) {
int ret = read(fd, buf + len, 1);
if (ret < 0)
return -1;
if (ret == 0)
break;
if (buf[len] == '\0' || buf[len++] == '\n') {
buf[len] = '\0';
break;
}
}
buf[size - 1] = '\0';
return len;
}
int fork_dont_care() { int fork_dont_care() {
int pid = xfork(); int pid = xfork();
if (pid) { if (pid) {