VOS_VOID* test_SnmpClient_MsgProc(VOS_CHAR *argv [])
{
const VOS_CHAR *fifo_name = "/xxx/snmpd.pipe";
VOS_INT pipe_fd = -1;
VOS_INT res = 0;
int i = 0;
int pid = 0;
const VOS_INT open_mode = O_WRONLY;
VOS_CHAR appimage[64] = {0};
VOS_CHAR acPara[SNMPDMAX_CMD_LEN] = {0};
pid_t fpid;
int status = 0;
int tyrnum = 0;
kill_snmpd();
fpid = fork();
if (fpid == 0)
{
//child process
(VOS_VOID)VOS_memset_s(argv[0], sizeof(argv[0]), 0, sizeof(argv[0]));
//while(execvp(APP_SNMPD_STUB_NAME, argv) < 0 )
(VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara),APP_SNMPD_STUB_NAME);
for(i = 0;i < g_uiargnum;i++)
{
if(i > 0)
{
(VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara)," ");
(VOS_VOID)VOS_strcat_s(acPara, sizeof(acPara),argv[i]);
}
}
while(VOS_OK != frame_Safe_System(acPara))
{
tyrnum++;
sleep(1);
if(tyrnum >= 3)
{
exit(0);
}
}
}
if (fpid > 0)
{
snmpd_parentpro_flag = VOS_TRUE;
(void)waitpid(fpid, &status, pid);
if(access(fifo_name, F_OK) == -1)
{
res = mkfifo(fifo_name, 0777);
if(res != 0)
{
MODULELOG_LOGRD(LLOG_ERROR,"Could not create fifo %s\n", fifo_name);
exit(EXIT_FAILURE);
}
(void)frame_Safe_System(SNMPDLAUNCH_CHANGE_FIFOPRI);
(void)frame_Safe_System(SNMPDLAUNCH_CHANGE_FIFOOWN);
}
MODULELOG_LOGRD(LLOG_ERROR,"Snmpd Process %d opening FIFO O_WRONLY\n", getpid());
pipe_fd = open(fifo_name, open_mode);
MODULELOG_LOGRD(LLOG_ERROR,"Process %d result %d\n", getpid(), pipe_fd);
if(pipe_fd == -1)
{
close(pipe_fd);
exit(EXIT_FAILURE);
}
test_add_snmpdpipe_fd_to_epoll(pipe_fd);
test_listen_snmpdpipe_peer_status(fpid,status);
}
else
{
exit(0);
}
close(pipe_fd);
exit(EXIT_SUCCESS);
}
VOS_INT32 frame_Safe_System(VOS_CHAR* pCmd)
{
VOS_INT32 iRet = 0;
if (VOS_FALSE == frame_CheckCmdValid(pCmd))
{
return VOS_ERR;
}
iRet=system(pCmd);
if ((-1 != iRet) && WIFEXITED(iRet) && (0 == WEXITSTATUS(iRet)))
{
return VOS_OK;
}
else
{
return VOS_ERR;
}
}
VOS_INT test_add_snmpdpipe_fd_to_epoll(VOS_INT fd)
{
VOS_INT ret = 0;
struct epoll_event ev;
ev.data.fd = fd;
ev.events = EPOLLIN | EPOLLET | EPOLLHUP | EPOLLERR;
epfd = epoll_create(SNMPDEVMAX);
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
if (ret != 0)
{
close(epfd);
return (-1);
}
}
VOS_INT test_listen_snmpdpipe_peer_status(pid_t childpid, VOS_INT status)
{
VOS_INT ret = 0;
VOS_INT i = 0;
VOS_INT count = 0;
while (1)
{
count = epoll_wait(epfd,events, SNMPDEVMAX, 1000);
for (i = 0; i < count; i++)
{
if (events[i].events & EPOLLIN)
{
MODULELOG_LOGRD(LLOG_ERROR, "\n## event=EPOLLIN\n");
}
if (events[i].events & EPOLLET)
{
MODULELOG_LOGRD(LLOG_ERROR,"\n## event=EPOLLET\n");
}
if (events[i].events & EPOLLHUP)
{
MODULELOG_LOGRD(LLOG_ERROR,"\n## event=EPOLLHUP\n");
exit(0);
}
if (events[i].events & EPOLLERR)
{
MODULELOG_LOGRD(LLOG_ERROR,"the snmpd will be reboot!");
MODULELOG_LOGRD(LLOG_ERROR,"\n## event=EPOLLERR\n");
exit(0);
}
}
}
return 0;
}