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

📄 gateresources.cc

📁 EPICS CA gateway, base on channel access protocol
💻 CC
字号:
/*************************************************************************\* Copyright (c) 2002 The University of Chicago, as Operator of Argonne* National Laboratory.* Copyright (c) 2002 Berliner Speicherring-Gesellschaft fuer Synchrotron-* Strahlung mbH (BESSY).* Copyright (c) 2002 The Regents of the University of California, as* Operator of Los Alamos National Laboratory.* This file is distributed subject to a Software License Agreement found* in the file LICENSE that is included with this distribution. \*************************************************************************/// Author: Jim Kowalkowski// Date: 2/96// KE: strDup() comes from base/src/gdd/aitHelpers.h// Not clear why strdup() is not used#define GATE_RESOURCE_FILE 1#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include <time.h>#ifdef WIN32/* WIN32 does not have unistd.h and does not define the following constants */# define F_OK 00# define W_OK 02# define R_OK 04# include <direct.h>     /* for getcwd (usually in sys/parm.h or unistd.h) */# include <io.h>         /* for access, chmod  (usually in unistd.h) */#else# include <unistd.h># include <sys/utsname.h>#endif#include "cadef.h"#include "gateResources.h"#include "gateAs.h"#include <gddAppTable.h>#include <dbMapper.h>// Global variablesgateResources* global_resources;// ---------------------------- utilities ------------------------------------// Gets current time and puts it in a static array The calling program// should copy it to a safe place e.g. strcpy(savetime,timestamp());char *timeStamp(void){	static char timeStampStr[16];	long now;	struct tm *tblock;		time(&now);	tblock=localtime(&now);	strftime(timeStampStr,20,"%b %d %H:%M:%S",tblock);		return timeStampStr;}// Gets current time and puts it in a static array The calling program// should copy it to a safe place e.g. strcpy(savetime,timestamp());char *timeString(time_t time){	static char timeStr[80];	int rem=time;	int days=rem/86400;	rem-=days*86400;	int hours=rem/3600;	rem-=hours*3600;	int min=rem/60;	rem-=min*60;	int sec=rem;	sprintf(timeStr,"%3d:%02d:%02d:%02d",days,hours,min,sec);	return timeStr;}// Gets the computer name and allocates memory for it using strDup// (from base/src/gdd/aitHelpers.h)char *getComputerName(void){	char*name=NULL;#ifdef WIN32	TCHAR computerName[MAX_COMPUTERNAME_LENGTH+1];	DWORD size=MAX_COMPUTERNAME_LENGTH+1;	// Will probably be uppercase	BOOL status=GetComputerName(computerName,&size);	if(status && size > 0) {		// Convert to lowercase and copy		// OK for ANSI.  Won't work for Unicode w/o conversion.		char *pChar=computerName;		while(*pChar) *pChar=tolower(*pChar++);		name=strDup(computerName);	}#else	struct utsname ubuf;	if(uname(&ubuf) >= 0) {		// Use the name of the host		name=strDup(ubuf.nodename);	}#endif	return name;}gateResources::gateResources(void){	as = NULL;    if(access(GATE_PV_ACCESS_FILE,F_OK)==0)      access_file=strDup(GATE_PV_ACCESS_FILE);    else      access_file=NULL;        if(access(GATE_PV_LIST_FILE,F_OK)==0)      pvlist_file=strDup(GATE_PV_LIST_FILE);    else      pvlist_file=NULL;        if(access(GATE_COMMAND_FILE,F_OK)==0)      command_file=strDup(GATE_COMMAND_FILE);    else      command_file=NULL;	// Miscellaneous initializations	putlog_file=NULL;	putlogFp=NULL;	report_file=strDup(GATE_REPORT_FILE);    debug_level=0;    ro=0;	serverMode=false;#ifdef RESERVE_FOPEN_FD	reserveFp = NULL;#endif        setEventMask(DBE_VALUE | DBE_ALARM);    setConnectTimeout(GATE_CONNECT_TIMEOUT);    setInactiveTimeout(GATE_INACTIVE_TIMEOUT);    setDeadTimeout(GATE_DEAD_TIMEOUT);    setDisconnectTimeout(GATE_DISCONNECT_TIMEOUT);    setReconnectInhibit(GATE_RECONNECT_INHIBIT);        gddApplicationTypeTable& tt = gddApplicationTypeTable::AppTable();    	gddMakeMapDBR(tt);		appValue=tt.getApplicationType("value");	appUnits=tt.getApplicationType("units");	appEnum=tt.getApplicationType("enums");	appAll=tt.getApplicationType("all");	appFixed=tt.getApplicationType("fixed");	appAttributes=tt.getApplicationType("attributes");	appMenuitem=tt.getApplicationType("menuitem");	// RL: Should this rather be included in the type table?	appSTSAckString=gddDbrToAit[DBR_STSACK_STRING].app;}gateResources::~gateResources(void){	if(access_file)	delete [] access_file;	if(pvlist_file)	delete [] pvlist_file;	if(command_file) delete [] command_file;	if(putlog_file) delete [] putlog_file;	if(report_file) delete [] report_file;}int gateResources::appValue=0;int gateResources::appEnum=0;int gateResources::appAll=0;int gateResources::appMenuitem=0;int gateResources::appFixed=0;int gateResources::appUnits=0;int gateResources::appAttributes=0;int gateResources::appSTSAckString=0;int gateResources::setListFile(const char* file){	if(pvlist_file) delete [] pvlist_file;	pvlist_file=strDup(file);	return 0;}int gateResources::setAccessFile(const char* file){	if(access_file) delete [] access_file;	access_file=strDup(file);	return 0;}int gateResources::setCommandFile(const char* file){	if(command_file) delete [] command_file;	command_file=strDup(file);	return 0;}int gateResources::setPutlogFile(const char* file){	if(putlog_file) delete [] putlog_file;	putlog_file=strDup(file);	return 0;}int gateResources::setReportFile(const char* file){	if(report_file) delete [] report_file;	report_file=strDup(file);	return 0;}int gateResources::setDebugLevel(int level){	debug_level=level;	return 0;}int gateResources::setUpAccessSecurity(void){	as=new gateAs(pvlist_file,access_file);	return 0;}#ifdef RESERVE_FOPEN_FD// Functions to try to reserve a file descriptor to use for fopen.  On// Solaris, at least, fopen is limited to FDs < 256.  These could all// be used by CA and CAS sockets if there are connections to enough// IOCs  These functions try to reserve a FD < 256.FILE *gateResources::fopen(const char *filename, const char *mode){	// Close the dummy file holding the FD open    if(reserveFp) ::fclose(reserveFp);    reserveFp=NULL;		// Open the file.  It should use the lowest available FD, that is,	// the one we just made available.    FILE *fp=::fopen(filename,mode);    if(!fp) {		// Try to get the reserved one back		reserveFp=::fopen(GATE_RESERVE_FILE,"w");    }	    return fp;}int gateResources::fclose(FILE *stream){	// Close the file    int ret=::fclose(stream);		// Open the dummy file to reserve the FD just made available    reserveFp=::fopen(GATE_RESERVE_FILE,"w");	    return ret;}FILE *gateResources::openReserveFile(void){    reserveFp=::fopen(GATE_RESERVE_FILE,"w");    return reserveFp;}#endifgateAs* gateResources::getAs(void){	if(as==NULL) setUpAccessSecurity();	return as;}/* **************************** Emacs Editing Sequences ***************** *//* Local Variables: *//* tab-width: 4 *//* c-basic-offset: 4 *//* c-comment-only-line-offset: 0 *//* c-file-offsets: ((substatement-open . 0) (label . 0)) *//* End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -