blob: bfff0e81eecdd16ea83802b01ae76fd498efb283 [file] [log] [blame]
/*
** Copyright 2010, Adam Shanks (@ChainsDD)
** Copyright 2008, Zinx Verituse (@zinxv)
** Copyright 2017-2018, The LineageOS Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#ifndef SU_h
#define SU_h 1
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "su"
// Lineage-specific behavior
#define LINEAGE_ROOT_ACCESS_DISABLED 0
#define LINEAGE_ROOT_ACCESS_APPS_ONLY 1
#define LINEAGE_ROOT_ACCESS_ADB_ONLY 2
#define LINEAGE_ROOT_ACCESS_APPS_AND_ADB 3
#define DAEMON_SOCKET_PATH "/dev/socket/su-daemon/"
#define DEFAULT_SHELL "/system/bin/sh"
#define xstr(a) str(a)
#define str(a) #a
#ifndef VERSION_CODE
#define VERSION_CODE 16
#endif
#define VERSION xstr(VERSION_CODE) " cm-su"
#define PROTO_VERSION 1
struct su_initiator {
pid_t pid;
unsigned uid;
unsigned user;
char name[64];
char bin[PATH_MAX];
char args[4096];
};
struct su_request {
unsigned uid;
char name[64];
int login;
int keepenv;
char* shell;
char* command;
char** argv;
int argc;
int optind;
};
struct su_context {
struct su_initiator from;
struct su_request to;
mode_t umask;
char sock_path[PATH_MAX];
};
typedef enum {
INTERACTIVE = 0,
DENY = 1,
ALLOW = 2,
} policy_t;
extern void set_identity(unsigned int uid);
static inline char* get_command(const struct su_request* to) {
if (to->command) return to->command;
if (to->shell) return to->shell;
char* ret = to->argv[to->optind];
if (ret) return ret;
return DEFAULT_SHELL;
}
int appops_start_op_su(int uid, const char* pkgName);
int appops_finish_op_su(int uid, const char* pkgName);
int run_daemon();
int connect_daemon(int argc, char* argv[], int ppid);
int su_main(int argc, char* argv[], int need_client);
// for when you give zero fucks about the state of the child process.
// this version of fork understands you don't care about the child.
// deadbeat dad fork.
int fork_zero_fucks();
#ifndef LOG_NDEBUG
#define LOG_NDEBUG 1
#endif
#include <errno.h>
#include <string.h>
#define PLOGE(fmt, args...) ALOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
#define PLOGEV(fmt, err, args...) ALOGE(fmt " failed with %d: %s", ##args, err, strerror(err))
#endif