📄 simdrv.c
字号:
#include <stdio.h>#include <stdlib.h>#include <poll.h>#include <termio.h>#include <fcntl.h>#include <sys/stat.h>#include <unistd.h>#include <setjmp.h>#include <signal.h>#include <sys/types.h>#include <sys/wait.h>#include <string.h>#include <stdarg.h>#include <time.h>#include <errno.h>#include "simdrv.h"#include "simu112.h"#define MaxIdleSeconds 3600TESTREQMSG testReqMsg;TESTMSG testMsg;jmp_buf env;int logfp;struct ChildPidNode{ int pid; struct ChildPidNode *Next;};typedef struct ChildPidNode CHILDPIDNODE;CHILDPIDNODE *PidList;time_t IdleStart;void timeout(int sig);/* extern int s1240_conn_switch(); */extern int s1240_proc();extern int s1240_conn_switch(int port_fd);extern int result_analy();extern int sp30_proc();extern int sp30_conn_switch(int port_fd);extern int dms10_proc();extern int neax_proc();extern int neax_conn_switch(int port_fd);extern int neax_rsu_proc();extern int neax_rsu_conn_switch(int port_fd);extern int att_5ess_proc();extern int att_5ess_conn_switch(int port_fd);extern int cc08_proc();extern int cc08_conn_switch(int port_fd, char *phone_number, TESTMSG * testmsg);extern int dms100_proc();extern int dms100_conn_switch(int port_fd);extern int anet_proc();extern int anet_q3_proc();extern int ewsd_proc();extern int ewsd_conn_switch(int port_fd, char *dial_number);extern int f150_proc();extern int f150_conn_switch(int port_fd);static void sig_child_died(int sig);void writelog(int logfp, char *fmt,...);void check_log();void return_msg();int conn_switch(int sock, int SwitchType, char *telephone, char *password);void f_set_result(TESTMSG * testMsg);void DeletePidNode(CHILDPIDNODE * prevnode, CHILDPIDNODE * node);void AddPidNode(int pid);void CheckChildDied();int f_simdrv_receive(int sock, char *szBuffer, int *len, int max_len, int wait_time);int CheckIdle();int ChildDiedFlag = 0;main(){ int i, rc; int sock, cmdret, ret; int pid; struct sigaction action; /* open log file */ if ((logfp = open(LOGFILE, O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) { exit(1); } writelog(logfp, "SIMDRV startting ..."); action.sa_flags = 0; action.sa_handler = sig_child_died; sigaction(SIGCHLD, &action, NULL); PidList = NULL; IdleStart = time(NULL); for (;;) { check_log(); if (ChildDiedFlag) { CheckChildDied(); } /* if simdrv is idle too long then we exit */ if (CheckIdle() == 1) exit(0); /* receive from SIMSRV */ ret = f_simdrv_receive(0, (char *) (&testReqMsg), &rc, TESTREQSIZE, 120000); if (ret < 0) { writelog(logfp, "Socket was disconnected! SIMDRV exit! ret=%d", ret); exit(0); } if (rc == 0) continue; /* initialize TESTMSG */ memset(&testMsg, 0, TESTMSGSIZE); testMsg.CommandType = testReqMsg.CommandType; strcpy(testMsg.CorrelationTag, testReqMsg.CorrelationTag); testMsg.EndFlag = ';'; /* check msg from SIMSRV */ if (strstr((char *) (&testReqMsg),"version;")!=NULL || strstr((char *) (&testReqMsg),"VERSION;")!=NULL) { char ver_str[20]; sprintf(ver_str,"simdrv version: %s;",LIC_VERSION); write(1, ver_str, strlen(ver_str)); writelog(logfp, "request version: %s",LIC_VERSION); continue; } if (rc != TESTREQSIZE || *((char *) (&testReqMsg) + (rc - 1)) != ';') { strcpy(testMsg.Error, INSERR); return_msg(&testMsg); writelog(logfp, "ReqMsg error,rc=%d,TESTREQSIZE=%d,EndFlag=%c", rc, TESTREQSIZE, *((char *) (&testReqMsg) + (rc - 1))); continue; } /* Set IdleStart */ IdleStart = time(NULL); writelog(logfp, "exec command begin : CommandType=%d\n\ SwitchType=%d\n\ CorrelationTag=%s\n\ TSN=%s\n\ PortPassword=%s\n\ TestPortType=%c\n\ DialNumber=%s\n\ TSAddress=%s\n\ TSPortNo=%s\n\ TeleNumber=%s\n\ ExkNumber=%s\n\ Grade=%s\n\ EndFlag=%c\n", testReqMsg.CommandType, testReqMsg.SwitchType, testReqMsg.CorrelationTag, testReqMsg.TSN, testReqMsg.PortPassword, testReqMsg.TestPortType, testReqMsg.DialNumber, testReqMsg.TSAddress, testReqMsg.TSPortNo, testReqMsg.TeleNumber, testReqMsg.ExkNumber, testReqMsg.Grade, testReqMsg.EndFlag); if ((pid = fork()) == 0) { if (testReqMsg.SwitchType==DEMO) { switch (testReqMsg.CommandType) { case TST_FULL: case TST_LOOP: case MEAS_VG_DC: case MEAS_VG_AC: case MEAS_LOOP_CUREST: case MEAS_LOOP_RES: case MEAS_RES: case MEAS_CAPNC: case MEAS_IMPED: f_set_result(&testMsg); strcpy(testMsg.TestResult.SwitchName, "DEMO"); break; default: strcpy(testMsg.Error, INSERR); break; } return_msg(&testMsg); exit(0); } switch (testReqMsg.CommandType) { case TST_FULL: case TST_LOOP: case MEAS_VG_DC: case MEAS_VG_AC: case MEAS_LOOP_CUREST: case MEAS_LOOP_RES: case MEAS_RES: case MEAS_CAPNC: case MEAS_IMPED: case MEAS_NSE: case CONN_TSTSIG_SOUNDER: case MEAS_TN: case MEAS_FEEDVOL: case MEAS_LOOPRING: case MEAS_OUTPLSE: case MEAS_ISDN: case TST_RINGSGNL: case CONN_MONEST: case DISC_MON: case CONN_MONBRDGD: case CONN_FMONBRDGD: /* connect to Terminal Server, connect twice, every time no more than 10 seconds */ signal(SIGALRM, timeout); sock = -1; if (setjmp(env) == 0) { alarm(10); sock = conntcp(testReqMsg.TSAddress, testReqMsg.TSPortNo); alarm(0); } if (sock < 0) { poll(0, 0, 600); /* if fail, we wait a moment, and then connect again */ signal(SIGALRM, timeout); sock = -1; if (setjmp(env) == 0) { alarm(10); sock = conntcp(testReqMsg.TSAddress, testReqMsg.TSPortNo); alarm(0); } if (sock < 0) { writelog(logfp, "Terminal server not alive, TSAddress1:"); writelog(logfp, testReqMsg.TSPortNo); strcpy(testMsg.Error, LINEERROR); break; } } writelog(logfp, "conntcp right!"); /* if modem connection, connect modem */ if (testReqMsg.TestPortType == 'D') { if (connect_modem(sock, testReqMsg.DialNumber) < 0) { writelog(logfp, "Modem Error!"); strcpy(testMsg.Error, LINEERROR); break; } writelog(logfp, "Modem right!"); } /* auto command to exchange and analysis command result */ switch (testReqMsg.SwitchType) { case S1240E: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = s1240_proc(sock, &testReqMsg, &testMsg, S1240E); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "S1240E"); break; case S1240J: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = s1240_proc(sock, &testReqMsg, &testMsg, S1240J); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "S1240J"); break; case SP30: case SP30CN: /* f_set_result(&testMsg); cmdret=0; */ signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = sp30_proc(sock, testReqMsg.SwitchType, testReqMsg.TeleNumber, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; /*rc=write(sock,"+++ATH\r\n+++ATH\r\n+++ATH\r\n+++ATH\r\n",32); */ if (testReqMsg.SwitchType == SP30) strcpy(testMsg.TestResult.SwitchName, "SP30"); else strcpy(testMsg.TestResult.SwitchName, "SP30CN"); break; case DMS10: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = dms10_proc(sock, testReqMsg.ExkNumber, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; /*rc=write(sock,"+++ATH\r\n+++ATH\r\n+++ATH\r\n+++ATH\r\n",32); */ strcpy(testMsg.TestResult.SwitchName, "DMS10"); break; case NEAX61: /* f_set_result(&testMsg); cmdret=0; */ signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(90); cmdret = neax_proc(sock, testReqMsg.TeleNumber, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "NEAX61"); break; case NEAX_RSU: /* f_set_result(&testMsg); cmdret=0; */ signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(100); cmdret = neax_rsu_proc(sock, testReqMsg.TeleNumber, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "NEAX_RSU"); break; case S5ESS: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = att_5ess_proc(sock, testReqMsg.TeleNumber, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "5ESS"); break; case CC08: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = cc08_proc(sock, testReqMsg.TeleNumber, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "CC08"); break; case HW_AN: /* 华为接入网 */ writelog(logfp, "HW_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "HW_AN"); break; case ZX_AN: /* 中兴接入网 */ writelog(logfp, "ZX_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "ZX_AN"); break; case UT_AN: /* UTStarcom 接入网 */ writelog(logfp, "UT_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "UT_AN"); break; case BE_AN: /* 上海贝尔接入网 */ writelog(logfp, "BE_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "BE_AN"); break; case XMZ_AN: /* 西门子接入网 */ writelog(logfp, "XMZ_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "XMZ_AN"); break; case DMS100: /* f_set_result(&testMsg); cmdret=0; */ signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(90); cmdret = dms100_proc(sock, testReqMsg.TeleNumber, testReqMsg.SwitchUserName, testReqMsg.PortPassword, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "DMS100"); break; case EWSD: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(90); cmdret = ewsd_proc(sock, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "EWSD"); break; case F150: signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(90); cmdret = f150_proc(sock, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "F150"); break; case FST_AN: /* 富士通接入网 */ writelog(logfp, "FST_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "FST_AN"); break; case LX_AN: /* 朗讯接入网 */ writelog(logfp, "LX_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "LX_AN"); break; case NEC_AN: /* NEC 接入网 */ writelog(logfp, "NEC_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "NEC_AN"); break; case Q3_AN: /* 接入网Q3接口 */ writelog(logfp, "Q3_AN TYPE"); signal(SIGALRM, timeout); if (setjmp(env) == 0) { alarm(120); cmdret = anet_q3_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg); alarm(0); } else cmdret = AM_TIME_OUT; strcpy(testMsg.TestResult.SwitchName, "Q3_AN"); break; case AXE10: default: writelog(logfp, "UNKNOWN EXCHANGE TYPE"); strcpy(testMsg.Error, NOFOUND); break; } /* end of switch (testReqMsg.SwitchType) */ switch (cmdret) { case AM_NO_RESPONSE: writelog(logfp, "AM_NO_RESPONSE"); strcpy(testMsg.Error, DISCONN); break; case AM_TIME_OUT: writelog(logfp, "AM_TIME_OUT"); strcpy(testMsg.Error, DISCONN); break; case AM_INVALID_PASSWORD: writelog(logfp, "AM_INVALID_PASSWORD"); strcpy(testMsg.Error, DISCONN); break; case AM_PORT_DOWN: writelog(logfp, "AM_PORT_DOWN"); strcpy(testMsg.Error, LINEERROR); break; case AM_INVALID_PORTFD: writelog(logfp, "AM_INVALID_PORTFD"); strcpy(testMsg.Error, LINEERROR); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -