Remove strdup2

This commit is contained in:
topjohnwu 2019-01-26 13:00:19 -05:00
parent 9275975b2c
commit 7565ea2787
4 changed files with 80 additions and 52 deletions

View File

@ -441,17 +441,17 @@ static bool magisk_env() {
if (str_contains(line, " /system_root ")) { if (str_contains(line, " /system_root ")) {
bind_mount("/system_root/system", MIRRDIR "/system"); bind_mount("/system_root/system", MIRRDIR "/system");
sscanf(line.c_str(), "%s", buf); sscanf(line.c_str(), "%s", buf);
system_block = strdup2(buf); system_block = strdup(buf);
system_as_root = true; system_as_root = true;
} else if (!system_as_root && str_contains(line, " /system ")) { } else if (!system_as_root && str_contains(line, " /system ")) {
sscanf(line.c_str(), "%s %*s %s", buf, buf2); sscanf(line.c_str(), "%s %*s %s", buf, buf2);
system_block = strdup2(buf); system_block = strdup(buf);
xmount(system_block, MIRRDIR "/system", buf2, MS_RDONLY, nullptr); xmount(system_block, MIRRDIR "/system", buf2, MS_RDONLY, nullptr);
VLOGI("mount", system_block, MIRRDIR "/system"); VLOGI("mount", system_block, MIRRDIR "/system");
} else if (str_contains(line, " /vendor ")) { } else if (str_contains(line, " /vendor ")) {
seperate_vendor = true; seperate_vendor = true;
sscanf(line.c_str(), "%s %*s %s", buf, buf2); sscanf(line.c_str(), "%s %*s %s", buf, buf2);
vendor_block = strdup2(buf); vendor_block = strdup(buf);
xmkdir(MIRRDIR "/vendor", 0755); xmkdir(MIRRDIR "/vendor", 0755);
xmount(vendor_block, MIRRDIR "/vendor", buf2, MS_RDONLY, nullptr); xmount(vendor_block, MIRRDIR "/vendor", buf2, MS_RDONLY, nullptr);
VLOGI("mount", vendor_block, MIRRDIR "/system"); VLOGI("mount", vendor_block, MIRRDIR "/system");

View File

@ -82,33 +82,35 @@ static void *monitor_thread(void *) {
} }
static void *logcat_thread(void *) { static void *logcat_thread(void *) {
int log_fd = -1, log_pid; int log_pid;
char line[4096]; char line[4096];
while (1) { while (true) {
// Start logcat // Start logcat
log_pid = exec_command(false, &log_fd, nullptr, log_cmd.data()); exec_t exec {
FILE *logs = fdopen(log_fd, "r"); .fd = -1,
.argv = log_cmd.data()
};
log_pid = exec_command(exec);
FILE *logs = fdopen(exec.fd, "r");
while (fgets(line, sizeof(line), logs)) { while (fgets(line, sizeof(line), logs)) {
if (line[0] == '-') if (line[0] == '-')
continue; continue;
size_t len = strlen(line); size_t len = strlen(line);
pthread_mutex_lock(&lock); pthread_mutex_lock(&lock);
for (int i = 0; i < EVENT_NUM; ++i) { for (auto &event : events) {
if (events[i].fd > 0 && events[i].filter(line)) if (event.fd > 0 && event.filter(line))
write(events[i].fd, line, len); write(event.fd, line, len);
} }
pthread_mutex_unlock(&lock); pthread_mutex_unlock(&lock);
} }
fclose(logs); fclose(logs);
log_fd = -1;
kill(log_pid, SIGTERM); kill(log_pid, SIGTERM);
waitpid(log_pid, nullptr, 0); waitpid(log_pid, nullptr, 0);
LOGI("magisklogd: logcat output EOF"); LOGI("magisklogd: logcat output EOF");
// Clear buffer // Clear buffer
log_pid = exec_command(false, nullptr, nullptr, clear_cmd.data()); exec_command_sync(clear_cmd.data());
waitpid(log_pid, nullptr, 0);
} }
} }
@ -131,10 +133,10 @@ static void log_daemon() {
log_cmd.push_back(MIRRDIR "/system/bin/logcat"); log_cmd.push_back(MIRRDIR "/system/bin/logcat");
// Test whether these buffers actually works // Test whether these buffers actually works
const char *b[] = { "main", "events", "crash" }; const char *b[] = { "main", "events", "crash" };
for (int i = 0; i < 3; ++i) { for (auto &buffer : b) {
if (exec_command_sync(MIRRDIR "/system/bin/logcat", "-b", b[i], "-d", "-f", "/dev/null", nullptr) == 0) { if (exec_command_sync(MIRRDIR "/system/bin/logcat", "-b", buffer, "-d", "-f", "/dev/null", nullptr) == 0) {
log_cmd.push_back("-b"); log_cmd.push_back("-b");
log_cmd.push_back(b[i]); log_cmd.push_back(buffer);
} }
} }
chmod("/dev/null", 0666); chmod("/dev/null", 0666);

View File

@ -142,10 +142,19 @@ void write_zero(int fd, size_t size);
#define str_starts(s, ss) ((ss) != nullptr && (s).compare(0, strlen(ss), ss) == 0) #define str_starts(s, ss) ((ss) != nullptr && (s).compare(0, strlen(ss), ss) == 0)
std::vector<std::string> file_to_vector(const char *filename); std::vector<std::string> file_to_vector(const char *filename);
char *strdup2(const char *s, size_t *size = nullptr);
struct exec_t {
bool err = false;
int fd = -2;
void (*pre_exec)() = nullptr;
const char **argv = nullptr;
int (*fork)() = xfork;
};
int exec_command(exec_t &exec);
int exec_command(bool err, int *fd, void (*pre_exec)(), const char **argv); int exec_command(bool err, int *fd, void (*pre_exec)(), const char **argv);
int exec_command(bool err, int *fd, void (*cb)(), const char *argv0, ...); int exec_command(bool err, int *fd, void (*cb)(), const char *argv0, ...);
int exec_command_sync(const char **argv);
int exec_command_sync(const char *argv0, ...); int exec_command_sync(const char *argv0, ...);
#endif #endif

View File

@ -155,30 +155,25 @@ int __fsetxattr(int fd, const char *name, const void *value, size_t size, int fl
return (int) syscall(__NR_fsetxattr, fd, name, value, size, flags); return (int) syscall(__NR_fsetxattr, fd, name, value, size, flags);
} }
/* int exec_command(exec_t &exec) {
fd == nullptr -> Ignore output int pipefd[2] = {-1, -1}, outfd = -1;
*fd < 0 -> Open pipe and set *fd to the read end
*fd >= 0 -> STDOUT (or STDERR) will be redirected to *fd
*pre_exec -> A callback function called after forking, before execvp
*/
int exec_command(bool err, int *fd, void (*pre_exec)(void), const char **argv) {
int pipefd[2], outfd = -1;
if (fd) { if (exec.fd == -1) {
if (*fd < 0) { if (xpipe2(pipefd, O_CLOEXEC) == -1)
if (xpipe2(pipefd, O_CLOEXEC) == -1) return -1;
return -1; outfd = pipefd[1];
outfd = pipefd[1]; } else if (exec.fd >= 0) {
} else { outfd = exec.fd;
outfd = *fd;
}
} }
int pid = xfork(); int pid = exec.fork();
if (pid != 0) { if (pid < 0) {
if (fd && *fd < 0) { close(pipefd[0]);
// Give the read end and close write end close(pipefd[1]);
*fd = pipefd[0]; return -1;
} else if (pid) {
if (exec.fd == -1) {
exec.fd = pipefd[0];
close(pipefd[1]); close(pipefd[1]);
} }
return pid; return pid;
@ -186,21 +181,39 @@ int exec_command(bool err, int *fd, void (*pre_exec)(void), const char **argv) {
if (outfd >= 0) { if (outfd >= 0) {
xdup2(outfd, STDOUT_FILENO); xdup2(outfd, STDOUT_FILENO);
if (err) if (exec.err)
xdup2(outfd, STDERR_FILENO); xdup2(outfd, STDERR_FILENO);
close(outfd); close(outfd);
} }
// Call the pre-exec callback // Call the pre-exec callback
if (pre_exec) if (exec.pre_exec)
pre_exec(); exec.pre_exec();
execve(argv[0], (char **) argv, environ); execve(exec.argv[0], (char **) exec.argv, environ);
PLOGE("execve %s", argv[0]); PLOGE("execve %s", exec.argv[0]);
exit(-1); exit(-1);
} }
static int v_exec_command(bool err, int *fd, void (*cb)(void), const char *argv0, va_list argv) { /*
fd == nullptr -> Ignore output
*fd < 0 -> Open pipe and set *fd to the read end
*fd >= 0 -> STDOUT (or STDERR) will be redirected to *fd
*pre_exec -> A callback function called after forking, before execvp
*/
int exec_command(bool err, int *fd, void (*pre_exec)(), const char **argv) {
exec_t exec {
.err = err,
.fd = fd ? *fd : -2,
.pre_exec = pre_exec,
.argv = argv
};
int pid = exec_command(exec);
if (fd) *fd = exec.fd;
return pid;
}
static int v_exec_command(bool err, int *fd, void (*cb)(), const char *argv0, va_list argv) {
// Collect va_list into vector // Collect va_list into vector
vector<const char *> args; vector<const char *> args;
args.push_back(argv0); args.push_back(argv0);
@ -211,6 +224,18 @@ static int v_exec_command(bool err, int *fd, void (*cb)(void), const char *argv0
return pid; return pid;
} }
int exec_command_sync(const char **argv) {
exec_t exec {
.argv = argv
};
int pid, status;
pid = exec_command(exec);
if (pid < 0)
return -1;
waitpid(pid, &status, 0);
return WEXITSTATUS(status);
}
int exec_command_sync(const char *argv0, ...) { int exec_command_sync(const char *argv0, ...) {
va_list argv; va_list argv;
va_start(argv, argv0); va_start(argv, argv0);
@ -230,11 +255,3 @@ int exec_command(bool err, int *fd, void (*cb)(void), const char *argv0, ...) {
va_end(argv); va_end(argv);
return pid; return pid;
} }
char *strdup2(const char *s, size_t *size) {
size_t len = strlen(s) + 1;
char *buf = new char[len];
memcpy(buf, s, len);
if (size) *size = len;
return buf;
}