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

📄 refclock_parse.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
			{				while (blen--)				{					*buffer++ = '.';				}				*buffer = '\0';				return b;			}			else			{				if (*src == '\\')				{					strcpy(buffer,"\\\\");					buffer += 2;					blen   -= 2;					src++;				}				else				{					sprintf(buffer, "\\x%02x", *src++);					blen   -= 4;					buffer += 4;				}			}		}		if (srclen && !blen && endb) /* overflow - set last chars to ... */			strcpy(endb, "...");	}	*buffer = '\0';	return b;}/*-------------------------------------------------- * mkascii - make a printable ascii string * assumes (unless defined better) 7-bit ASCII */static char *mkascii(	char  *buffer,	long  blen,	const char  *src,	u_long  srclen	){	return mkreadable(buffer, blen, src, srclen, 0);}/**=========================================================================== ** implementation of i/o handling methods ** (all STREAM, partial STREAM, user level) **//* * define possible io handling methods */#ifdef STREAMstatic int  ppsclock_init   P((struct parseunit *));static int  stream_init     P((struct parseunit *));static void stream_end      P((struct parseunit *));static int  stream_enable   P((struct parseunit *));static int  stream_disable  P((struct parseunit *));static int  stream_setcs    P((struct parseunit *, parsectl_t *));static int  stream_getfmt   P((struct parseunit *, parsectl_t *));static int  stream_setfmt   P((struct parseunit *, parsectl_t *));static int  stream_timecode P((struct parseunit *, parsectl_t *));static void stream_receive  P((struct recvbuf *));#endif					 static int  local_init     P((struct parseunit *));static void local_end      P((struct parseunit *));static int  local_nop      P((struct parseunit *));static int  local_setcs    P((struct parseunit *, parsectl_t *));static int  local_getfmt   P((struct parseunit *, parsectl_t *));static int  local_setfmt   P((struct parseunit *, parsectl_t *));static int  local_timecode P((struct parseunit *, parsectl_t *));static void local_receive  P((struct recvbuf *));static int  local_input    P((struct recvbuf *));static bind_t io_bindings[] ={#ifdef STREAM	{		"parse STREAM",		stream_init,		stream_end,		stream_setcs,		stream_disable,		stream_enable,		stream_getfmt,		stream_setfmt,		stream_timecode,		stream_receive,		0,	},	{		"ppsclock STREAM",		ppsclock_init,		local_end,		local_setcs,		local_nop,		local_nop,		local_getfmt,		local_setfmt,		local_timecode,		local_receive,		local_input,	},#endif	{		"normal",		local_init,		local_end,		local_setcs,		local_nop,		local_nop,		local_getfmt,		local_setfmt,		local_timecode,		local_receive,		local_input,	},	{		(char *)0,	}};#ifdef STREAM#define fix_ts(_X_) \                        if ((&(_X_))->tv.tv_usec >= 1000000)                \                          {                                                 \			    (&(_X_))->tv.tv_usec -= 1000000;                \			    (&(_X_))->tv.tv_sec  += 1;                      \			  }#define cvt_ts(_X_, _Y_) \                        {                                                   \			  l_fp ts;				            \			  fix_ts((_X_));                                    \			  if (!buftvtots((const char *)&(&(_X_))->tv, &ts)) \			    {                                               \                              ERR(ERR_BADDATA)	 		            \                                msyslog(LOG_ERR,"parse: stream_receive: timestamp conversion error (buftvtots) (%s) (%ld.%06ld) ", (_Y_), (long)(&(_X_))->tv.tv_sec, (long)(&(_X_))->tv.tv_usec);\			      return;                                       \			    }                                               \			  else                                              \			    {                                               \			      (&(_X_))->fp = ts;                            \			    }                                               \		        }/*-------------------------------------------------- * ppsclock STREAM init */static intppsclock_init(	struct parseunit *parse	){        static char m1[] = "ppsclocd";	static char m2[] = "ppsclock";		/*	 * now push the parse streams module	 * it will ensure exclusive access to the device	 */	if (ioctl(parse->generic->io.fd, I_PUSH, (caddr_t)m1) == -1 &&	    ioctl(parse->generic->io.fd, I_PUSH, (caddr_t)m2) == -1)	{		if (errno != EINVAL)		{			msyslog(LOG_ERR, "PARSE receiver #%d: ppsclock_init: ioctl(fd, I_PUSH, \"ppsclock\"): %m",				CLK_UNIT(parse->peer));		}		return 0;	}	if (!local_init(parse))	{		(void)ioctl(parse->generic->io.fd, I_POP, (caddr_t)0);		return 0;	}	parse->flags |= PARSE_PPSCLOCK;	return 1;}/*-------------------------------------------------- * parse STREAM init */static intstream_init(	struct parseunit *parse	){	static char m1[] = "parse";	/*	 * now push the parse streams module	 * to test whether it is there (neat interface 8-( )	 */	if (ioctl(parse->generic->io.fd, I_PUSH, (caddr_t)m1) == -1)	{		if (errno != EINVAL) /* accept non-existence */		{			msyslog(LOG_ERR, "PARSE receiver #%d: stream_init: ioctl(fd, I_PUSH, \"parse\"): %m", CLK_UNIT(parse->peer));		}		return 0;	}	else	{		while(ioctl(parse->generic->io.fd, I_POP, (caddr_t)0) == 0)		    /* empty loop */;		/*		 * now push it a second time after we have removed all		 * module garbage		 */		if (ioctl(parse->generic->io.fd, I_PUSH, (caddr_t)m1) == -1)		{			msyslog(LOG_ERR, "PARSE receiver #%d: stream_init: ioctl(fd, I_PUSH, \"parse\"): %m", CLK_UNIT(parse->peer));			return 0;		}		else		{			return 1;		}	}}/*-------------------------------------------------- * parse STREAM end */static voidstream_end(	struct parseunit *parse	){	while(ioctl(parse->generic->io.fd, I_POP, (caddr_t)0) == 0)	    /* empty loop */;}/*-------------------------------------------------- * STREAM setcs */static intstream_setcs(	struct parseunit *parse,	parsectl_t  *tcl	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_SETCS;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)tcl;	strioc.ic_len     = sizeof (*tcl);	if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		msyslog(LOG_ERR, "PARSE receiver #%d: stream_setcs: ioctl(fd, I_STR, PARSEIOC_SETCS): %m", CLK_UNIT(parse->peer));		return 0;	}	return 1;}/*-------------------------------------------------- * STREAM enable */static intstream_enable(	struct parseunit *parse	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_ENABLE;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)0;	strioc.ic_len     = 0;	if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		msyslog(LOG_ERR, "PARSE receiver #%d: stream_enable: ioctl(fd, I_STR, PARSEIOC_ENABLE): %m", CLK_UNIT(parse->peer));		return 0;	}	parse->generic->io.clock_recv = stream_receive; /* ok - parse input in kernel */	return 1;}/*-------------------------------------------------- * STREAM disable */static intstream_disable(	struct parseunit *parse	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_DISABLE;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)0;	strioc.ic_len     = 0;	if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		msyslog(LOG_ERR, "PARSE receiver #%d: stream_disable: ioctl(fd, I_STR, PARSEIOC_DISABLE): %m", CLK_UNIT(parse->peer));		return 0;	}	parse->generic->io.clock_recv = local_receive; /* ok - parse input in daemon */	return 1;}/*-------------------------------------------------- * STREAM getfmt */static intstream_getfmt(	struct parseunit *parse,	parsectl_t  *tcl	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_GETFMT;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)tcl;	strioc.ic_len     = sizeof (*tcl);	if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		msyslog(LOG_ERR, "PARSE receiver #%d: ioctl(fd, I_STR, PARSEIOC_GETFMT): %m", CLK_UNIT(parse->peer));		return 0;	}	return 1;}/*-------------------------------------------------- * STREAM setfmt */static intstream_setfmt(	struct parseunit *parse,	parsectl_t  *tcl	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_SETFMT;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)tcl;	strioc.ic_len     = sizeof (*tcl);	if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		msyslog(LOG_ERR, "PARSE receiver #%d: stream_setfmt: ioctl(fd, I_STR, PARSEIOC_SETFMT): %m", CLK_UNIT(parse->peer));		return 0;	}	return 1;}/*-------------------------------------------------- * STREAM timecode */static intstream_timecode(	struct parseunit *parse,	parsectl_t  *tcl	){	struct strioctl strioc;  	strioc.ic_cmd     = PARSEIOC_TIMECODE;	strioc.ic_timout  = 0;	strioc.ic_dp      = (char *)tcl;	strioc.ic_len     = sizeof (*tcl);		if (ioctl(parse->generic->io.fd, I_STR, (caddr_t)&strioc) == -1)	{		ERR(ERR_INTERNAL)			msyslog(LOG_ERR, "PARSE receiver #%d: stream_timecode: ioctl(fd, I_STR, PARSEIOC_TIMECODE): %m", CLK_UNIT(parse->peer));		return 0;	}	clear_err(parse, ERR_INTERNAL);	return 1;}/*-------------------------------------------------- * STREAM receive */static voidstream_receive(	struct recvbuf *rbufp	){	struct parseunit *parse = (struct parseunit *)((void *)rbufp->recv_srcclock);	parsetime_t parsetime;	if (!parse->peer)	    return;	if (rbufp->recv_length != sizeof(parsetime_t))	{		ERR(ERR_BADIO)			msyslog(LOG_ERR,"PARSE receiver #%d: stream_receive: bad size (got %d expected %d)",				CLK_UNIT(parse->peer), rbufp->recv_length, (int)sizeof(parsetime_t));		parse_event(parse, CEVNT_BADREPLY);		return;	}	clear_err(parse, ERR_BADIO);  	memmove((caddr_t)&parsetime,		(caddr_t)rbufp->recv_buffer,		sizeof(parsetime_t));#ifdef DEBUG	if (debug > 3)	  {	    printf("PARSE receiver #%d: status %06x, state %08x, time %lx.%08lx, stime %lx.%08lx, ptime %lx.%08lx\n",		   CLK_UNIT(parse->peer),		   (unsigned int)parsetime.parse_status,		   (unsigned int)parsetime.parse_state,		   (unsigned long)parsetime.parse_time.tv.tv_sec,		   (unsigned long)parsetime.parse_time.tv.tv_usec,		   (unsigned long)parsetime.parse_stime.tv.tv_sec,		   (unsigned long)parsetime.parse_stime.tv.tv_usec,		   (unsigned long)parsetime.parse_ptime.tv.tv_sec,		   (unsigned long)parsetime.parse_ptime.tv.tv_usec);	  }#endif	/*	 * switch time stamp world - be sure to normalize small usec field	 * errors.	 */	cvt_ts(parsetime.parse_stime, "parse_stime");	if (PARSE_TIMECODE(parsetime.parse_state))	{	    cvt_ts(parsetime.parse_time, "parse_time");	}	if (PARSE_PPS(parsetime.parse_state))	    cvt_ts(parsetime.parse_ptime, "parse_ptime");	parse_process(parse, &parsetime);}#endif/*-------------------------------------------------- * local init */static intlocal_init(	struct parseunit *parse	){	return parse_ioinit(&parse->parseio);}/*-------------------------------------------------- * local end */static voidlocal_end(	struct parseunit *parse	){	parse_ioend(&parse->parseio);}/*-------------------------------------------------- * local nop */static intlocal_nop(	struct parseunit *parse	){	return 1;}/*-------------------------------------------------- * local setcs

⌨️ 快捷键说明

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