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

📄 ecupde.c

📁 一个通讯程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*+-------------------------------------------------------------------------	ecupde.c - various PDE-related functions	wht@n4hgf.Mt-Park.GA.US  Defined functions:	call_logical_telno(logical)	choose_tty_for_pde(tpde)	copy_pde_to_Lvariables(tpde,trial)	logical_telno_to_pde(logical)	pde_dial(tpde)	pdetty_to_devtty(pdetty,devtty)	phdir_list_read()--------------------------------------------------------------------------*//*+:EDITS:*//*:09-10-1992-13:58-wht@n4hgf-ECU release 3.20 *//*:09-05-1992-14:17-wht@n4hgf-was starting rcvr process too early on connect *//*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA *//*:05-13-1992-13:27-wht@n4hgf-active_pde use *//*:04-24-1992-21:59-wht@n4hgf-more SCO tty name normalizing *//*:12-02-1991-20:58-wht@n4hgf-breakout into separate module */#include "ecu.h"#include "esd.h"#include "var.h"#include "ecupde.h"#include "dvent.h"#include "termecu.h"#include "ecuerror.h"#include "utmpstatus.h"DVE *hdb_choose_Any();DVE *hdb_choose_Device();PDE *phdir_list_search();char *linst_err_text();extern char errmsg[];extern char *default_tty;extern int windows_active;char phonedir_name[PHONEDIR_NAME_SIZE];char *phonedir_trigger = "#ECUPHONE\n";/*+-----------------------------------------------------------------------	phdir_list_read()return 0 if entire list read, else 1 if error (error msg in errmsg)if file does not exist, create it, asking confirm only if ininteractive (curses) mode------------------------------------------------------------------------*/intphdir_list_read(){	register token_number;	register char *cptr;	register char *token;	int itmp;	char readpde_buf[128];	FILE *fp_phone;	PDE *tpde;	char *str_token();	if(!phonedir_name[0])	{		get_home_dir(phonedir_name);		strcat(phonedir_name,"/.ecu/phone");	}TRY_OPEN:	if(!(fp_phone = fopen(phonedir_name,"r")))	{		if(errno == ENOENT)		{			if(!want_pd_create(phonedir_name))			{				strcpy(errmsg,"non-existent file not created");				return(1);			}			if((itmp = open(phonedir_name,				O_RDWR | O_CREAT | O_TRUNC,0600)) >= 0)			{				write(itmp,phonedir_trigger,strlen(phonedir_trigger));				close(itmp);				if(windows_active)	/* if called under curses */				{					dirw_bot_msg("created new (empty) directory file");					ring_bell();					Nap(1000L);				}				goto TRY_OPEN;			}			if(errno == ENOENT)			{				strcpy(errmsg,"~/.ecu directory nonexistent!");				ring_bell();				return(1);			}		}		strcpy(errmsg,errno_text(errno));		return(1);	}/* we have an open directory file */	if(!fgets(readpde_buf,sizeof(readpde_buf),fp_phone) ||		strcmp(readpde_buf,phonedir_trigger))	{		fclose(fp_phone);		strcpy(errmsg,"not an ECU phone directory (or is pre-rev-3)");		ring_bell();		return(1);	}	dirw_display_phonedir_name();	phdir_list_erase();		/* clear any previous directory */	while(fgets(readpde_buf,sizeof(readpde_buf),fp_phone))	{		if(readpde_buf[0] == '#')		/* comment? */			continue;		if(itmp = strlen(readpde_buf))	/* itmp = len; if > 0 ... */		{			itmp--;			readpde_buf[itmp] = 0;		/* ... strip trailing NL */		}		cptr = readpde_buf;				/* first call to str_token, -> buff */		while((*cptr == 0x20) || (*cptr == 0x09))			cptr++;						/* strip leading spaces */		if(*cptr == 0)					/* if line all blank, skip it */			continue;		if(!(tpde = (PDE *)malloc(sizeof(PDE ))))		{			fclose(fp_phone);			strcpy(errmsg,"Out of memory reading phone list");			return(1);		}		tpde->descr[0] = 0;		tpde->logical[0] = 0;		tpde->telno[0] = 0;		tpde->tty[0] = 0;		tpde->parity = 0;		tpde->baud = 2400;		tpde->redial = 0;		tpde->prev = (PDE *)0;		tpde->next = (PDE *)0;		tpde->debug_level = 0;		tpde->dcdwatch = 'n';		/* do not modify shm->Ldcdwatch */		token_number = 0;		while((token = str_token(cptr,":")))		{			cptr = (char *)0;	/* further calls to str_token need NULL */			switch(token_number)			{				case 0:		/* first field is logical name */					strncpy(tpde->logical,token,sizeof(tpde->logical));					tpde->logical[sizeof(tpde->logical) - 1] = 0;					break;				case 1:		/* second field is tpde->telno phone number */					strncpy(tpde->telno,token,sizeof(tpde->telno));					tpde->telno[sizeof(tpde->telno) - 1] = 0;					break;				case 2:		/* third field is line */					strncpy(tpde->tty,token,sizeof(tpde->tty));					tpde->tty[sizeof(tpde->tty) - 1] = 0;					break;				case 3:		/* fourth field is baud rate */					tpde->baud = atoi(token);					break;				case 4:		/* fifth field is parity */					switch(itmp = to_lower(token[0]))					{						case 'o':						case 'e':						case 'm':						case 's':							tpde->parity = itmp;							break;						default:						case 'n':							tpde->parity = 0;							break;					}					break;				case 5:					strncpy(tpde->descr,token,sizeof(tpde->descr));					tpde->descr[sizeof(tpde->descr) - 1] = 0;					break;				case 6:					if((tpde->debug_level = (uchar)atoi(token)) > 9)						tpde->debug_level = 9;					break;				case 7:					tpde->dcdwatch = to_lower(token[0]);					break;			}	/* end of switch(token_number) */			token_number++;		}		/* end while not end of record */		phdir_list_add(tpde);	}			/* while records left to ready */	fclose(fp_phone);	return(0);}	/* end of phdir_list_read *//*+-------------------------------------------------------------------------	pde_dial(tpde) - dial using a pde (using procedure if configured)If the tpde->logical points to a valid procedure, use it,otherwise call DCE_dial()returns proc error code        $i0 value ($s0 is also set, BTW)assumes rcvr process dead (rcvr_pid == -1)--------------------------------------------------------------------------*/intpde_dial(tpde)register PDE *tpde;{	int status = 0;	int restart_rcvr = need_rcvr_restart();	char *cptr;	extern int dcdwatch_set;	/* see ldcdwatch() in eculine.c */	dcdwatch_set = 0;	kill_rcvr_process(SIGUSR1);	if(proc_level || !find_procedure(tpde->logical))	{		if(copy_pde_to_Lvariables(tpde,0))		{			pprintf("%s: %s\n",tpde->logical,errmsg);			pprintf("Current line is %s (%s)\n",				shm->Lline,(shm->Liofd < 0) ? "closed" : "open");			status = eFATAL_ALREADY;		}		else			status = DCE_dial();	}	else	{		char *pargv[2];		pargv[0] = tpde->logical;		pargv[1] = "!MENU";		iv[0] = 0;		if(do_proc(2,pargv))			status = eFATAL_ALREADY;		else			status = (iv[0]) ? eConnectFailed : 0;	}	/*	 * if we connected and a procedure did not change the DCD watcher,	 * then use the dialing directory choice	 */	if(!status && !dcdwatch_set)	{		cptr = (char *)0;		switch(tpde->dcdwatch)		{			case '0':					ldcdwatch(DCDW_OFF); 				cptr = "OFF (ignore DCD loss)";				break;			case '1':					ldcdwatch(DCDW_ON); 				cptr = "ON (detect DCD loss)";				break;			case 't':					ldcdwatch(DCDW_TERMINATE); 				cptr = "TERMINATE (terminate ecu on DCD loss)";				break;			case 'n':				default:					break;		}		if(cptr)		{			ulong colors_save;			colors_save = colors_current;			setcolor(colors_notify);			pprintf("[DCD watcher set to %s]",cptr);			setcolor(colors_save);			fputs("\r\n",se);			pputs("\n");		}	}	if(restart_rcvr)		start_rcvr_process(1);	return(status);}	/* end of pde_dial *//*+-------------------------------------------------------------------------	pdetty_to_devtty(pdetty,devtty) -> pde tty field to complete pathname--------------------------------------------------------------------------*/voidpdetty_to_devtty(pdetty,devtty)char *pdetty;char *devtty;{	strcpy(devtty,"/dev/");#ifdef M_SYSV	if(strncmp(pdetty,"tty",3))		strcat(devtty,"tty");#endif	strcat(devtty,pdetty);}	/* end of pdetty_to_devtty *//*+-------------------------------------------------------------------------	choose_tty_for_pde(tpde) - new pde might mandate switching lineReturns 1 if new line open needed        0 if no new line open needed       -1 if request cannot be satisfied--------------------------------------------------------------------------*/intchoose_tty_for_pde(tpde)register PDE *tpde;{	int itmp = 0;	int rtn = 0;	DVE *tdve;	char newtty[64];#ifdef CHOOSE_DEBUG	char s256[256];	sprintf(s256,"choose_tty_for_pde '%s' %u",tpde->tty,tpde->baud);	ecu_log_event((int)xmtr_pid,s256);	errmsg[0] = 0;#endif	/*	 * if desired line is Devices type 

⌨️ 快捷键说明

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