169570cc8Sopenharmony_ci/* 269570cc8Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 369570cc8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 469570cc8Sopenharmony_ci * you may not use this file except in compliance with the License. 569570cc8Sopenharmony_ci * You may obtain a copy of the License at 669570cc8Sopenharmony_ci * 769570cc8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 869570cc8Sopenharmony_ci * 969570cc8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1069570cc8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1169570cc8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1269570cc8Sopenharmony_ci * See the License for the specific language governing permissions and 1369570cc8Sopenharmony_ci * limitations under the License. 1469570cc8Sopenharmony_ci */ 1569570cc8Sopenharmony_ci 1669570cc8Sopenharmony_ci#ifndef APPSPAWN_HOOK_H 1769570cc8Sopenharmony_ci#define APPSPAWN_HOOK_H 1869570cc8Sopenharmony_ci#include <stdint.h> 1969570cc8Sopenharmony_ci#include <stdio.h> 2069570cc8Sopenharmony_ci#include <stdlib.h> 2169570cc8Sopenharmony_ci#include <sys/stat.h> 2269570cc8Sopenharmony_ci#include <sys/types.h> 2369570cc8Sopenharmony_ci 2469570cc8Sopenharmony_ci#include "appspawn_msg.h" 2569570cc8Sopenharmony_ci#include "hookmgr.h" 2669570cc8Sopenharmony_ci#include "list.h" 2769570cc8Sopenharmony_ci 2869570cc8Sopenharmony_ci#ifdef __cplusplus 2969570cc8Sopenharmony_ci#if __cplusplus 3069570cc8Sopenharmony_ciextern "C" { 3169570cc8Sopenharmony_ci#endif 3269570cc8Sopenharmony_ci#endif 3369570cc8Sopenharmony_ci 3469570cc8Sopenharmony_citypedef struct TagAppSpawnMgr AppSpawnMgr; 3569570cc8Sopenharmony_citypedef struct TagAppSpawningCtx AppSpawningCtx; 3669570cc8Sopenharmony_citypedef struct AppSpawnContent AppSpawnContent; 3769570cc8Sopenharmony_citypedef struct AppSpawnClient AppSpawnClient; 3869570cc8Sopenharmony_citypedef struct TagAppSpawnedProcess AppSpawnedProcessInfo; 3969570cc8Sopenharmony_ci 4069570cc8Sopenharmony_citypedef enum { 4169570cc8Sopenharmony_ci EXT_DATA_SANDBOX, 4269570cc8Sopenharmony_ci EXT_DATA_NAMESPACE, 4369570cc8Sopenharmony_ci EXT_DATA_ISOLATED_SANDBOX, 4469570cc8Sopenharmony_ci} ExtDataType; 4569570cc8Sopenharmony_ci 4669570cc8Sopenharmony_cistruct TagAppSpawnExtData; 4769570cc8Sopenharmony_citypedef void (*AppSpawnExtDataFree)(struct TagAppSpawnExtData *data); 4869570cc8Sopenharmony_citypedef void (*AppSpawnExtDataDump)(struct TagAppSpawnExtData *data); 4969570cc8Sopenharmony_citypedef struct TagAppSpawnExtData { 5069570cc8Sopenharmony_ci ListNode node; 5169570cc8Sopenharmony_ci uint32_t dataId; 5269570cc8Sopenharmony_ci AppSpawnExtDataFree freeNode; 5369570cc8Sopenharmony_ci AppSpawnExtDataDump dumpNode; 5469570cc8Sopenharmony_ci} AppSpawnExtData; 5569570cc8Sopenharmony_ci 5669570cc8Sopenharmony_citypedef enum TagAppSpawnHookStage { 5769570cc8Sopenharmony_ci // 服务状态处理 5869570cc8Sopenharmony_ci STAGE_SERVER_PRELOAD = 10, 5969570cc8Sopenharmony_ci STAGE_SERVER_EXIT, 6069570cc8Sopenharmony_ci // 应用状态处理 6169570cc8Sopenharmony_ci STAGE_SERVER_APP_ADD, 6269570cc8Sopenharmony_ci STAGE_SERVER_APP_DIED, 6369570cc8Sopenharmony_ci // run before fork 6469570cc8Sopenharmony_ci STAGE_PARENT_PRE_FORK = 20, 6569570cc8Sopenharmony_ci STAGE_PARENT_POST_FORK = 21, 6669570cc8Sopenharmony_ci STAGE_PARENT_PRE_RELY = 22, 6769570cc8Sopenharmony_ci STAGE_PARENT_POST_RELY = 23, 6869570cc8Sopenharmony_ci 6969570cc8Sopenharmony_ci // run in child process 7069570cc8Sopenharmony_ci STAGE_CHILD_PRE_COLDBOOT = 30, // clear env, set token before cold boot 7169570cc8Sopenharmony_ci STAGE_CHILD_EXECUTE, 7269570cc8Sopenharmony_ci STAGE_CHILD_PRE_RELY, 7369570cc8Sopenharmony_ci STAGE_CHILD_POST_RELY, 7469570cc8Sopenharmony_ci STAGE_CHILD_PRE_RUN, 7569570cc8Sopenharmony_ci STAGE_MAX 7669570cc8Sopenharmony_ci} AppSpawnHookStage; 7769570cc8Sopenharmony_ci 7869570cc8Sopenharmony_citypedef enum TagAppSpawnHookPrio { 7969570cc8Sopenharmony_ci HOOK_PRIO_HIGHEST = 1000, 8069570cc8Sopenharmony_ci HOOK_PRIO_COMMON = 2000, 8169570cc8Sopenharmony_ci HOOK_PRIO_SANDBOX = 3000, 8269570cc8Sopenharmony_ci HOOK_PRIO_PROPERTY = 4000, 8369570cc8Sopenharmony_ci HOOK_PRIO_LOWEST = 5000, 8469570cc8Sopenharmony_ci} AppSpawnHookPrio; 8569570cc8Sopenharmony_ci 8669570cc8Sopenharmony_ci/** 8769570cc8Sopenharmony_ci * @brief 预加载处理函数 8869570cc8Sopenharmony_ci * 8969570cc8Sopenharmony_ci * @param content appspawn appspawn管理数据 9069570cc8Sopenharmony_ci * @return int 9169570cc8Sopenharmony_ci */ 9269570cc8Sopenharmony_citypedef int (*ServerStageHook)(AppSpawnMgr *content); 9369570cc8Sopenharmony_ci 9469570cc8Sopenharmony_ci/** 9569570cc8Sopenharmony_ci * @brief 应用孵化各阶段注册函数 9669570cc8Sopenharmony_ci * 9769570cc8Sopenharmony_ci * @param content appspawn appspawn管理数据 9869570cc8Sopenharmony_ci * @param property 业务孵化数据 9969570cc8Sopenharmony_ci * @return int 10069570cc8Sopenharmony_ci */ 10169570cc8Sopenharmony_citypedef int (*AppSpawnHook)(AppSpawnMgr *content, AppSpawningCtx *property); 10269570cc8Sopenharmony_ci 10369570cc8Sopenharmony_ci/** 10469570cc8Sopenharmony_ci * @brief 业务进程变化注册函数 10569570cc8Sopenharmony_ci * 10669570cc8Sopenharmony_ci * @param content appspawn appspawn管理数据 10769570cc8Sopenharmony_ci * @param appInfo 业务进程信息 10869570cc8Sopenharmony_ci * @return int 10969570cc8Sopenharmony_ci */ 11069570cc8Sopenharmony_citypedef int (*ProcessChangeHook)(const AppSpawnMgr *content, const AppSpawnedProcessInfo *appInfo); 11169570cc8Sopenharmony_ci 11269570cc8Sopenharmony_ci/** 11369570cc8Sopenharmony_ci * @brief 添加服务阶段的处理函数 11469570cc8Sopenharmony_ci * 11569570cc8Sopenharmony_ci * @param stage 阶段信息 11669570cc8Sopenharmony_ci * @param prio 优先级 11769570cc8Sopenharmony_ci * @param hook 预加载处理函数 11869570cc8Sopenharmony_ci * @return int 11969570cc8Sopenharmony_ci */ 12069570cc8Sopenharmony_ciint AddServerStageHook(AppSpawnHookStage stage, int prio, ServerStageHook hook); 12169570cc8Sopenharmony_ci 12269570cc8Sopenharmony_ci/** 12369570cc8Sopenharmony_ci * @brief 添加预加载处理函数 12469570cc8Sopenharmony_ci * 12569570cc8Sopenharmony_ci * @param prio 优先级 12669570cc8Sopenharmony_ci * @param hook 预加载处理函数 12769570cc8Sopenharmony_ci * @return int 12869570cc8Sopenharmony_ci */ 12969570cc8Sopenharmony_ci__attribute__((always_inline)) inline int AddPreloadHook(int prio, ServerStageHook hook) 13069570cc8Sopenharmony_ci{ 13169570cc8Sopenharmony_ci return AddServerStageHook(STAGE_SERVER_PRELOAD, prio, hook); 13269570cc8Sopenharmony_ci} 13369570cc8Sopenharmony_ci 13469570cc8Sopenharmony_ci/** 13569570cc8Sopenharmony_ci * @brief 按阶段添加应用孵化处理函数 13669570cc8Sopenharmony_ci * 13769570cc8Sopenharmony_ci * @param stage 阶段信息 13869570cc8Sopenharmony_ci * @param prio 优先级 13969570cc8Sopenharmony_ci * @param hook 应用孵化阶段处理函数 14069570cc8Sopenharmony_ci * @return int 14169570cc8Sopenharmony_ci */ 14269570cc8Sopenharmony_ciint AddAppSpawnHook(AppSpawnHookStage stage, int prio, AppSpawnHook hook); 14369570cc8Sopenharmony_ci 14469570cc8Sopenharmony_ci/** 14569570cc8Sopenharmony_ci * @brief 添加业务进程处理函数 14669570cc8Sopenharmony_ci * 14769570cc8Sopenharmony_ci * @param stage 阶段信息 14869570cc8Sopenharmony_ci * @param prio 优先级 14969570cc8Sopenharmony_ci * @param hook 业务进程变化处理函数 15069570cc8Sopenharmony_ci * @return int 15169570cc8Sopenharmony_ci */ 15269570cc8Sopenharmony_ciint AddProcessMgrHook(AppSpawnHookStage stage, int prio, ProcessChangeHook hook); 15369570cc8Sopenharmony_ci 15469570cc8Sopenharmony_citypedef int (*ChildLoop)(AppSpawnContent *content, AppSpawnClient *client); 15569570cc8Sopenharmony_ci/** 15669570cc8Sopenharmony_ci * @brief 注册子进程run函数 15769570cc8Sopenharmony_ci * 15869570cc8Sopenharmony_ci * @param content 15969570cc8Sopenharmony_ci * @param loop 16069570cc8Sopenharmony_ci */ 16169570cc8Sopenharmony_civoid RegChildLooper(AppSpawnContent *content, ChildLoop loop); 16269570cc8Sopenharmony_ci 16369570cc8Sopenharmony_ci/** 16469570cc8Sopenharmony_ci * @brief 按mode创建文件件 16569570cc8Sopenharmony_ci * 16669570cc8Sopenharmony_ci * @param path 路径 16769570cc8Sopenharmony_ci * @param mode mode 16869570cc8Sopenharmony_ci * @param lastPath 是否文件名 16969570cc8Sopenharmony_ci * @return int 结果 17069570cc8Sopenharmony_ci */ 17169570cc8Sopenharmony_ciint MakeDirRec(const char *path, mode_t mode, int lastPath); 17269570cc8Sopenharmony_ci__attribute__((always_inline)) inline int CreateSandboxDir(const char *path, mode_t mode) 17369570cc8Sopenharmony_ci{ 17469570cc8Sopenharmony_ci return MakeDirRec(path, mode, 1); 17569570cc8Sopenharmony_ci} 17669570cc8Sopenharmony_ci 17769570cc8Sopenharmony_ci// 扩展变量 17869570cc8Sopenharmony_citypedef struct TagSandboxContext SandboxContext; 17969570cc8Sopenharmony_citypedef struct TagVarExtraData VarExtraData; 18069570cc8Sopenharmony_citypedef int (*ReplaceVarHandler)(const SandboxContext *context, 18169570cc8Sopenharmony_ci const char *buffer, uint32_t bufferLen, uint32_t *realLen, const VarExtraData *extraData); 18269570cc8Sopenharmony_ci/** 18369570cc8Sopenharmony_ci * @brief 注册变量替换处理函数 18469570cc8Sopenharmony_ci * 18569570cc8Sopenharmony_ci * @param name 变量名 18669570cc8Sopenharmony_ci * @param handler 处理函数 18769570cc8Sopenharmony_ci * @return int 18869570cc8Sopenharmony_ci */ 18969570cc8Sopenharmony_ciint AddVariableReplaceHandler(const char *name, ReplaceVarHandler handler); 19069570cc8Sopenharmony_ci 19169570cc8Sopenharmony_citypedef struct TagAppSpawnSandboxCfg AppSpawnSandboxCfg; 19269570cc8Sopenharmony_citypedef int (*ProcessExpandSandboxCfg)(const SandboxContext *context, 19369570cc8Sopenharmony_ci const AppSpawnSandboxCfg *appSandBox, const char *name); 19469570cc8Sopenharmony_ci#define EXPAND_CFG_HANDLER_PRIO_START 3 19569570cc8Sopenharmony_ci 19669570cc8Sopenharmony_ci/** 19769570cc8Sopenharmony_ci * @brief 注册扩展属性处理函数 19869570cc8Sopenharmony_ci * 19969570cc8Sopenharmony_ci * @param name 扩展变量名 20069570cc8Sopenharmony_ci * @param handleExpandCfg 处理函数 20169570cc8Sopenharmony_ci * @return int 20269570cc8Sopenharmony_ci */ 20369570cc8Sopenharmony_ciint RegisterExpandSandboxCfgHandler(const char *name, int prio, ProcessExpandSandboxCfg handleExpandCfg); 20469570cc8Sopenharmony_ci 20569570cc8Sopenharmony_ci#ifndef MODULE_DESTRUCTOR 20669570cc8Sopenharmony_ci#define MODULE_CONSTRUCTOR(void) static void _init(void) __attribute__((constructor)); static void _init(void) 20769570cc8Sopenharmony_ci#define MODULE_DESTRUCTOR(void) static void _destroy(void) __attribute__((destructor)); static void _destroy(void) 20869570cc8Sopenharmony_ci#endif 20969570cc8Sopenharmony_ci 21069570cc8Sopenharmony_ci#ifdef __cplusplus 21169570cc8Sopenharmony_ci#if __cplusplus 21269570cc8Sopenharmony_ci} 21369570cc8Sopenharmony_ci#endif 21469570cc8Sopenharmony_ci#endif 21569570cc8Sopenharmony_ci#endif 216