OpenHarmony轻量系统服务管理|进程间通信的核心机制详解(四)

函数实现详解

更新指定router的访问策略
rust 复制代码
//为指定的router添加访问策略信息
static int AddPolicyToRouter(const Endpoint *endpoint, const SvcIdentity *saInfo,
                             const PolicyTrans *policy, uint32 policyNum)
{
    //参数检查
    if (endpoint == NULL || saInfo == NULL || policy == NULL)
    {
        return EC_INVALID;
    }
    //根据token从本地endpoint的routers中获取对应的router
    Router *router = VECTOR_At((Vector *)&endpoint->routers, saInfo->token);
    if (router == NULL)
    {
        HILOG_ERROR(HILOG_MODULE_SAMGR, "Router <%s, %u> is NULL", endpoint->name, saInfo->token);
        return EC_INVALID;
    }
    //若router的访问策略不为NULL,则不需要更新,返回EC_SUCCESS
    if (router->policy != NULL)
    {
        return EC_SUCCESS;
    }//访问策略为NULL
    //保存访问策略信息
    router->policyNum = policyNum;
    if (policyNum == 0)
    {
        //访问策略的数目为0,程序异常,返回EC_INVALID
        return EC_INVALID;
    }
    //申请内存,用于存储访问策略信息
    router->policy = (PolicyTrans *)SAMGR_Malloc(sizeof(PolicyTrans) * policyNum);
    if (router->policy == NULL)
    {
        return EC_NOMEMORY;
    }
    //拷贝访问策略信息
    if (memcpy_s(router->policy, sizeof(PolicyTrans) * policyNum, policy, sizeof(PolicyTrans) * policyNum) != EOK)
    {
        //拷贝失败,回收资源
        SAMGR_Free(router->policy);
        router->policy = NULL;
        HILOG_ERROR(HILOG_MODULE_SAMGR, "Add Policy <%s, %s, %s> Failed!",
                    endpoint->name, router->saName.service, router->saName.feature);
        return EC_FAILURE;
    }
    HILOG_DEBUG(HILOG_MODULE_SAMGR, "Add Policy <%s, %s, %s> Success",
                endpoint->name, router->saName.service, router->saName.feature);
    return EC_SUCCESS;
}
获取远端的访问策略
ini 复制代码
/*
    函数功能:从响应消息中获取访问策略信息
    函数参数:@reply:响应消息
             @policy:访问策略
             @policyNum:访问策略的数目
    函数描述:从响应消息中解析访问策略信息,根据不同的policy类型选择不同的数据解析方式。
*/
static void GetRemotePolicy(IpcIo *reply, PolicyTrans **policy, uint32 *policyNum)
{
    if (reply == NULL)
    {
        return;
    }
    uint32 i;
    uint32 j;
    //从reply中获取policy数目
    *policyNum = IpcIoPopUint32(reply);
    if (*policyNum > MAX_POLICY_NUM)
    {
        //policyNum超出最大值
        *policyNum = MAX_POLICY_NUM;
    }
    //释放旧的policy资源
    SAMGR_Free(*policy);
    if (*policyNum == 0)
    {
        *policy = NULL;
        return;
    }
    //为policy申请新的空间
    *policy = (PolicyTrans *)SAMGR_Malloc(sizeof(PolicyTrans) * (*policyNum));
    if (*policy == NULL)
    {
        return;
    }
    //循环执行policyNum次,读取policy的信息
    for (i = 0; i < *policyNum; i++)
    {
        //从reply中读消息,获取policy[i]的类型
        (*policy)[i].type = IpcIoPopInt32(reply);
        //根据类型进行不同的读取操作
        switch ((*policy)[i].type)
        {
        case RANGE:
            //按照范围值,读取最小值和最大值
            (*policy)[i].uidMin = IpcIoPopInt32(reply);
            (*policy)[i].uidMax = IpcIoPopInt32(reply);
            break;
        case FIXED:
            //按照固定值,循环读取
            for (j = 0; j < UID_SIZE; j++)
            {
                (*policy)[i].fixedUid[j] = IpcIoPopInt32(reply);
            }
            break;
        case BUNDLENAME://只允许特定应用
            (*policy)[i].fixedUid[0] = IpcIoPopInt32(reply);
            break;
        default:
            break;
        }
    }
}
校验调用者是否合法
php 复制代码
//判断callingUid值是否合法
static boolean JudgePolicy(uid_t callingUid, const PolicyTrans *policy, uint32 policyNum)
{
    if (policy == NULL)
    {
        //参数检查,未配置访问策略,返回FALSE
        HILOG_ERROR(HILOG_MODULE_SAMGR, "Policy is NULL! Num is %u", policyNum);
        return FALSE;
    }
    uint32 i;
    //遍历访问策略,合法返回true
    for (i = 0; i < policyNum; i++)
    {
        //policy类型是范围值,且uid在最小和最大值之间属于合法,返回true
        if (policy[i].type == RANGE && callingUid >= policy[i].uidMin && callingUid <= policy[i].uidMax)
        {
            return TRUE;
        }
        //policy类型是固定值,则判断policy的fixedUid集合中是否存在callingUid,若存在则返回true
        if (policy[i].type == FIXED && SearchFixedPolicy(callingUid, policy[i]))
        {
            return TRUE;
        }
    }
    return FALSE;
}
DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
校验访问策略类型为FIXED的用户权限
arduino 复制代码
//判断policy的fixedUid集合中是否存在callingUid
//若存在 返回true 否则返回 false
static boolean SearchFixedPolicy(uid_t callingUid, PolicyTrans policy)
{
    int i;
    //遍历fixedUid数组
    for (i = 0; i < UID_SIZE; i++)
    {
        //若callinguid在fixedUid数组中,则返回true
        if (callingUid == policy.fixedUid[i])
        {
            return TRUE;
        }
    }
    return FALSE;
}
相关推荐
木斯佳32 分钟前
HarmonyOS 6实战(源码解析篇):音乐播放器的音频焦点管理(上)——AudioSession与打断机制
华为·音视频·harmonyos
2601_949593651 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos
请输入蚊子2 小时前
«操作系统真像还原» 第二章 编写MBR主引导记录
linux·汇编·操作系统·bochs·操作系统真像还原
qq_177767372 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
烬头88213 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
qq_177767373 小时前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
切糕师学AI5 小时前
ARM 架构中的复位(Reset)与复位流程
arm开发·单片机·嵌入式·复位
qq_177767375 小时前
React Native鸿蒙跨平台实现消息列表用于存储所有消息数据,筛选状态用于控制消息筛选结果
javascript·react native·react.js·ecmascript·harmonyos
梵刹古音5 小时前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式