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