mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-27 12:05:30 +00:00
Start unifying with log monitor
This commit is contained in:
parent
40766b3375
commit
82e969627a
@ -1,7 +1,34 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include jni/magiskboot/Android.mk
|
||||
include jni/magiskhide/Android.mk
|
||||
include jni/resetprop/Android.mk
|
||||
include jni/magiskpolicy/Android.mk
|
||||
include jni/su/Android.mk
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := magisk
|
||||
LOCAL_STATIC_LIBRARIES := libselinux libsepol
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/utils \
|
||||
$(LOCAL_PATH)/selinux/libselinux/include \
|
||||
$(LOCAL_PATH)/selinux/libsepol/include
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
main.c \
|
||||
utils/log_monitor.c \
|
||||
utils/vector.c \
|
||||
utils/xwrap.c
|
||||
|
||||
LOCAL_CFLAGS := -static
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
# Libraries
|
||||
include jni/selinux/libselinux/Android.mk
|
||||
include jni/selinux/libsepol/Android.mk
|
||||
|
||||
# Enable these for seperate binaries
|
||||
# By default, we create a unified binary
|
||||
|
||||
# include jni/magiskboot/Android.mk
|
||||
# include jni/magiskhide/Android.mk
|
||||
# include jni/resetprop/Android.mk
|
||||
# include jni/magiskpolicy/Android.mk
|
||||
# include jni/su/Android.mk
|
||||
|
24
jni/magisk.h
Normal file
24
jni/magisk.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef _MAGISK_H_
|
||||
#define _MAGISK_H_
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <android/log.h>
|
||||
|
||||
#define LOG_TAG "Magisk"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
|
||||
#else
|
||||
#define LOGD(...) stub(__VA_ARGS__)
|
||||
#endif
|
||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
||||
#define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
|
||||
|
||||
void stub(const char *fmt, ...);
|
||||
|
||||
// Global buffer
|
||||
#define BUF_SIZE 4096
|
||||
extern char magiskbuf[BUF_SIZE];
|
||||
|
||||
#endif
|
16
jni/main.c
Normal file
16
jni/main.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* main.c - The entry point, should be mutli-call
|
||||
*/
|
||||
|
||||
#include "utils.h"
|
||||
#include "magisk.h"
|
||||
|
||||
// Global buffer
|
||||
char magiskbuf[BUF_SIZE];
|
||||
|
||||
void stub(const char *fmt, ...) {}
|
||||
|
||||
int main(int argc, char const *argv[]) {
|
||||
// Start new thread to monitor logs
|
||||
monitor_logs();
|
||||
return 0;
|
||||
}
|
32
jni/utils/log_monitor.c
Normal file
32
jni/utils/log_monitor.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* log_monitor.c - New thread to monitor logcat
|
||||
*
|
||||
* Open a new thread to call logcat and get logs with tag "Magisk"
|
||||
* Also, write the logs to a log file for debugging purpose
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
static void *logger_thread(void *args) {
|
||||
rename("/cache/magisk.log", "/cache/last_magisk.log");
|
||||
FILE *logfile = xfopen("/cache/magisk.log", "w");
|
||||
// Disable buffering
|
||||
setbuf(logfile, NULL);
|
||||
// Start logcat
|
||||
FILE *p = popen("logcat -s Magisk", "r");
|
||||
while (fgets(magiskbuf, BUF_SIZE, p)) {
|
||||
fprintf(logfile, "%s", magiskbuf);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Start a new thread to monitor logcat and dump to file */
|
||||
void monitor_logs() {
|
||||
pthread_t log_monitor;
|
||||
pthread_create(&log_monitor, NULL, logger_thread, NULL);
|
||||
printf("Hello :)\n");
|
||||
pthread_join(log_monitor, NULL);
|
||||
}
|
21
jni/utils/utils.h
Normal file
21
jni/utils/utils.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef _UTILS_H_
|
||||
#define _UTILS_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "magisk.h"
|
||||
|
||||
// xwrap.c
|
||||
|
||||
FILE *xfopen(const char *pathname, const char *mode);
|
||||
|
||||
// vector.c
|
||||
|
||||
#include "vector.h"
|
||||
|
||||
// log_monitor.c
|
||||
|
||||
void monitor_logs();
|
||||
|
||||
#endif
|
34
jni/utils/vector.c
Normal file
34
jni/utils/vector.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* vector.c - A simple vector implementation in c
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "vector.h"
|
||||
|
||||
void vec_init(struct vector *v) {
|
||||
vec_size(v) = 0;
|
||||
vec_cap(v) = 1;
|
||||
vec_entry(v) = malloc(sizeof(void*));
|
||||
}
|
||||
|
||||
void vec_push_back(struct vector *v, void *p) {
|
||||
if (v == NULL) return;
|
||||
if (vec_size(v) == vec_cap(v)) {
|
||||
vec_cap(v) *= 2;
|
||||
vec_entry(v) = realloc(vec_entry(v), sizeof(void*) * vec_cap(v));
|
||||
}
|
||||
vec_entry(v)[vec_size(v)] = p;
|
||||
++vec_size(v);
|
||||
}
|
||||
|
||||
void vec_sort(struct vector *v, int (*compar)(const void *, const void *)) {
|
||||
qsort(vec_entry(v), vec_size(v), sizeof(void*), compar);
|
||||
}
|
||||
|
||||
void vec_destroy(struct vector *v) {
|
||||
// Will not free each entry!
|
||||
// Manually free each entry, then call this function
|
||||
vec_size(v) = 0;
|
||||
vec_cap(v) = 0;
|
||||
free(v->data);
|
||||
}
|
26
jni/utils/vector.h
Normal file
26
jni/utils/vector.h
Normal file
@ -0,0 +1,26 @@
|
||||
/* vector.h - A simple vector implementation in c
|
||||
*/
|
||||
|
||||
#ifndef _VECTOR_H_
|
||||
#define _VECTOR_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
struct vector {
|
||||
size_t size;
|
||||
size_t cap;
|
||||
void **data;
|
||||
};
|
||||
void vec_init(struct vector *v);
|
||||
void vec_push_back(struct vector *v, void *p);
|
||||
void vec_sort(struct vector *v, int (*compar)(const void *, const void *));
|
||||
void vec_destroy(struct vector *v);
|
||||
#define vec_size(v) (v)->size
|
||||
#define vec_cap(v) (v)->cap
|
||||
#define vec_entry(v) (v)->data
|
||||
/* Usage: vec_for_each(vector *v, void *e) */
|
||||
#define vec_for_each(v, e) \
|
||||
e = (v)->data[0]; \
|
||||
for (size_t _ = 0; _ < (v)->size; ++_, e = (v)->data[_])
|
||||
|
||||
#endif
|
21
jni/utils/xwrap.c
Normal file
21
jni/utils/xwrap.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* xwrap.c - wrappers around existing library functions.
|
||||
*
|
||||
* Functions with the x prefix are wrappers that either succeed or kill the
|
||||
* program with an error message, but never return failure. They usually have
|
||||
* the same arguments and return value as the function they wrap.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
FILE *xfopen(const char *pathname, const char *mode) {
|
||||
FILE *fp = fopen(pathname, mode);
|
||||
if (fp == NULL) {
|
||||
PLOGE("fopen");
|
||||
exit(1);
|
||||
}
|
||||
return fp;
|
||||
}
|
Loading…
Reference in New Issue
Block a user