diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/nstack_callback_ops.h | 1 | ||||
-rw-r--r-- | src/nSocket/nstack/nstack_fd_mng.c | 23 | ||||
-rw-r--r-- | src/nSocket/nstack/nstack_fd_mng.h | 1 | ||||
-rw-r--r-- | src/nSocket/nstack/nstack_socket.c | 1 |
4 files changed, 26 insertions, 0 deletions
diff --git a/src/include/nstack_callback_ops.h b/src/include/nstack_callback_ops.h index ab90cea..df24cba 100644 --- a/src/include/nstack_callback_ops.h +++ b/src/include/nstack_callback_ops.h @@ -54,6 +54,7 @@ typedef struct __nstack_proc_ops int (*fork_init_child) (pid_t p, pid_t c); void (*fork_fd) (int s, pid_t p, pid_t c); void (*fork_free_fd) (int s); + void (*fork_parent_fd) (int s, pid_t p); /*after fork, stack parent process proc again if needed. */ void (*(*ep_triggle) (int proFD, int triggle_ops, void *epinfo, void *epitem)); int (*ep_getEvt) (int proFD); diff --git a/src/nSocket/nstack/nstack_fd_mng.c b/src/nSocket/nstack/nstack_fd_mng.c index 81d3818..e90a92c 100644 --- a/src/nSocket/nstack/nstack_fd_mng.c +++ b/src/nSocket/nstack/nstack_fd_mng.c @@ -342,6 +342,29 @@ void nstack_fork_fd(pid_t ppid) } } +void nstack_fork_init_parent(pid_t ppid) +{ + int fd; + nstack_fd_Inf *fdInf = NULL; + for (fd = 0; fd < (int) NSTACK_KERNEL_FD_MAX; fd++) + { + fdInf = nstack_get_valid_inf(fd); + if ((NULL != fdInf) && (!((u32_t) (fdInf->type) & SOCK_CLOEXEC))) + { + int i; + nstack_each_mod_inx(i) + { + if ((nstack_fd_deal[i].fork_parent_fd) + && (fdInf->protoFD[i].fd >= 0)) + { + nstack_fd_deal[i].fork_parent_fd(fdInf->protoFD[i].fd, + ppid); + } + } + } + } +} + void nstack_fork_init_child(pid_t ppid) { pid_t cpid = updata_sys_pid(); diff --git a/src/nSocket/nstack/nstack_fd_mng.h b/src/nSocket/nstack/nstack_fd_mng.h index fcf7ed4..6af8c64 100644 --- a/src/nSocket/nstack/nstack_fd_mng.h +++ b/src/nSocket/nstack/nstack_fd_mng.h @@ -225,6 +225,7 @@ extern void nstack_fd_free(nstack_fd_Inf * fdInf); void nstack_fork_init_child(pid_t ppid); void nstack_fork_fd(pid_t ppid); +void nstack_fork_init_parent(pid_t ppid); #ifdef __cplusplus /* *INDENT-OFF* */ diff --git a/src/nSocket/nstack/nstack_socket.c b/src/nSocket/nstack/nstack_socket.c index a69747d..0248226 100644 --- a/src/nSocket/nstack/nstack_socket.c +++ b/src/nSocket/nstack/nstack_socket.c @@ -3095,6 +3095,7 @@ pid_t nstack_fork(void) dmm_write_lock(get_fork_lock()); if (NSTACK_MODULE_SUCCESS == g_nStackInfo.fwInited) { + nstack_fork_init_parent(ppid); fork_parent_start(ppid); pid = nsfw_base_fork(); if (pid == 0) |