| /* |
| ** 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 |