📄 gateway.cc
字号:
if(getrlimit(RLIMIT_CORE,&lim)<0) { fprintf(stderr,"Cannot retrieve the process FD limits\n"); } else {# if TRUNC_CORE_FILE // KE: Used to truncate it to 20000000 if GATEWAY_CORE_SIZE // was not specified. Truncating the core file makes it // unusable. Now only does it if GATEWAY_CORE_SIZE is // specified. long core_len=0; char *core_size=getenv("GATEWAY_CORE_SIZE"); if(core_size && sscanf(core_size,"%ld",&core_len) == 1) { lim.rlim_cur=core_len; if(setrlimit(RLIMIT_CORE,&lim) < 0) { fprintf(stderr,"Failed to set core limit to %d\n", (int)lim.rlim_cur); } }# endif }#endif #ifndef WIN32 save_hup=signal(SIGHUP,sig_end); save_bus=signal(SIGBUS,sig_end);#endif save_term=signal(SIGTERM,sig_end); save_int=signal(SIGINT,sig_end); save_ill=signal(SIGILL,sig_end); save_segv=signal(SIGSEGV,sig_end);#ifdef USE_SYSLOG syslog(LOG_NOTICE|LOG_DAEMON,"PV Gateway Starting");#endif // Write file headers // Output printf("%s %s [%s %s]\n", timeStamp(),GATEWAY_VERSION_STRING,__DATE__,__TIME__);#ifndef WIN32 if(global_resources->getServerMode()) { printf("%s PID=%d ServerPID=%d\n",EPICS_VERSION_STRING, sid,parent_pid); } else { printf("%s PID=%d\n",EPICS_VERSION_STRING,sid); }#else printf("%s PID=%d\n",EPICS_VERSION_STRING,sid);#endif printEnv(stdout,"EPICS_CA_ADDR_LIST"); printEnv(stdout,"EPICS_CA_AUTO_ADDR_LIST"); printEnv(stdout,"EPICS_CA_SERVER_PORT"); printEnv(stdout,"EPICS_CA_MAX_ARRAY_BYTES"); printEnv(stdout,"EPICS_CAS_INTF_ADDR_LIST"); printEnv(stdout,"EPICS_CAS_SERVER_PORT"); printEnv(stdout,"EPICS_CAS_IGNORE_ADDR_LIST"); // Get user name char userName[21]; osiGetUserNameReturn ret=osiGetUserName(userName,21); if(ret != osiGetUserNameSuccess) { strcpy(userName,"Unknown"); } userName[20]='\0'; // Get host name char *hostName=getComputerName(); if(!hostName) hostName=strDup("Unknown"); printf("Running as user %s on host %s\n",userName,hostName); delete [] hostName; // Put log FILE *putFp=global_resources->getPutlogFp(); if(putFp) { fprintf(putFp,"%s %s [%s %s]\n", timeStamp(),GATEWAY_VERSION_STRING,__DATE__,__TIME__); fprintf(putFp,"%s PID=%d\n",EPICS_VERSION_STRING,sid); fprintf(putFp,"Attempted Writes:\n"); fflush(putFp); }#if DEBUG_ENV system("printenv | grep EPICS"); fflush(stdout); fflush(stderr);#endif // Start the gateServer try { server = new gateServer(prefix); } catch(int status) { fprintf(stderr,"%s Failed to start gateServer, aborting\n", timeStamp()); char name[256]; name[0]='\0'; if(status == 0) status=errno; if(status > 0) { errSymLookup(status,name,sizeof(name)); } if(name[0]) fprintf(stderr," Reason: %s\n",name); else fprintf(stderr," Reason: Not available\n"); fflush(stdout); fflush(stderr); if(server) { delete server; server=NULL; } return 1; } catch(...) { fprintf(stderr,"%s Failed to start gateServer, aborting\n", timeStamp()); fflush(stdout); fflush(stderr); if(server) { delete server; server=NULL; } return 1; } server->mainLoop(); delete server; server = NULL; return 0;}int main(int argc, char** argv){#ifndef WIN32 uid_t uid; gid_t gid;#endif int i,j,k; int not_done=1; int no_error=1; int level=0; int read_only=0; unsigned long mask=0; int connect_tout=-1; int inactive_tout=-1; int dead_tout=-1; int disconnect_tout=-1; int reconnect_tinhib=-1; char* home_dir=NULL; char* pvlist_file=NULL; char* access_file=NULL; char* command_file=NULL; char* stat_prefix=NULL; time_t t;#ifndef WIN32 char logSaveFile[1024]; // Should use MAX_PATH or PATH_MAX char putlogSaveFile[1024]; // Should use MAX_PATH or PATH_MAX struct stat sbuf;#endif home_dir=getenv("GATEWAY_HOME"); home_directory=new char[HOME_DIR_SIZE]; // Parse command line for(i=1;i<argc && no_error;i++) { for(j=0;not_done && no_error && ptable[j].parm;j++) { if(strncmp(ptable[j].parm,argv[i],ptable[j].len)==0) { switch(ptable[j].id) { case PARM_DEBUG: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&level)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_MASK: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { for (k=0; argv[i][k]; k++) { switch (argv[i][k]) { case 'a' : case 'A' : mask |= DBE_ALARM; break; case 'v' : case 'V' : mask |= DBE_VALUE; break; case 'l' : case 'L' : mask |= DBE_LOG; break; default : break; } } not_done=0; } } break; case PARM_HELP: print_instructions(); return 0; case PARM_SERVER: make_server=1; not_done=0; break; case PARM_RO: read_only=1; not_done=0; break;#ifndef WIN32 case PARM_UID: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",(int *)&uid)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { setuid(uid); not_done=0; } } } break;#endif#ifndef WIN32 case PARM_GID: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",(int *)&gid)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { setgid(gid); not_done=0; } } } break;#endif case PARM_PVLIST: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { pvlist_file=argv[i]; not_done=0; } } break; case PARM_LOG: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { log_file=argv[i]; not_done=0; } } break; case PARM_COMMAND: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { command_file=argv[i]; not_done=0; } } break; case PARM_PUTLOG: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { putlog_file=argv[i]; not_done=0; } } break; case PARM_REPORT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { report_file=argv[i]; not_done=0; } } break; case PARM_ACCESS: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { access_file=argv[i]; not_done=0; } } break; case PARM_HOME: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { home_dir=argv[i]; not_done=0; } } break; case PARM_SERVER_IP: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { server_ip_addr=argv[i]; not_done=0; } } break; case PARM_SERVER_IGNORE_IP: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { server_ignore_ip_addr=argv[i]; not_done=0; } } break; case PARM_CLIENT_IP: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { client_ip_addr=argv[i]; not_done=0; } } break; case PARM_CLIENT_PORT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&client_port)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_SERVER_PORT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&server_port)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_DEAD: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&dead_tout)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_INACTIVE: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&inactive_tout)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_CONNECT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&connect_tout)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_DISCONNECT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&disconnect_tout)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_RECONNECT: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { if(sscanf(argv[i],"%d",&reconnect_tinhib)<1) { fprintf(stderr,"\nBad value %s for %s\n", argv[i],ptable[j].parm); no_error=0; } else { not_done=0; } } } break; case PARM_PREFIX: if(++i>=argc) no_error=0; else { if(argv[i][0]=='-') no_error=0; else { stat_prefix=argv[i]; not_done=0; } } break; default: no_error=0; fprintf(stderr,"\nBad option: %s\n",argv[i]); break; } } } not_done=1; if(ptable[j].parm==NULL) { fprintf(stderr,"\nBad option: %s\n",argv[i]); no_error=0; } } // Check if command line was valid if(no_error==0) { int ii; // Print command line fprintf(stderr,"\nBad command line\n"); for(ii=0; ii < argc; ii++) { fprintf(stderr,"%s ",argv[ii]); } fprintf(stderr,"\n\n"); // Print usage fprintf(stderr,"Usage: %s followed by the these options:\n",argv[0]); for(ii=0; ptable[ii].parm; ii++) { if(ptable[ii].desc) fprintf(stderr,"\t[%s %s ]\n",ptable[ii].parm,ptable[ii].desc); else fprintf(stderr,"\t[%s]\n",ptable[ii].parm); } getcwd(home_directory,HOME_DIR_SIZE); // Get the default resources. The values of access_file, // pvlist_file, command_file, putlog_file, and report_file // depend on whether the default filenames exist in the cwd. global_resources = new gateResources; gateResources* gr = global_resources; // Print defaults fprintf(stderr,"\nDefaults are:\n"); fprintf(stderr,"\tdebug=%d\n",gr->debugLevel()); fprintf(stderr,"\thome=%s\n", home_directory?home_directory:"Not available"); fprintf(stderr,"\tlog=%s\n",GATE_LOG_FILE); fprintf(stderr,"\taccess=%s\n",gr->accessFile()); fprintf(stderr,"\tpvlist=%s\n",gr->listFile()); fprintf(stderr,"\tcommand=%s\n",gr->commandFile()); fprintf(stderr,"\tputlog=%s\n",gr->putlogFile()); fprintf(stderr,"\treport=%s\n",gr->reportFile()); fprintf(stderr,"\tdead=%ld\n",gr->deadTimeout()); fprintf(stderr,"\tconnect=%ld\n",gr->connectTimeout()); fprintf(stderr,"\tdisconnect=%ld\n",gr->disconnectTimeout()); fprintf(stderr,"\treconnect=%ld\n",gr->reconnectInhibit());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -