⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gateway.cc

📁 EPICS CA gateway, base on channel access protocol
💻 CC
📖 第 1 页 / 共 3 页
字号:
	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 + -