mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-27 00:37:39 +00:00
80cd85b061
In commit 8d4c407, native Magisk always launches an activity for communicating with Magisk Manager. While this works extremely well, since it also workaround stupid OEMs that blocks broadcasts, it has a problem: launching an activity will claim the focus of the device, which could be super annoying in some circumstances. This commit adds a new feature to run a broadcast test on boot complete. If Magisk Manager successfully receives the broadcast, it will toggle a setting in magiskd so all future su loggings and notifies will always use broadcasts instead of launching activities. Fix #1412
76 lines
1.3 KiB
C++
76 lines
1.3 KiB
C++
/* su.h - Store all general su info
|
|
*/
|
|
|
|
#ifndef _SU_H_
|
|
#define _SU_H_
|
|
|
|
#include <limits.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include "db.h"
|
|
|
|
#define DEFAULT_SHELL "/system/bin/sh"
|
|
|
|
// Constants for atty
|
|
#define ATTY_IN 1
|
|
#define ATTY_OUT 2
|
|
#define ATTY_ERR 4
|
|
|
|
class su_info {
|
|
public:
|
|
unsigned uid; /* Unique key to find su_info */
|
|
int count; /* Just a count for debugging purpose */
|
|
|
|
/* These values should be guarded with internal lock */
|
|
db_settings cfg;
|
|
db_strings str;
|
|
su_access access;
|
|
struct stat mgr_st;
|
|
|
|
/* These should be guarded with global cache lock */
|
|
int ref;
|
|
time_t timestamp;
|
|
|
|
su_info(unsigned uid = 0);
|
|
~su_info();
|
|
void lock();
|
|
void unlock();
|
|
bool isFresh();
|
|
void newRef();
|
|
void deRef();
|
|
|
|
private:
|
|
pthread_mutex_t _lock; /* Internal lock */
|
|
};
|
|
|
|
struct su_req_base {
|
|
unsigned uid;
|
|
bool login;
|
|
bool keepenv;
|
|
bool mount_master;
|
|
protected:
|
|
su_req_base();
|
|
} __attribute__((packed));
|
|
|
|
struct su_request : public su_req_base {
|
|
const char *shell;
|
|
const char *command;
|
|
su_request();
|
|
} __attribute__((packed));
|
|
|
|
struct su_context {
|
|
su_info *info;
|
|
su_request req;
|
|
pid_t pid;
|
|
};
|
|
|
|
// connect.c
|
|
|
|
void app_log(su_context *ctx);
|
|
void app_notify(su_context *ctx);
|
|
void app_connect(const char *socket, su_info *info);
|
|
void socket_send_request(int fd, su_info *info);
|
|
|
|
#endif
|