/* logging.h - Error handling and logging */ #ifndef _LOGGING_H_ #define _LOGGING_H_ #include #include #include #ifdef IS_DAEMON #include #include #define LOG_TAG "Magisk" // Global handler for PLOGE extern __thread void (*err_handler)(void); // Common error handlers static inline void exit_proc() { exit(1); } static inline void exit_thread() { pthread_exit(NULL); } static inline void do_nothing() {} // Dummy function to depress debug message static inline void stub(const char *fmt, ...) {} #ifdef MAGISK_DEBUG #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #else #define LOGD(...) stub(__VA_ARGS__) #endif #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) #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)); err_handler(); } #else // IS_DAEMON #include #define LOGE(err, ...) { fprintf(stderr, __VA_ARGS__); exit(err); } #define PLOGE(fmt, args...) { fprintf(stderr, fmt " failed with %d: %s\n\n", ##args, errno, strerror(errno)); exit(1); } #endif // IS_DAEMON #endif // _LOGGING_H_