diff --git a/native/jni/init/early_mount.cpp b/native/jni/init/early_mount.cpp index d1b4a5eda..7e29f5105 100644 --- a/native/jni/init/early_mount.cpp +++ b/native/jni/init/early_mount.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include diff --git a/native/jni/init/getinfo.cpp b/native/jni/init/getinfo.cpp index 9791e37b4..285d0896a 100644 --- a/native/jni/init/getinfo.cpp +++ b/native/jni/init/getinfo.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index 9b8d528a5..99799213d 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include diff --git a/native/jni/utils/include/files.h b/native/jni/utils/include/files.h new file mode 100644 index 000000000..b9ed9f9e2 --- /dev/null +++ b/native/jni/utils/include/files.h @@ -0,0 +1,73 @@ +#pragma once + +#define do_align(p, a) (((p) + (a) - 1) / (a) * (a)) +#define align_off(p, a) (do_align(p, a) - (p)) + +struct file_attr { + struct stat st; + char con[128]; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +ssize_t fd_path(int fd, char *path, size_t size); +int fd_pathat(int dirfd, const char *name, char *path, size_t size); +int mkdirs(const char *pathname, mode_t mode); +void rm_rf(const char *path); +void mv_f(const char *source, const char *destination); +void mv_dir(int src, int dest); +void cp_afc(const char *source, const char *destination); +void link_dir(int src, int dest); +int getattr(const char *path, struct file_attr *a); +int getattrat(int dirfd, const char *name, struct file_attr *a); +int fgetattr(int fd, struct file_attr *a); +int setattr(const char *path, struct file_attr *a); +int setattrat(int dirfd, const char *name, struct file_attr *a); +int fsetattr(int fd, struct file_attr *a); +void fclone_attr(int sourcefd, int targetfd); +void clone_attr(const char *source, const char *target); +void fd_full_read(int fd, void **buf, size_t *size); +void full_read(const char *filename, void **buf, size_t *size); +void write_zero(int fd, size_t size); + +#ifdef __cplusplus +} + +#include +#include + +void file_readline(const char *file, const std::function &fn, bool trim = false); +void parse_prop_file(const char *file, const std::function + &fn); +void *__mmap(const char *filename, size_t *size, bool rw); +void frm_rf(int dirfd, std::initializer_list excl = std::initializer_list()); +void clone_dir(int src, int dest, bool overwrite = true); +void parse_mnt(const char *file, const std::function &fn); + +template +void mmap_ro(const char *filename, B &buf, size_t &sz) { + buf = (B) __mmap(filename, &sz, false); +} + +template +void mmap_ro(const char *filename, B &buf, L &sz) { + size_t __sz; + buf = (B) __mmap(filename, &__sz, false); + sz = __sz; +} + +template +void mmap_rw(const char *filename, B &buf, size_t &sz) { + buf = (B) __mmap(filename, &sz, true); +} + +template +void mmap_rw(const char *filename, B &buf, L &sz) { + size_t __sz; + buf = (B) __mmap(filename, &__sz, true); + sz = __sz; +} + +#endif \ No newline at end of file diff --git a/native/jni/utils/include/misc.h b/native/jni/utils/include/misc.h new file mode 100644 index 000000000..ee90e2c2b --- /dev/null +++ b/native/jni/utils/include/misc.h @@ -0,0 +1,98 @@ +#pragma once + +#define UID_SHELL (get_shell_uid()) +#define UID_ROOT 0 + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned get_shell_uid(); +int fork_dont_care(); +int fork_no_zombie(); +void gen_rand_str(char *buf, int len); +int strend(const char *s1, const char *s2); +char *rtrim(char *str); +void init_argv0(int argc, char **argv); +void set_nice_name(const char *name); +int parse_int(const char *s); + +#ifdef __cplusplus +} + +#include +#include +#include + +#define str_contains(s, ss) ((ss) != nullptr && (s).find(ss) != std::string::npos) +#define str_starts(s, ss) ((ss) != nullptr && (s).compare(0, strlen(ss), ss) == 0) + +class MutexGuard { +public: + explicit MutexGuard(pthread_mutex_t &m): mutex(&m) { + pthread_mutex_lock(mutex); + } + + explicit MutexGuard(pthread_mutex_t *m): mutex(m) { + pthread_mutex_lock(mutex); + } + + ~MutexGuard() { + pthread_mutex_unlock(mutex); + } + +private: + pthread_mutex_t *mutex; +}; + +class RunFinally { +public: + explicit RunFinally(std::function &&fn): fn(std::move(fn)) {} + + void disable() { fn = nullptr; } + + ~RunFinally() { if (fn) fn(); } + +private: + std::function fn; +}; + +static inline int parse_int(std::string s) { return parse_int(s.data()); } + +static inline int parse_int(std::string_view s) { return parse_int(s.data()); } + +int new_daemon_thread(void *(*start_routine) (void *), void *arg = nullptr, + const pthread_attr_t *attr = nullptr); +int new_daemon_thread(std::function &&fn); + +struct exec_t { + bool err = false; + int fd = -2; + void (*pre_exec)() = nullptr; + int (*fork)() = xfork; + const char **argv = nullptr; +}; + +int exec_command(exec_t &exec); +template +int exec_command(exec_t &exec, Args &&...args) { + const char *argv[] = {args..., nullptr}; + exec.argv = argv; + return exec_command(exec); +} +int exec_command_sync(exec_t &exec); +template +int exec_command_sync(exec_t &exec, Args &&...args) { + const char *argv[] = {args..., nullptr}; + exec.argv = argv; + return exec_command_sync(exec); +} +template +int exec_command_sync(Args &&...args) { + exec_t exec{}; + return exec_command_sync(exec, args...); +} + +bool ends_with(const std::string_view &s1, const std::string_view &s2); + +#endif \ No newline at end of file diff --git a/native/jni/utils/include/utils.h b/native/jni/utils/include/utils.h index 6aff03394..e83d0d311 100644 --- a/native/jni/utils/include/utils.h +++ b/native/jni/utils/include/utils.h @@ -1,6 +1,3 @@ -/* util.h - Header for all utility functions - */ - #pragma once #include @@ -13,228 +10,6 @@ #include #include "missing.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define UID_SHELL (get_shell_uid()) -#define UID_ROOT 0 - -// xwrap.cpp - -FILE *xfopen(const char *pathname, const char *mode); -FILE *xfdopen(int fd, const char *mode); -#define GET_MACRO(_1, _2, _3, NAME, ...) NAME -#define xopen(...) GET_MACRO(__VA_ARGS__, xopen3, xopen2)(__VA_ARGS__) -int xopen2(const char *pathname, int flags); -int xopen3(const char *pathname, int flags, mode_t mode); -int xopenat(int dirfd, const char *pathname, int flags); -ssize_t xwrite(int fd, const void *buf, size_t count); -ssize_t xread(int fd, void *buf, size_t count); -ssize_t xxread(int fd, void *buf, size_t count); -int xpipe2(int pipefd[2], int flags); -int xsetns(int fd, int nstype); -int xunshare(int flags); -DIR *xopendir(const char *name); -DIR *xfdopendir(int fd); -struct dirent *xreaddir(DIR *dirp); -pid_t xsetsid(); -int xsocket(int domain, int type, int protocol); -int xbind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); -int xconnect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); -int xlisten(int sockfd, int backlog); -int xaccept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); -void *xmalloc(size_t size); -void *xcalloc(size_t nmemb, size_t size); -void *xrealloc(void *ptr, size_t size); -ssize_t xsendmsg(int sockfd, const struct msghdr *msg, int flags); -ssize_t xrecvmsg(int sockfd, struct msghdr *msg, int flags); -int xpthread_create(pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg); -int xstat(const char *pathname, struct stat *buf); -int xlstat(const char *pathname, struct stat *buf); -int xfstat(int fd, struct stat *buf); -int xdup2(int oldfd, int newfd); -int xdup3(int oldfd, int newfd, int flags); -ssize_t xreadlink(const char *pathname, char *buf, size_t bufsiz); -ssize_t xreadlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz); -int xsymlink(const char *target, const char *linkpath); -int xsymlinkat(const char *target, int newdirfd, const char *linkpath); -int xlinkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); -int xmount(const char *source, const char *target, - const char *filesystemtype, unsigned long mountflags, - const void *data); -int xumount(const char *target); -int xumount2(const char *target, int flags); -int xrename(const char *oldpath, const char *newpath); -int xmkdir(const char *pathname, mode_t mode); -int xmkdirs(const char *pathname, mode_t mode); -int xmkdirat(int dirfd, const char *pathname, mode_t mode); -void *xmmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); -ssize_t xsendfile(int out_fd, int in_fd, off_t *offset, size_t count); -pid_t xfork(); -int xpoll(struct pollfd *fds, nfds_t nfds, int timeout); -int xinotify_init1(int flags); - -// misc.cpp - -unsigned get_shell_uid(); -int fork_dont_care(); -int fork_no_zombie(); -void gen_rand_str(char *buf, int len); -int strend(const char *s1, const char *s2); -char *rtrim(char *str); -void init_argv0(int argc, char **argv); -void set_nice_name(const char *name); -int parse_int(const char *s); - -// file.cpp - -#define do_align(p, a) (((p) + (a) - 1) / (a) * (a)) -#define align_off(p, a) (do_align(p, a) - (p)) - -struct file_attr { - struct stat st; - char con[128]; -}; - -ssize_t fd_path(int fd, char *path, size_t size); -int fd_pathat(int dirfd, const char *name, char *path, size_t size); -int mkdirs(const char *pathname, mode_t mode); -void rm_rf(const char *path); -void mv_f(const char *source, const char *destination); -void mv_dir(int src, int dest); -void cp_afc(const char *source, const char *destination); -void link_dir(int src, int dest); -int getattr(const char *path, struct file_attr *a); -int getattrat(int dirfd, const char *name, struct file_attr *a); -int fgetattr(int fd, struct file_attr *a); -int setattr(const char *path, struct file_attr *a); -int setattrat(int dirfd, const char *name, struct file_attr *a); -int fsetattr(int fd, struct file_attr *a); -void fclone_attr(int sourcefd, int targetfd); -void clone_attr(const char *source, const char *target); -void fd_full_read(int fd, void **buf, size_t *size); -void full_read(const char *filename, void **buf, size_t *size); -void write_zero(int fd, size_t size); - -#ifdef __cplusplus -} - -#include -#include -#include -#include - -#define str_contains(s, ss) ((ss) != nullptr && (s).find(ss) != std::string::npos) -#define str_starts(s, ss) ((ss) != nullptr && (s).compare(0, strlen(ss), ss) == 0) - -// RAII - -class MutexGuard { -public: - explicit MutexGuard(pthread_mutex_t &m): mutex(&m) { - pthread_mutex_lock(mutex); - } - - explicit MutexGuard(pthread_mutex_t *m): mutex(m) { - pthread_mutex_lock(mutex); - } - - ~MutexGuard() { - pthread_mutex_unlock(mutex); - } - -private: - pthread_mutex_t *mutex; -}; - -class RunFinally { -public: - explicit RunFinally(std::function &&fn): fn(std::move(fn)) {} - - void disable() { fn = nullptr; } - - ~RunFinally() { if (fn) fn(); } - -private: - std::function fn; -}; - -// file.cpp - -void file_readline(const char *file, const std::function &fn, bool trim = false); -void parse_prop_file(const char *file, const std::function - &fn); -void *__mmap(const char *filename, size_t *size, bool rw); -void frm_rf(int dirfd, std::initializer_list excl = std::initializer_list()); -void clone_dir(int src, int dest, bool overwrite = true); -void parse_mnt(const char *file, const std::function &fn); - -template -void mmap_ro(const char *filename, B &buf, size_t &sz) { - buf = (B) __mmap(filename, &sz, false); -} - -template -void mmap_ro(const char *filename, B &buf, L &sz) { - size_t __sz; - buf = (B) __mmap(filename, &__sz, false); - sz = __sz; -} - -template -void mmap_rw(const char *filename, B &buf, size_t &sz) { - buf = (B) __mmap(filename, &sz, true); -} - -template -void mmap_rw(const char *filename, B &buf, L &sz) { - size_t __sz; - buf = (B) __mmap(filename, &__sz, true); - sz = __sz; -} - -// misc.cpp - -static inline int parse_int(char *s) { return parse_int((const char *) s); } - -template -int parse_int(S __s) { return parse_int(__s.data()); } - -int new_daemon_thread(void *(*start_routine) (void *), void *arg = nullptr, - const pthread_attr_t *attr = nullptr); -int new_daemon_thread(std::function &&fn); - -struct exec_t { - bool err = false; - int fd = -2; - void (*pre_exec)() = nullptr; - int (*fork)() = xfork; - const char **argv = nullptr; -}; - -int exec_command(exec_t &exec); -template -int exec_command(exec_t &exec, Args &&...args) { - const char *argv[] = {args..., nullptr}; - exec.argv = argv; - return exec_command(exec); -} -int exec_command_sync(exec_t &exec); -template -int exec_command_sync(exec_t &exec, Args &&...args) { - const char *argv[] = {args..., nullptr}; - exec.argv = argv; - return exec_command_sync(exec); -} -template -int exec_command_sync(Args &&...args) { - exec_t exec{}; - return exec_command_sync(exec, args...); -} - -bool ends_with(const std::string_view &s1, const std::string_view &s2); - -#endif +#include "xwrap.h" +#include "files.h" +#include "misc.h" diff --git a/native/jni/utils/include/xwrap.h b/native/jni/utils/include/xwrap.h new file mode 100644 index 000000000..4f4d003d6 --- /dev/null +++ b/native/jni/utils/include/xwrap.h @@ -0,0 +1,64 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +FILE *xfopen(const char *pathname, const char *mode); +FILE *xfdopen(int fd, const char *mode); +int xopenat(int dirfd, const char *pathname, int flags); +ssize_t xwrite(int fd, const void *buf, size_t count); +ssize_t xread(int fd, void *buf, size_t count); +ssize_t xxread(int fd, void *buf, size_t count); +int xpipe2(int pipefd[2], int flags); +int xsetns(int fd, int nstype); +int xunshare(int flags); +DIR *xopendir(const char *name); +DIR *xfdopendir(int fd); +struct dirent *xreaddir(DIR *dirp); +pid_t xsetsid(); +int xsocket(int domain, int type, int protocol); +int xbind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); +int xconnect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); +int xlisten(int sockfd, int backlog); +int xaccept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); +void *xmalloc(size_t size); +void *xcalloc(size_t nmemb, size_t size); +void *xrealloc(void *ptr, size_t size); +ssize_t xsendmsg(int sockfd, const struct msghdr *msg, int flags); +ssize_t xrecvmsg(int sockfd, struct msghdr *msg, int flags); +int xpthread_create(pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine) (void *), void *arg); +int xstat(const char *pathname, struct stat *buf); +int xlstat(const char *pathname, struct stat *buf); +int xfstat(int fd, struct stat *buf); +int xdup2(int oldfd, int newfd); +int xdup3(int oldfd, int newfd, int flags); +ssize_t xreadlink(const char *pathname, char *buf, size_t bufsiz); +ssize_t xreadlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz); +int xsymlink(const char *target, const char *linkpath); +int xsymlinkat(const char *target, int newdirfd, const char *linkpath); +int xlinkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags); +int xmount(const char *source, const char *target, + const char *filesystemtype, unsigned long mountflags, + const void *data); +int xumount(const char *target); +int xumount2(const char *target, int flags); +int xrename(const char *oldpath, const char *newpath); +int xmkdir(const char *pathname, mode_t mode); +int xmkdirs(const char *pathname, mode_t mode); +int xmkdirat(int dirfd, const char *pathname, mode_t mode); +void *xmmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); +ssize_t xsendfile(int out_fd, int in_fd, off_t *offset, size_t count); +pid_t xfork(); +int xpoll(struct pollfd *fds, nfds_t nfds, int timeout); +int xinotify_init1(int flags); + +#ifdef __cplusplus +} + +int xopen(const char *pathname, int flags); +int xopen(const char *pathname, int flags, mode_t mode); + +#endif + diff --git a/native/jni/utils/xwrap.cpp b/native/jni/utils/xwrap.cpp index 6f609c656..122cef6a9 100644 --- a/native/jni/utils/xwrap.cpp +++ b/native/jni/utils/xwrap.cpp @@ -40,7 +40,7 @@ FILE *xfdopen(int fd, const char *mode) { return fp; } -int xopen2(const char *pathname, int flags) { +int xopen(const char *pathname, int flags) { int fd = open(pathname, flags); if (fd < 0) { PLOGE("open: %s", pathname); @@ -48,7 +48,7 @@ int xopen2(const char *pathname, int flags) { return fd; } -int xopen3(const char *pathname, int flags, mode_t mode) { +int xopen(const char *pathname, int flags, mode_t mode) { int fd = open(pathname, flags, mode); if (fd < 0) { PLOGE("open: %s", pathname);