Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Startup Init Lite
提交
1de8251e
S
Startup Init Lite
项目概览
OpenHarmony
/
Startup Init Lite
接近 2 年 前同步成功
通知
3
Star
37
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Startup Init Lite
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
1de8251e
编写于
9月 22, 2022
作者:
C
cheng_jinsong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix:插件重复安装
Signed-off-by:
N
cheng_jinsong
<
chengjinsong2@huawei.com
>
上级
918f334e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
29 deletion
+32
-29
interfaces/innerkits/modulemgr/modulemgr.c
interfaces/innerkits/modulemgr/modulemgr.c
+32
-29
未找到文件。
interfaces/innerkits/modulemgr/modulemgr.c
浏览文件 @
1de8251e
...
...
@@ -81,7 +81,7 @@ typedef struct tagMODULE_ITEM {
void
*
handle
;
}
MODULE_ITEM
;
static
void
m
oduleDestroy
(
ListNode
*
node
)
static
void
M
oduleDestroy
(
ListNode
*
node
)
{
MODULE_ITEM
*
module
;
...
...
@@ -95,7 +95,7 @@ static void moduleDestroy(ListNode *node)
static
MODULE_INSTALL_ARGS
*
currentInstallArgs
=
NULL
;
static
void
*
m
oduleInstall
(
MODULE_ITEM
*
module
,
int
argc
,
const
char
*
argv
[])
static
void
*
M
oduleInstall
(
MODULE_ITEM
*
module
,
int
argc
,
const
char
*
argv
[])
{
void
*
handle
;
char
path
[
PATH_MAX
];
...
...
@@ -115,14 +115,21 @@ static void *moduleInstall(MODULE_ITEM *module, int argc, const char *argv[])
return
NULL
;
}
}
BEGET_LOGV
(
"
moduleI
nstall path %s"
,
path
);
BEGET_LOGV
(
"
Module i
nstall path %s"
,
path
);
currentInstallArgs
=
&
(
module
->
moduleMgr
->
installArgs
);
handle
=
dlopen
(
path
,
RTLD_LAZY
|
RTLD_GLOBAL
);
currentInstallArgs
=
NULL
;
BEGET_CHECK_ONLY_ELOG
(
handle
!=
NULL
,
"
m
oduleInstall path %s fail %d"
,
path
,
errno
);
BEGET_CHECK_ONLY_ELOG
(
handle
!=
NULL
,
"
M
oduleInstall path %s fail %d"
,
path
,
errno
);
return
handle
;
}
static
int
ModuleCompare
(
ListNode
*
node
,
void
*
data
)
{
MODULE_ITEM
*
module
=
(
MODULE_ITEM
*
)
node
;
return
strcmp
(
module
->
name
,
(
char
*
)
data
);
}
/*
* 用于扫描安装指定目录下所有的插件。
*/
...
...
@@ -133,6 +140,10 @@ int ModuleMgrInstall(MODULE_MGR *moduleMgr, const char *moduleName,
BEGET_LOGV
(
"ModuleMgrInstall moduleName %s"
,
moduleName
);
// Get module manager
BEGET_CHECK
(
!
(
moduleMgr
==
NULL
||
moduleName
==
NULL
),
return
-
1
);
module
=
(
MODULE_ITEM
*
)
OH_ListFind
(
&
(
moduleMgr
->
modules
),
(
void
*
)
moduleName
,
ModuleCompare
);
BEGET_ERROR_CHECK
(
module
==
NULL
,
return
0
,
"%s module already exists"
,
moduleName
);
// Create module item
module
=
(
MODULE_ITEM
*
)
malloc
(
sizeof
(
MODULE_ITEM
));
BEGET_CHECK
(
module
!=
NULL
,
return
-
1
);
...
...
@@ -142,15 +153,15 @@ int ModuleMgrInstall(MODULE_MGR *moduleMgr, const char *moduleName,
module
->
name
=
strdup
(
moduleName
);
if
(
module
->
name
==
NULL
)
{
m
oduleDestroy
((
ListNode
*
)
module
);
M
oduleDestroy
((
ListNode
*
)
module
);
return
-
1
;
}
// Install
module
->
handle
=
m
oduleInstall
(
module
,
argc
,
argv
);
module
->
handle
=
M
oduleInstall
(
module
,
argc
,
argv
);
if
(
module
->
handle
==
NULL
)
{
BEGET_LOGE
(
"Failed to install module %s"
,
moduleName
);
m
oduleDestroy
((
ListNode
*
)
module
);
M
oduleDestroy
((
ListNode
*
)
module
);
return
-
1
;
}
...
...
@@ -165,7 +176,7 @@ const MODULE_INSTALL_ARGS *ModuleMgrGetArgs(void)
return
currentInstallArgs
;
}
static
int
s
tringEndsWith
(
const
char
*
srcStr
,
const
char
*
endStr
)
static
int
S
tringEndsWith
(
const
char
*
srcStr
,
const
char
*
endStr
)
{
int
srcStrLen
=
strlen
(
srcStr
);
int
endStrLen
=
strlen
(
endStr
);
...
...
@@ -177,10 +188,9 @@ static int stringEndsWith(const char *srcStr, const char *endStr)
return
-
1
;
}
static
void
s
canModules
(
MODULE_MGR
*
moduleMgr
,
const
char
*
path
)
static
void
S
canModules
(
MODULE_MGR
*
moduleMgr
,
const
char
*
path
)
{
int
end
;
int
ret
;
DIR
*
dir
;
struct
dirent
*
file
;
...
...
@@ -197,17 +207,17 @@ static void scanModules(MODULE_MGR *moduleMgr, const char *path)
}
// Must be ended with MODULE_SUFFIX_D
end
=
s
tringEndsWith
(
file
->
d_name
,
MODULE_SUFFIX_D
);
end
=
S
tringEndsWith
(
file
->
d_name
,
MODULE_SUFFIX_D
);
if
(
end
<=
0
)
{
continue
;
}
file
->
d_name
[
end
]
=
'\0'
;
BEGET_LOGV
(
"
scanModules modul
e %s"
,
file
->
d_name
);
BEGET_LOGV
(
"
Scan module with nam
e %s"
,
file
->
d_name
);
if
(
strncmp
(
file
->
d_name
,
"lib"
,
strlen
(
"lib"
))
==
0
)
{
ret
=
ModuleMgrInstall
(
moduleMgr
,
file
->
d_name
+
strlen
(
"lib"
),
0
,
NULL
);
ModuleMgrInstall
(
moduleMgr
,
file
->
d_name
+
strlen
(
"lib"
),
0
,
NULL
);
}
else
{
ret
=
ModuleMgrInstall
(
moduleMgr
,
file
->
d_name
,
0
,
NULL
);
ModuleMgrInstall
(
moduleMgr
,
file
->
d_name
,
0
,
NULL
);
}
}
...
...
@@ -226,18 +236,18 @@ MODULE_MGR *ModuleMgrScan(const char *modulePath)
BEGET_CHECK
(
moduleMgr
!=
NULL
,
return
NULL
);
if
(
modulePath
[
0
]
==
'/'
)
{
s
canModules
(
moduleMgr
,
modulePath
);
S
canModules
(
moduleMgr
,
modulePath
);
}
else
if
(
InUpdaterMode
()
==
1
)
{
BEGET_CHECK
(
snprintf_s
(
path
,
sizeof
(
path
),
sizeof
(
path
)
-
1
,
"/%s/%s"
,
MODULE_LIB_NAME
,
modulePath
)
>
0
,
return
NULL
);
s
canModules
(
moduleMgr
,
path
);
S
canModules
(
moduleMgr
,
path
);
}
else
{
BEGET_CHECK
(
snprintf_s
(
path
,
sizeof
(
path
),
sizeof
(
path
)
-
1
,
"%s/%s"
,
MODULE_LIB_NAME
,
modulePath
)
>
0
,
return
NULL
);
CfgFiles
*
files
=
GetCfgFiles
(
path
);
for
(
int
i
=
MAX_CFG_POLICY_DIRS_CNT
-
1
;
files
&&
i
>=
0
;
i
--
)
{
if
(
files
->
paths
[
i
])
{
s
canModules
(
moduleMgr
,
files
->
paths
[
i
]);
S
canModules
(
moduleMgr
,
files
->
paths
[
i
]);
}
}
FreeCfgFiles
(
files
);
...
...
@@ -245,13 +255,6 @@ MODULE_MGR *ModuleMgrScan(const char *modulePath)
return
moduleMgr
;
}
static
int
moduleCompare
(
ListNode
*
node
,
void
*
data
)
{
MODULE_ITEM
*
module
=
(
MODULE_ITEM
*
)
node
;
return
strcmp
(
module
->
name
,
(
char
*
)
data
);
}
/*
* 卸载指定插件。
*/
...
...
@@ -261,18 +264,18 @@ void ModuleMgrUninstall(MODULE_MGR *moduleMgr, const char *name)
BEGET_CHECK
(
moduleMgr
!=
NULL
,
return
);
// Uninstall all modules if no name specified
if
(
name
==
NULL
)
{
OH_ListRemoveAll
(
&
(
moduleMgr
->
modules
),
m
oduleDestroy
);
OH_ListRemoveAll
(
&
(
moduleMgr
->
modules
),
M
oduleDestroy
);
return
;
}
BEGET_LOGV
(
"ModuleMgrUninstall moduleName %s"
,
name
);
// Find module by name
module
=
(
MODULE_ITEM
*
)
OH_ListFind
(
&
(
moduleMgr
->
modules
),
(
void
*
)
name
,
m
oduleCompare
);
module
=
(
MODULE_ITEM
*
)
OH_ListFind
(
&
(
moduleMgr
->
modules
),
(
void
*
)
name
,
M
oduleCompare
);
BEGET_ERROR_CHECK
(
module
!=
NULL
,
return
,
"Can not find module %s"
,
name
);
// Remove from the list
OH_ListRemove
((
ListNode
*
)
module
);
// Destroy the module
m
oduleDestroy
((
ListNode
*
)
module
);
M
oduleDestroy
((
ListNode
*
)
module
);
}
int
ModuleMgrGetCnt
(
const
MODULE_MGR
*
moduleMgr
)
...
...
@@ -286,7 +289,7 @@ typedef struct tagMODULE_TRAVERSAL_ARGS {
OhosModuleTraversal
traversal
;
}
MODULE_TRAVERSAL_ARGS
;
static
int
m
oduleTraversalProc
(
ListNode
*
node
,
void
*
cookie
)
static
int
M
oduleTraversalProc
(
ListNode
*
node
,
void
*
cookie
)
{
MODULE_ITEM
*
module
;
MODULE_TRAVERSAL_ARGS
*
args
;
...
...
@@ -321,5 +324,5 @@ void ModuleMgrTraversal(const MODULE_MGR *moduleMgr, void *cookie, OhosModuleTra
args
.
cookie
=
cookie
;
args
.
traversal
=
traversal
;
OH_ListTraversal
((
ListNode
*
)(
&
(
moduleMgr
->
modules
)),
(
void
*
)(
&
args
),
m
oduleTraversalProc
,
0
);
OH_ListTraversal
((
ListNode
*
)(
&
(
moduleMgr
->
modules
)),
(
void
*
)(
&
args
),
M
oduleTraversalProc
,
0
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录