Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
此号慢热型
Kernel Liteos A
提交
f76fa4a3
K
Kernel Liteos A
项目概览
此号慢热型
/
Kernel Liteos A
与 Fork 源项目一致
Fork自
OpenHarmony / Kernel Liteos A
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
Wiki
2
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
2
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f76fa4a3
编写于
5月 08, 2021
作者:
Z
zhOu
提交者:
z00427224
5月 11, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feature: support ipc copy fd to process
上级
6012acb5
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
201 addition
and
6 deletion
+201
-6
fs/include/fs/fd_table.h
fs/include/fs/fd_table.h
+2
-0
fs/vfs/include/operation/fs_file.h
fs/vfs/include/operation/fs_file.h
+4
-0
fs/vfs/operation/fs_file.c
fs/vfs/operation/fs_file.c
+177
-2
kernel/extended/liteipc/hm_liteipc.c
kernel/extended/liteipc/hm_liteipc.c
+18
-4
未找到文件。
fs/include/fs/fd_table.h
浏览文件 @
f76fa4a3
...
...
@@ -64,6 +64,8 @@ typedef struct ProcessCB LosProcessCB;
void
files_refer
(
int
fd
);
int
files_close_internal
(
int
fd
,
LosProcessCB
*
processCB
);
struct
files_struct
*
dup_fd
(
struct
files_struct
*
oldf
);
struct
files_struct
*
alloc_files
(
void
);
...
...
fs/vfs/include/operation/fs_file.h
浏览文件 @
f76fa4a3
...
...
@@ -54,4 +54,8 @@ int CheckProcessFd(int procFd);
void
FreeProcessFd
(
int
procFd
);
int
CopyFdToProc
(
int
fd
,
unsigned
int
targetPid
);
int
CloseProcFd
(
int
fd
,
unsigned
int
targetPid
);
#endif
fs/vfs/operation/fs_file.c
浏览文件 @
f76fa4a3
...
...
@@ -34,6 +34,10 @@
#include "fs/fd_table.h"
#include "fs/file.h"
#include "fs/fs.h"
#include "mqueue.h"
#ifdef LOSCFG_NET_LWIP_SACK
#include "lwip/sockets.h"
#endif
static
void
FileTableLock
(
struct
fd_table_s
*
fdt
)
{
...
...
@@ -247,7 +251,7 @@ int AllocLowestProcessFd(int minFd)
return
VFS_ERROR
;
}
/
/ occupy the fd set
/
* occupy the fd set */
FD_SET
(
procFd
,
fdt
->
proc_fds
);
FileTableUnLock
(
fdt
);
...
...
@@ -275,7 +279,7 @@ int AllocAndAssocProcessFd(int sysFd, int minFd)
return
VFS_ERROR
;
}
/
/ occupy the fd set
/
* occupy the fd set */
FD_SET
(
procFd
,
fdt
->
proc_fds
);
fdt
->
ft_fds
[
procFd
].
sysFd
=
sysFd
;
FileTableUnLock
(
fdt
);
...
...
@@ -303,3 +307,174 @@ int AllocAndAssocSystemFd(int procFd, int minFd)
return
sysFd
;
}
static
void
FdRefer
(
int
sysFd
)
{
if
((
sysFd
>
STDERR_FILENO
)
&&
(
sysFd
<
CONFIG_NFILE_DESCRIPTORS
))
{
files_refer
(
sysFd
);
}
#if defined(LOSCFG_NET_LWIP_SACK)
if
((
sysFd
>=
CONFIG_NFILE_DESCRIPTORS
)
&&
(
sysFd
<
(
CONFIG_NFILE_DESCRIPTORS
+
CONFIG_NSOCKET_DESCRIPTORS
)))
{
socks_refer
(
sysFd
);
}
#endif
#if defined(LOSCFG_COMPAT_POSIX)
if
((
sysFd
>=
MQUEUE_FD_OFFSET
)
&&
(
sysFd
<
(
MQUEUE_FD_OFFSET
+
CONFIG_NQUEUE_DESCRIPTORS
)))
{
mqueue_refer
(
sysFd
);
}
#endif
}
static
void
FdClose
(
int
sysFd
,
unsigned
int
targetPid
)
{
UINT32
intSave
;
if
((
sysFd
>
STDERR_FILENO
)
&&
(
sysFd
<
CONFIG_NFILE_DESCRIPTORS
))
{
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
targetPid
);
SCHEDULER_LOCK
(
intSave
);
if
(
OsProcessIsInactive
(
processCB
))
{
SCHEDULER_UNLOCK
(
intSave
);
return
;
}
SCHEDULER_UNLOCK
(
intSave
);
files_close_internal
(
sysFd
,
processCB
);
}
#if defined(LOSCFG_NET_LWIP_SACK)
if
((
sysFd
>=
CONFIG_NFILE_DESCRIPTORS
)
&&
(
sysFd
<
(
CONFIG_NFILE_DESCRIPTORS
+
CONFIG_NSOCKET_DESCRIPTORS
)))
{
socks_close
(
sysFd
);
}
#endif
#if defined(LOSCFG_COMPAT_POSIX)
if
((
sysFd
>=
MQUEUE_FD_OFFSET
)
&&
(
sysFd
<
(
MQUEUE_FD_OFFSET
+
CONFIG_NQUEUE_DESCRIPTORS
)))
{
mq_close
((
mqd_t
)
sysFd
);
}
#endif
}
static
struct
fd_table_s
*
GetProcessFTable
(
unsigned
int
pid
,
sem_t
*
semId
)
{
UINT32
intSave
;
struct
files_struct
*
procFiles
=
NULL
;
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
pid
);
SCHEDULER_LOCK
(
intSave
);
if
(
OsProcessIsInactive
(
processCB
))
{
SCHEDULER_UNLOCK
(
intSave
);
return
NULL
;
}
procFiles
=
processCB
->
files
;
if
(
procFiles
==
NULL
||
procFiles
->
fdt
==
NULL
)
{
SCHEDULER_UNLOCK
(
intSave
);
return
NULL
;
}
*
semId
=
procFiles
->
fdt
->
ft_sem
;
SCHEDULER_UNLOCK
(
intSave
);
return
procFiles
->
fdt
;
}
int
CopyFdToProc
(
int
fd
,
unsigned
int
targetPid
)
{
#if !defined(LOSCFG_NET_LWIP_SACK) && !defined(LOSCFG_COMPAT_POSIX) && !defined(LOSCFG_FS_VFS)
return
-
ENOSYS
;
#else
int
sysFd
;
struct
fd_table_s
*
fdt
=
NULL
;
int
procFd
;
sem_t
semId
;
if
(
OS_PID_CHECK_INVALID
(
targetPid
))
{
return
-
EINVAL
;
}
sysFd
=
GetAssociatedSystemFd
(
fd
);
if
(
sysFd
<
0
)
{
return
-
EBADF
;
}
FdRefer
(
sysFd
);
fdt
=
GetProcessFTable
(
targetPid
,
&
semId
);
if
(
fdt
==
NULL
||
fdt
->
ft_fds
==
NULL
)
{
FdClose
(
sysFd
,
targetPid
);
return
-
EPERM
;
}
/* Take the semaphore (perhaps waiting) */
if
(
sem_wait
(
&
semId
)
!=
0
)
{
/* Target process changed */
FdClose
(
sysFd
,
targetPid
);
return
-
ESRCH
;
}
procFd
=
AssignProcessFd
(
fdt
,
3
);
if
(
procFd
<
0
)
{
if
(
sem_post
(
&
semId
)
==
-
1
)
{
PRINT_ERR
(
"sem_post error, errno %d
\n
"
,
get_errno
());
}
FdClose
(
sysFd
,
targetPid
);
return
-
EPERM
;
}
/* occupy the fd set */
FD_SET
(
procFd
,
fdt
->
proc_fds
);
fdt
->
ft_fds
[
procFd
].
sysFd
=
sysFd
;
if
(
sem_post
(
&
semId
)
==
-
1
)
{
PRINTK
(
"sem_post error, errno %d
\n
"
,
get_errno
());
}
return
procFd
;
#endif
}
int
CloseProcFd
(
int
procFd
,
unsigned
int
targetPid
)
{
#if !defined(LOSCFG_NET_LWIP_SACK) && !defined(LOSCFG_COMPAT_POSIX) && !defined(LOSCFG_FS_VFS)
return
-
ENOSYS
;
#else
int
sysFd
;
struct
fd_table_s
*
fdt
=
NULL
;
sem_t
semId
;
if
(
OS_PID_CHECK_INVALID
(
targetPid
))
{
return
-
EINVAL
;
}
fdt
=
GetProcessFTable
(
targetPid
,
&
semId
);
if
(
fdt
==
NULL
||
fdt
->
ft_fds
==
NULL
)
{
return
-
EPERM
;
}
/* Take the semaphore (perhaps waiting) */
if
(
sem_wait
(
&
semId
)
!=
0
)
{
/* Target process changed */
return
-
ESRCH
;
}
if
(
!
IsValidProcessFd
(
fdt
,
procFd
))
{
if
(
sem_post
(
&
semId
)
==
-
1
)
{
PRINTK
(
"sem_post error, errno %d
\n
"
,
get_errno
());
}
return
-
EPERM
;
}
sysFd
=
fdt
->
ft_fds
[
procFd
].
sysFd
;
if
(
sysFd
<
0
)
{
if
(
sem_post
(
&
semId
)
==
-
1
)
{
PRINTK
(
"sem_post error, errno %d
\n
"
,
get_errno
());
}
return
-
EPERM
;
}
/* clean the fd set */
FD_CLR
(
procFd
,
fdt
->
proc_fds
);
fdt
->
ft_fds
[
procFd
].
sysFd
=
-
1
;
if
(
sem_post
(
&
semId
)
==
-
1
)
{
PRINTK
(
"sem_post error, errno %d
\n
"
,
get_errno
());
}
FdClose
(
sysFd
,
targetPid
);
return
0
;
#endif
}
\ No newline at end of file
kernel/extended/liteipc/hm_liteipc.c
浏览文件 @
f76fa4a3
...
...
@@ -32,6 +32,7 @@
#include "hm_liteipc.h"
#include "linux/kernel.h"
#include <fs/fs.h>
#include "fs_file.h"
#include "los_mp.h"
#include "los_mux.h"
#include "los_process_pri.h"
...
...
@@ -43,8 +44,8 @@
#include "los_trace_frame.h"
#endif
#include "los_vm_map.h"
#include "los_vm_phys.h"
#include "los_vm_page.h"
#include "los_vm_phys.h"
#include "los_vm_lock.h"
#define USE_TASKID_AS_HANDLE YES
...
...
@@ -656,9 +657,22 @@ LITE_OS_SEC_TEXT STATIC BOOL IsTaskAlive(UINT32 taskID)
return
TRUE
;
}
LITE_OS_SEC_TEXT
STATIC
UINT32
HandleFd
(
SpecialObj
*
obj
,
BOOL
isRollback
)
LITE_OS_SEC_TEXT
STATIC
UINT32
HandleFd
(
UINT32
processID
,
SpecialObj
*
obj
,
BOOL
isRollback
)
{
/* now fd is not Isolated between processes, do nothing */
int
ret
;
if
(
isRollback
==
FALSE
)
{
ret
=
CopyFdToProc
(
obj
->
content
.
fd
,
processID
);
if
(
ret
<
0
)
{
return
ret
;
}
obj
->
content
.
fd
=
ret
;
}
else
{
ret
=
CloseProcFd
(
obj
->
content
.
fd
,
processID
);
if
(
ret
<
0
)
{
return
ret
;
}
}
return
LOS_OK
;
}
...
...
@@ -719,7 +733,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleObj(UINT32 dstTid, SpecialObj *obj, BOOL is
UINT32
processID
=
OS_TCB_FROM_TID
(
dstTid
)
->
processID
;
switch
(
obj
->
type
)
{
case
OBJ_FD
:
ret
=
HandleFd
(
obj
,
isRollback
);
ret
=
HandleFd
(
processID
,
obj
,
isRollback
);
break
;
case
OBJ_PTR
:
ret
=
HandlePtr
(
processID
,
obj
,
isRollback
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录