亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? serial.c

?? 在LINUX下實現HA的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* $Id: serial.c,v 1.29.2.4 2004/05/12 02:04:38 alan Exp $ *//* * Linux-HA serial heartbeat code * * The basic facilities for round-robin (ring) heartbeats are * contained within. * * Copyright (C) 1999, 2000, 2001 Alan Robertson <alanr@unix.sh> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include <portability.h>#include <unistd.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <time.h>#include <fcntl.h>#include <sys/wait.h>#include <sys/utsname.h>#include <sys/stat.h>#include <sys/param.h>#include <heartbeat.h>#include <HBcomm.h>#include <clplumbing/longclock.h>#include <clplumbing/timers.h>#define PIL_PLUGINTYPE		HB_COMM_TYPE#define PIL_PLUGINTYPE_S	HB_COMM_TYPE_S#define PIL_PLUGIN		serial#define PIL_PLUGIN_S		"serial"#define PIL_PLUGINLICENSE	LICENSE_LGPL#define PIL_PLUGINLICENSEURL	URL_LGPL#include <pils/plugin.h>struct serial_private {        char *			ttyname;        int			ttyfd;		/* For direct TTY i/o */ 	int			consecutive_errors;        struct hb_media*	next;};static int		serial_baud = 0;static const char *	baudstring;/* Used to maintain a list of our serial ports in the ring */static struct hb_media*		lastserialport;static struct hb_media*	serial_new(const char * value);static void*		serial_read(struct hb_media *mp, int* lenp);static char *		ttygets(char * inbuf, int length,				struct serial_private *tty);static int		serial_write(struct hb_media*mp, void *msg , int len);static int		serial_open(struct hb_media* mp);static int		ttysetup(int fd, const char * ourtty);static int		opentty(char * serial_device);static int		serial_close(struct hb_media* mp);static int		serial_init(void);static void		serial_localdie(void);static int		serial_mtype(char **buffer);static int		serial_descr(char **buffer);static int		serial_isping(void);/* * serialclosepi is called as part of unloading the serial HBcomm plugin. * If there was any global data allocated, or file descriptors opened, etc. * which is associated with the plugin, and not a single interface * in particular, here's our chance to clean it up. */static voidserialclosepi(PILPlugin*pi){	serial_localdie();}/* * serialcloseintf called as part of shutting down the serial HBcomm interface. * If there was any global data allocated, or file descriptors opened, etc. * which is associated with the serial implementation, here's our chance * to clean it up. */static PIL_rcserialcloseintf(PILInterface* pi, void* pd){	return PIL_OK;}static struct hb_media_fns serialOps ={	serial_new,	/* Create single object function */	NULL,		/* whole-line parse function */	serial_open,	serial_close,	serial_read,	serial_write,	serial_mtype,	serial_descr,	serial_isping,};PIL_PLUGIN_BOILERPLATE("1.0", Debug, serialclosepi);static const PILPluginImports*  PluginImports;static PILPlugin*               OurPlugin;static PILInterface*		OurInterface;static struct hb_media_imports*	OurImports;static void*			interfprivate;#define LOG	PluginImports->log#define MALLOC	PluginImports->alloc#define STRDUP  PluginImports->mstrdup#define FREE	PluginImports->mfreePIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports);PIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports){	PIL_rc	rc;	/* Force the compiler to do a little type checking */	(void)(PILPluginInitFun)PIL_PLUGIN_INIT;	PluginImports = imports;	OurPlugin = us;	/* Register ourself as a plugin */	imports->register_plugin(us, &OurPIExports);  	/*  Register our interface implementation */ 	rc = imports->register_interface(us, PIL_PLUGINTYPE_S	,	PIL_PLUGIN_S	,	&serialOps	,	serialcloseintf		/*close */	,	&OurInterface	,	(void*)&OurImports	,	interfprivate); 	serial_init();	return rc;}#define		IsTTYOBJECT(mp)	((mp) && ((mp)->vf == (void*)&serial_media_fns))/*#define		TTYASSERT(mp)	ASSERT(IsTTYOBJECT(mp))*/#define		TTYASSERT(mp)#define		RTS_WARNTIME	3600static intserial_mtype (char **buffer) { 	*buffer = STRDUP("serial");	if (!*buffer) {		return 0;	}	return strlen(*buffer);}static intserial_descr (char **buffer) { 	*buffer = STRDUP("serial ring");	if (!*buffer) {		return 0;	}	return strlen(*buffer);}static intserial_isping (void) {	return 0;}/* Initialize global serial data structures */static intserial_init (void){	lastserialport = NULL;	/* This eventually ought be done through the configuration API */	if (serial_baud <= 0) {		if ((baudstring  = OurImports->ParamValue("baud")) != NULL) {			serial_baud = OurImports->StrToBaud(baudstring);		}	}	if (serial_baud <= 0 || baudstring == NULL) {		serial_baud = DEFAULTBAUD;		baudstring  = DEFAULTBAUDSTR;	}	if (ANYDEBUG) {		PILCallLog(LOG, PIL_DEBUG, "serial_init: serial_baud = 0x%x"		,	serial_baud);	}	return(HA_OK);}/* Process a serial port declaration */static struct hb_media *serial_new (const char * port){	struct	stat	sbuf;	struct hb_media * ret;	/* Let's see if this looks like it might be a serial port... */	if (*port != '/') {		PILCallLog(LOG, PIL_CRIT		,	"Serial port not full pathname [%s] in config file"		,	port);		return(NULL);	}	if (stat(port, &sbuf) < 0) {		PILCallLog(LOG, PIL_CRIT, "Nonexistent serial port [%s] in config file"		,	port);		return(NULL);	}	if (!S_ISCHR(sbuf.st_mode)) {		PILCallLog(LOG, PIL_CRIT		,	"Serial port [%s] not a char device in config file"		,	port);		return(NULL);	}	ret = (struct hb_media*)MALLOC(sizeof(struct hb_media));	if (ret != NULL) {		struct serial_private * sp;		sp = (struct serial_private*)			MALLOC(sizeof(struct serial_private));		if (sp != NULL)  {			/*			 * This implies we have to process the "new"			 * for this object in the parent process of us all...			 * otherwise we can't do this linking stuff...			 */			sp->next = lastserialport;			lastserialport=ret;			sp->ttyname = STRDUP(port);			if (sp->ttyname != NULL) {				sp->consecutive_errors = 0;				ret->name = sp->ttyname;				ret->pd = sp;			}else{				FREE(sp);				sp = NULL;			}		}		if (sp == NULL) {			FREE(ret);			ret = NULL;			PILCallLog(LOG, PIL_CRIT, "Out of memory (private serial data)");		}	}else{		PILCallLog(LOG, PIL_CRIT, "Out of memory (serial data)");	}	return(ret);}static intserial_open (struct hb_media* mp){	struct serial_private*	sp;	TTYASSERT(mp);	sp = (struct serial_private*)mp->pd;	if (OurImports->devlock(sp->ttyname) < 0) {		PILCallLog(LOG, PIL_CRIT, "cannot lock line %s", sp->ttyname);		return(HA_FAIL);	}	if ((sp->ttyfd = opentty(sp->ttyname)) < 0) {		return(HA_FAIL);	}	PILCallLog(LOG, PIL_INFO, "Starting serial heartbeat on tty %s (%s baud)"	,	sp->ttyname, baudstring);	return(HA_OK);}static intserial_close (struct hb_media* mp){	struct serial_private*	sp;	int rc;	TTYASSERT(mp);	sp = (struct serial_private*)mp->pd;	rc = close(sp->ttyfd) < 0 ? HA_FAIL : HA_OK;	OurImports->devunlock(sp->ttyname);	return rc;}/* Set up a serial line the way we want it be done */static intttysetup(int fd, const char * ourtty){	struct TERMIOS	ti;	if (GETATTR(fd, &ti) < 0) {		PILCallLog(LOG, PIL_CRIT, "cannot get tty attributes: %s", strerror(errno));		return(HA_FAIL);	}#ifndef IUCLC#	define IUCLC	0	/* Ignore it if not supported */#endif#ifndef CBAUD#	define CBAUD	0#endif	ti.c_iflag &= ~(IGNBRK|IUCLC|IXANY|IXOFF|IXON|ICRNL|PARMRK);	/* Unsure if I want PARMRK or not...  It may not matter much */	ti.c_iflag |=  (INPCK|ISTRIP|IGNCR|BRKINT);	ti.c_oflag &= ~(OPOST);	ti.c_cflag &= ~(CBAUD|CSIZE|PARENB);#ifndef CRTSCTS#	define CRTSCTS 0	/* AIX and others don't have this */#endif/* * Make a silly Linux/Gcc -Wtraditional warning go away * This is not my fault, you understand...                       ;-) * Suggestions on how to better work around it would be welcome. */#if CRTSCTS == 020000000000#	undef CRTSCTS#	define CRTSCTS 020000000000U#endif	ti.c_cflag |=  (serial_baud|(unsigned)CS8|(unsigned)CREAD	|		(unsigned)CLOCAL|(unsigned)CRTSCTS);	ti.c_lflag &= ~(ICANON|ECHO|ISIG);#ifdef HAVE_TERMIOS_C_LINE	ti.c_line = 0;#endif	ti.c_cc[VMIN] = 1;	ti.c_cc[VTIME] = 1;	if (SETATTR(fd, &ti) < 0) {		PILCallLog(LOG, PIL_CRIT, "cannot set tty attributes: %s"		,	strerror(errno));		return(HA_FAIL);	}	if (ANYDEBUG) {		PILCallLog(LOG, PIL_DEBUG, "tty setup on %s complete.", ourtty);		PILCallLog(LOG, PIL_DEBUG, "Baud rate set to: 0x%x", serial_baud);		PILCallLog(LOG, PIL_DEBUG, "ti.c_iflag = 0x%x", ti.c_iflag);		PILCallLog(LOG, PIL_DEBUG, "ti.c_oflag = 0x%x", ti.c_oflag);		PILCallLog(LOG, PIL_DEBUG, "ti.c_cflag = 0x%x", ti.c_cflag);		PILCallLog(LOG, PIL_DEBUG, "ti.c_lflag = 0x%x", ti.c_lflag);	}	/* For good measure */	FLUSH(fd);	tcsetpgrp(fd, getsid(getpid()));	return(HA_OK);}#ifndef O_NOCTTY#	define O_NOCTTY	0	/* Ignore it if not supported */#endif/* Open a tty and set it's line parameters */static intopentty(char * serial_device){	int	fd;	if ((fd=open(serial_device, O_RDWR|O_NOCTTY)) < 0 ) {		PILCallLog(LOG, PIL_CRIT, "cannot open %s: %s", serial_device		,	strerror(errno));		return(fd);	}	if (!ttysetup(fd, serial_device)) {		close(fd);		return(-1);	}	if (fcntl(fd, F_SETFD, FD_CLOEXEC)) {		PILCallLog(LOG, PIL_WARN,"Error setting the close-on-exec flag: %s"		,	strerror(errno));	}	/* Cause the other guy to flush his I/O */	tcsendbreak(fd, 0);	return(fd);}static struct hb_media* ourmedia = NULL;static voidserial_localdie(void){	int	ourtty;	if (!ourmedia || !ourmedia->pd) {		return;	}	ourtty = ((struct serial_private*)(ourmedia->pd))->ttyfd;	if (ourtty >= 0) {		if (ANYDEBUG) {			PILCallLog(LOG, PIL_DEBUG, "serial_localdie: Flushing tty");		}		tcflush(ourtty, TCIOFLUSH);	}}/* This function does all the reading from our tty ports */static void *serial_read(struct hb_media* mp, int *lenp){	char			buf[MAXLINE];	struct serial_private*	thissp;	int			startlen;	const char *		start = MSG_START;	const char *		end = MSG_END;	int			endlen;	char			*msgstring;	char			*p;	int			len = 0;	int			tmplen;			TTYASSERT(mp);	thissp = (struct serial_private*)mp->pd;	startlen = strlen(start);	if (start[startlen-1] == '\n') {		--startlen;	}	endlen = strlen(end);	if (end[endlen-1] == '\n') {		--endlen;	}		msgstring = ha_calloc(MAXMSG,1 );	if(!msgstring){		PILCallLog(LOG, PIL_CRIT, "serial_read: cannot allocate memory to msgstring ");		return(NULL);	}	msgstring[0] = 0;	p = msgstring;		/* Skip until we find a MSG_START (hopefully we skip nothing) */	while (ttygets(buf, MAXLINE, thissp) != NULL	       &&	strncmp(buf, start, startlen) != 0) {						/*nothing*/	}		len = strnlen(buf, MAXLINE) + 1;	if(len >=  MAXMSG){		PILCallLog(LOG, PIL_CRIT,  "serial_read:MSG_START exceeds MAXMSG");		ha_free(msgstring);		return(NULL);	}	tmplen = strnlen(buf, MAXLINE);		strcat(p, buf);	p += tmplen;	strcat(p, "\n");	p++;	while (ttygets(buf, MAXLINE, thissp) != NULL	       &&	strncmp(buf, MSG_END, endlen) != 0) {						len += strnlen(buf, MAXLINE) + 1;		if(len >= MAXMSG){			PILCallLog(LOG, PIL_CRIT, "serial_read:msgstring exceeds MAXMSG");			ha_free(msgstring);			return(NULL);		}						tmplen = strnlen(buf, MAXLINE);		memcpy(p, buf, tmplen);				p += tmplen;		strcat(p, "\n");		p++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月激情丁香一区二区三区| 国产亲近乱来精品视频| 欧美电影在哪看比较好| 久久色.com| 日韩和欧美一区二区三区| 欧美三级三级三级| 国产午夜亚洲精品午夜鲁丝片 | 欧美精品粉嫩高潮一区二区| 久久久亚洲欧洲日产国码αv| 一区二区三区日本| 成人白浆超碰人人人人| 精品久久久久久久久久久久久久久久久 | 在线观看区一区二| 国产片一区二区三区| 奇米精品一区二区三区在线观看| 波多野结衣中文一区| 欧美一级电影网站| 亚洲妇女屁股眼交7| 91久久精品网| 亚洲免费av在线| 成人丝袜18视频在线观看| 日韩欧美国产综合| 免费在线一区观看| 欧美日韩一区二区三区在线 | 日韩一级成人av| 午夜精品久久久久久久蜜桃app| 91最新地址在线播放| 国产精品蜜臀在线观看| 国产精品影视在线观看| 久久久蜜桃精品| 国产经典欧美精品| 韩日欧美一区二区三区| 欧美做爰猛烈大尺度电影无法无天| 久久久久久久性| 国精产品一区一区三区mba视频 | 国产精品理论在线观看| 国产91精品一区二区麻豆亚洲| 精品成人a区在线观看| 精品一区中文字幕| 久久久综合精品| 丁香另类激情小说| 中文字幕在线观看一区| 91丨porny丨户外露出| 亚洲乱码国产乱码精品精98午夜| 日本高清不卡aⅴ免费网站| 亚洲综合激情小说| 8v天堂国产在线一区二区| 不卡一区在线观看| 国产精品美女久久久久久2018 | 91国产视频在线观看| 一区二区三区在线观看视频| 一本大道久久a久久综合| 亚洲综合无码一区二区| 欧美高清www午色夜在线视频| 日本特黄久久久高潮| 久久久亚洲国产美女国产盗摄 | 全国精品久久少妇| 2019国产精品| 99re成人精品视频| 天天影视色香欲综合网老头| 精品噜噜噜噜久久久久久久久试看| 国产一区二区三区观看| 国产精品久久久久久户外露出| 色女孩综合影院| 蜜桃精品视频在线| 国产精品久久久久婷婷二区次| 欧美三区免费完整视频在线观看| 蜜桃精品在线观看| 日韩一区欧美一区| 日韩一区二区在线免费观看| 成人视屏免费看| 日韩精品色哟哟| 中文字幕精品在线不卡| 欧美精品一二三| 成人手机在线视频| 久久se精品一区二区| 亚洲人一二三区| 久久天堂av综合合色蜜桃网 | 激情偷乱视频一区二区三区| 中文字幕亚洲欧美在线不卡| 91精品国产手机| 91免费版在线看| 激情综合色丁香一区二区| 一区二区欧美精品| 国产午夜精品久久久久久免费视 | 一区二区三区四区视频精品免费| 日韩欧美成人激情| 欧美三级电影在线看| 国产白丝精品91爽爽久久| 不卡的av网站| 久久不见久久见免费视频7| 亚洲无人区一区| 丝袜a∨在线一区二区三区不卡| 免费观看日韩电影| 国产精品进线69影院| 777午夜精品免费视频| 99久久久久久99| 国产乱一区二区| 午夜精品久久久久久久99水蜜桃| 亚洲三级在线观看| 久久久99久久| 日韩精品一区二区三区视频| 欧美日韩国产综合一区二区三区| 风流少妇一区二区| 国内精品不卡在线| 蜜桃视频第一区免费观看| 亚洲va欧美va人人爽午夜| 亚洲视频中文字幕| 国产精品成人在线观看| 国产精品全国免费观看高清 | 亚洲一区二区三区激情| 国产精品视频你懂的| 国产日产欧美一区| 久久久久国产精品免费免费搜索| 日韩欧美在线综合网| 日韩欧美国产成人一区二区| 9191精品国产综合久久久久久| 欧美日韩一区二区三区视频| 欧美综合视频在线观看| 欧美三级一区二区| 欧美视频在线观看一区二区| 欧美日韩国产在线播放网站| 欧美日韩一二三区| 欧美一卡2卡3卡4卡| 欧美一区二区三区色| 日韩西西人体444www| 精品国产一区二区三区忘忧草| 2021中文字幕一区亚洲| 国产校园另类小说区| 最新成人av在线| 一区二区日韩电影| 日本不卡在线视频| 国产精品自拍毛片| 不卡的av网站| 欧美日韩你懂得| 精品sm在线观看| 亚洲人一二三区| 五月激情丁香一区二区三区| 精品中文字幕一区二区小辣椒| 国产美女一区二区三区| jlzzjlzz亚洲日本少妇| 在线欧美小视频| 日韩一区二区精品在线观看| 国产亚洲一二三区| 亚洲乱码日产精品bd| 久久激五月天综合精品| 福利电影一区二区| 欧美区一区二区三区| 精品sm在线观看| 亚洲人成网站色在线观看| 日韩成人免费在线| 国产成人99久久亚洲综合精品| 色婷婷综合五月| 欧美精品一区二区三区很污很色的| 欧美国产精品v| 视频一区在线播放| 成人性色生活片| 欧美一区二区在线看| 国产精品夫妻自拍| 麻豆视频一区二区| 91免费看片在线观看| 精品国产三级电影在线观看| 亚洲精品乱码久久久久久日本蜜臀| 毛片av一区二区| 在线精品亚洲一区二区不卡| 久久久久久综合| 日韩av一级片| 色乱码一区二区三区88| 亚洲国产综合在线| 成人av在线一区二区三区| 欧美精品丝袜中出| 亚洲欧美区自拍先锋| 国产成人精品免费一区二区| 8x8x8国产精品| 亚洲欧美另类小说视频| 国产成人精品综合在线观看| 欧美精品xxxxbbbb| 亚洲视频 欧洲视频| 国产麻豆欧美日韩一区| 欧美一级在线视频| 亚洲妇女屁股眼交7| 色综合天天综合在线视频| 久久久一区二区三区| 精品中文av资源站在线观看| 欧美精品123区| 亚洲午夜精品久久久久久久久| 99精品国产99久久久久久白柏| 久久精品欧美日韩| 久久99国内精品| 日韩一区二区在线看| 日韩av一级片| 欧美一区二区三区四区视频 | 美日韩一区二区| 欧美日韩午夜精品| 亚洲一区二区影院| 91猫先生在线| 亚洲免费观看视频| 欧美自拍丝袜亚洲| 亚洲国产精品久久艾草纯爱| 在线观看www91|