1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef APPSPAWN_H 17 #define APPSPAWN_H 18 19 #include <stdint.h> 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <unistd.h> 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 /** 29 * @brief appspawn请求消息构造句柄,不支持多线程消息构建 30 * 31 * 根据业务使用AppSpawnReqMsgCreate/AppSpawnTerminateMsgCreate 构建消息 32 * 如果调用AppSpawnClientSendMsg后,消息句柄不需要处理 33 * 否则需要调用 AppSpawnReqMsgFree 释放句柄 34 * 35 * 所有字符串输入的接口,只能接受合法的字符串,输入null、""、和大于合法长度的字符串都返回错误 36 * 37 */ 38 typedef void *AppSpawnReqMsgHandle; 39 40 /** 41 * @brief 支持多线程获取句柄,这个是线程安全的。使用时,全局创建一个句柄,支持多线程发送对应线程的消息请求 42 * 43 */ 44 typedef void *AppSpawnClientHandle; 45 46 #define INVALID_PERMISSION_INDEX (-1) 47 #define INVALID_REQ_HANDLE NULL 48 #define NWEBSPAWN_SERVER_NAME "nwebspawn" 49 #define APPSPAWN_SERVER_NAME "appspawn" 50 #define CJAPPSPAWN_SERVER_NAME "cjappspawn" 51 #define NWEBSPAWN_RESTART "nwebRestart" 52 #define NATIVESPAWN_SERVER_NAME "nativespawn" 53 54 #pragma pack(4) 55 #define APP_MAX_GIDS 64 56 #define APP_USER_NAME 64 57 #define APP_MAX_FD_COUNT 16 58 #define APP_FDENV_PREFIX "APPSPAWN_FD_" 59 #define APP_FDNAME_MAXLEN 20 60 typedef struct { 61 uint32_t uid; // the UNIX uid that the child process setuid() to after fork() 62 uint32_t gid; // the UNIX gid that the child process setgid() to after fork() 63 uint32_t gidCount; // the size of gidTable 64 uint32_t gidTable[APP_MAX_GIDS]; 65 char userName[APP_USER_NAME]; 66 } AppDacInfo; 67 68 typedef struct { 69 int result; 70 pid_t pid; 71 } AppSpawnResult; 72 #pragma pack() 73 74 /** 75 * @brief init spawn client, eg: nwebspawn、appspawn 76 * 77 * @param serviceName service name, eg: nwebspawn、appspawn 78 * @param handle handle for client 79 * @return if succeed return 0,else return other value 80 */ 81 int AppSpawnClientInit(const char *serviceName, AppSpawnClientHandle *handle); 82 /** 83 * @brief destroy client 84 * 85 * @param handle handle for client 86 * @return if succeed return 0,else return other value 87 */ 88 int AppSpawnClientDestroy(AppSpawnClientHandle handle); 89 90 /** 91 * @brief send client request 92 * 93 * @param handle handle for client 94 * @param reqHandle handle for request 95 * @param result result from appspawn service 96 * @return if succeed return 0,else return other value 97 */ 98 int AppSpawnClientSendMsg(AppSpawnClientHandle handle, AppSpawnReqMsgHandle reqHandle, AppSpawnResult *result); 99 100 typedef enum { 101 MSG_APP_SPAWN = 0, 102 MSG_GET_RENDER_TERMINATION_STATUS, 103 MSG_SPAWN_NATIVE_PROCESS, 104 MSG_DUMP, 105 MSG_BEGET_CMD, 106 MSG_BEGET_SPAWNTIME, 107 MSG_UPDATE_MOUNT_POINTS, 108 MSG_RESTART_SPAWNER, 109 MSG_DEVICE_DEBUG, 110 MAX_TYPE_INVALID 111 } AppSpawnMsgType; 112 113 /** 114 * @brief create spawn request 115 * 116 * @param msgType msg type. eg: MSG_APP_SPAWN,MSG_SPAWN_NATIVE_PROCESS 117 * @param processName process name, max length is 255 118 * @param reqHandle handle for request message 119 * @return if succeed return 0,else return other value 120 */ 121 int AppSpawnReqMsgCreate(AppSpawnMsgType msgType, const char *processName, AppSpawnReqMsgHandle *reqHandle); 122 123 /** 124 * @brief create request 125 * 126 * @param pid process pid 127 * @param reqHandle handle for request message 128 * @return if succeed return 0,else return other value 129 */ 130 int AppSpawnTerminateMsgCreate(pid_t pid, AppSpawnReqMsgHandle *reqHandle); 131 132 /** 133 * @brief destroy request 134 * 135 * @param reqHandle handle for request 136 */ 137 void AppSpawnReqMsgFree(AppSpawnReqMsgHandle reqHandle); 138 139 /** 140 * @brief set bundle info 141 * 142 * @param reqHandle handle for request message 143 * @param bundleIndex bundle index 144 * @param bundleName bundle name, max length is 255 145 * @return if succeed return 0,else return other value 146 */ 147 int AppSpawnReqMsgSetBundleInfo(AppSpawnReqMsgHandle reqHandle, uint32_t bundleIndex, const char *bundleName); 148 149 /** 150 * @brief set app flags info 151 * 152 * @param reqHandle handle for request message 153 * @param flagIndex flags index from AppFlagsIndex 154 * @return if succeed return 0,else return other value 155 */ 156 typedef enum { 157 APP_FLAGS_COLD_BOOT = 0, 158 APP_FLAGS_BACKUP_EXTENSION = 1, 159 APP_FLAGS_DLP_MANAGER = 2, 160 APP_FLAGS_DEBUGGABLE = 3, 161 APP_FLAGS_ASANENABLED = 4, 162 APP_FLAGS_ACCESS_BUNDLE_DIR = 5, 163 APP_FLAGS_NATIVEDEBUG = 6, 164 APP_FLAGS_NO_SANDBOX = 7, 165 APP_FLAGS_OVERLAY = 8, 166 APP_FLAGS_BUNDLE_RESOURCES = 9, 167 APP_FLAGS_GWP_ENABLED_FORCE, // APP_GWP_ENABLED_FORCE 0x400 168 APP_FLAGS_GWP_ENABLED_NORMAL, // APP_GWP_ENABLED_NORMAL 0x800 169 APP_FLAGS_TSAN_ENABLED, // APP_TSANENABLED 0x1000 170 APP_FLAGS_IGNORE_SANDBOX = 13, // ignore sandbox result 171 APP_FLAGS_ISOLATED_SANDBOX, 172 APP_FLAGS_EXTENSION_SANDBOX, 173 APP_FLAGS_CLONE_ENABLE, 174 APP_FLAGS_DEVELOPER_MODE = 17, 175 APP_FLAGS_BEGETCTL_BOOT, // Start an app from begetctl. 176 APP_FLAGS_ATOMIC_SERVICE, 177 APP_FLAGS_CHILDPROCESS, 178 APP_FLAGS_HWASAN_ENABLED = 21, 179 APP_FLAGS_UBSAN_ENABLED = 22, 180 APP_FLAGS_ISOLATED_SANDBOX_TYPE, 181 APP_FLAGS_ISOLATED_SELINUX_LABEL, 182 APP_FLAGS_ISOLATED_SECCOMP_TYPE, 183 APP_FLAGS_ISOLATED_NETWORK, 184 APP_FLAGS_ISOLATED_DATAGROUP, 185 APP_FLAGS_TEMP_JIT = 28, 186 MAX_FLAGS_INDEX = 63, 187 } AppFlagsIndex; 188 189 int AppSpawnReqMsgSetAppFlag(AppSpawnReqMsgHandle reqHandle, AppFlagsIndex flagIndex); 190 191 /** 192 * @brief set dac info 193 * 194 * @param reqHandle handle for request message 195 * @param dacInfo dac info from AppDacInfo 196 * @return if succeed return 0,else return other value 197 */ 198 int AppSpawnReqMsgSetAppDacInfo(AppSpawnReqMsgHandle reqHandle, const AppDacInfo *dacInfo); 199 200 /** 201 * @brief set domain info 202 * 203 * @param reqHandle handle for request message 204 * @param hapFlags hap of flags 205 * @param apl apl value, max length is 31 206 * @return if succeed return 0,else return other value 207 */ 208 int AppSpawnReqMsgSetAppDomainInfo(AppSpawnReqMsgHandle reqHandle, uint32_t hapFlags, const char *apl); 209 210 /** 211 * @brief set internet permission info 212 * 213 * @param reqHandle handle for request message 214 * @param allowInternet 215 * @param setAllowInternet 216 * @return if succeed return 0,else return other value 217 */ 218 int AppSpawnReqMsgSetAppInternetPermissionInfo(AppSpawnReqMsgHandle reqHandle, uint8_t allow, uint8_t setAllow); 219 220 /** 221 * @brief set access token info 222 * 223 * @param reqHandle handle for request message 224 * @param accessTokenIdEx access tokenId 225 * @return if succeed return 0,else return other value 226 */ 227 int AppSpawnReqMsgSetAppAccessToken(AppSpawnReqMsgHandle reqHandle, uint64_t accessTokenIdEx); 228 229 /** 230 * @brief set owner info 231 * 232 * @param reqHandle handle for request message 233 * @param ownerId owner id, max length is 63 234 * @return if succeed return 0,else return other value 235 */ 236 int AppSpawnReqMsgSetAppOwnerId(AppSpawnReqMsgHandle reqHandle, const char *ownerId); 237 238 /** 239 * @brief add permission to message 240 * 241 * @param reqHandle handle for request message 242 * @param permission permission name 243 * @return if succeed return 0,else return other value 244 */ 245 int AppSpawnReqMsgAddPermission(AppSpawnReqMsgHandle reqHandle, const char *permission); 246 247 /** 248 * @brief add permission to message 249 * 250 * @param handle handle for client 251 * @param reqHandle handle for request message 252 * @param permission permission name 253 * @return if succeed return 0,else return other value 254 */ 255 int AppSpawnClientAddPermission(AppSpawnClientHandle handle, AppSpawnReqMsgHandle reqHandle, const char *permission); 256 257 /** 258 * @brief add extend info to message 259 * 260 * @param reqHandle handle for request message 261 * @param name extend name, max length is 31 262 * @param value extend value, max length is 32768 263 * @param valueLen extend value length 264 * @return if succeed return 0,else return other value 265 */ 266 #define MSG_EXT_NAME_RENDER_CMD "render-cmd" 267 #define MSG_EXT_NAME_HSP_LIST "HspList" 268 #define MSG_EXT_NAME_OVERLAY "Overlay" 269 #define MSG_EXT_NAME_DATA_GROUP "DataGroup" 270 #define MSG_EXT_NAME_APP_ENV "AppEnv" 271 #define MSG_EXT_NAME_APP_EXTENSION "AppExtension" 272 #define MSG_EXT_NAME_BEGET_PID "AppPid" 273 #define MSG_EXT_NAME_BEGET_PTY_NAME "ptyName" 274 #define MSG_EXT_NAME_ACCOUNT_ID "AccountId" 275 #define MSG_EXT_NAME_PROVISION_TYPE "ProvisionType" 276 #define MSG_EXT_NAME_PROCESS_TYPE "ProcessType" 277 #define MSG_EXT_NAME_MAX_CHILD_PROCCESS_MAX "MaxChildProcess" 278 #define MSG_EXT_NAME_APP_FD "AppFd" 279 280 int AppSpawnReqMsgAddExtInfo(AppSpawnReqMsgHandle reqHandle, const char *name, const uint8_t *value, uint32_t valueLen); 281 282 /** 283 * @brief add extend info to message 284 * 285 * @param reqHandle handle for request message 286 * @param name extend name, max length is 31 287 * @param value extend value, max length is 32767 288 * @return if succeed return 0,else return other value 289 */ 290 int AppSpawnReqMsgAddStringInfo(AppSpawnReqMsgHandle reqHandle, const char *name, const char *value); 291 292 /** 293 * @brief add fd info to message 294 * 295 * @param reqHandle handle for request message 296 * @param name fd name 297 * @param value fd value 298 * @return if succeed return 0,else return other value 299 */ 300 int AppSpawnReqMsgAddFd(AppSpawnReqMsgHandle reqHandle, const char* fdName, int fd); 301 302 /** 303 * @brief Get the permission index by permission name 304 * 305 * @param handle handle for client 306 * @param permission permission name 307 * @return int32_t permission index, if not exit, return INVALID_PERMISSION_INDEX 308 */ 309 int32_t GetPermissionIndex(AppSpawnClientHandle handle, const char *permission); 310 311 /** 312 * @brief Get the max permission Index 313 * 314 * @param handle handle for client 315 * @return int32_t max permission Index 316 */ 317 int32_t GetMaxPermissionIndex(AppSpawnClientHandle handle); 318 319 /** 320 * @brief Get the permission name by index 321 * 322 * @param handle handle for client 323 * @param index permission index 324 * @return const char* permission name 325 */ 326 const char *GetPermissionByIndex(AppSpawnClientHandle handle, int32_t index); 327 328 #ifdef __cplusplus 329 } 330 #endif 331 332 #endif 333