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

📄 parse.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 2 页
字号:
		SETRTC(CVT_FAIL|CVT_BADTIME);		return -1;		/* bad min */	}	t = TIMES60(t) + clock_time->minute;				/* sec */  	if (clock_time->second < 0 || clock_time->second > 60)	/* allow for LEAPs */	{		SETRTC(CVT_FAIL|CVT_BADTIME);		return -1;		/* bad sec */	}	t  = TIMES60(t) + clock_time->second;	t += clock_time->utcoffset;	/* warp to UTC */				/* done */	clock_time->utctime = t;		/* documentray only */	return t;}/*--------------- format conversion -----------------------------------*/intStoi(	const unsigned char *s,	long *zp,	int cnt	){	char unsigned const *b = s;	int f,z,v;	char unsigned c;	f=z=v=0;	while(*s == ' ')	    s++;  	if (*s == '-')	{		s++;		v = 1;	}	else	    if (*s == '+')		s++;  	for(;;)	{		c = *s++;		if (c == '\0' || c < '0' || c > '9' || (cnt && ((s-b) > cnt)))		{			if (f == 0)			{				return(-1);			}			if (v)			    z = -z;			*zp = z;			return(0);		}		z = (z << 3) + (z << 1) + ( c - '0' );		f=1;	}}intStrok(	const unsigned char *s,	const unsigned char *m	){	if (!s || !m)	    return 0;	while(*s && *m)	{		if ((*m == ' ') ? 1 : (*s == *m))		{			s++;			m++;		}		else		{			return 0;		}	}	return !*m;}u_longupdatetimeinfo(	       register parse_t *parseio,	       register u_long   flags	       ){#ifdef PARSEKERNEL	{		int s = splhigh();#endif  		parseio->parse_lstate          = parseio->parse_dtime.parse_state | flags | PARSEB_TIMECODE;    		parseio->parse_dtime.parse_state = parseio->parse_lstate;#ifdef PARSEKERNEL		(void)splx((unsigned int)s);	}#endif  #ifdef PARSEKERNEL	parseprintf(DD_PARSE, ("updatetimeinfo status=0x%x, time=%x\n", parseio->parse_dtime.parse_state,			       parseio->parse_dtime.parse_time.tv.tv_sec));#else	parseprintf(DD_PARSE, ("updatetimeinfo status=0x%lx, time=%x\n", (long)parseio->parse_dtime.parse_state,	                       parseio->parse_dtime.parse_time.fp.l_ui));#endif		return CVT_OK;		/* everything fine and dandy... */}/* * syn_simple * * handle a sync time stamp *//*ARGSUSED*/voidsyn_simple(	register parse_t *parseio,	register timestamp_t *ts,	register struct format *format,	register u_long why	){	parseio->parse_dtime.parse_stime = *ts;}/* * pps_simple * * handle a pps time stamp *//*ARGSUSED*/u_longpps_simple(	register parse_t *parseio,	register int status,	register timestamp_t *ptime	){	parseio->parse_dtime.parse_ptime  = *ptime;	parseio->parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;  	return CVT_NONE;}/* * pps_one * * handle a pps time stamp in ONE edge *//*ARGSUSED*/u_longpps_one(	register parse_t *parseio,	register int status,	register timestamp_t *ptime	){	if (status)		return pps_simple(parseio, status, ptime);		return CVT_NONE;}/* * pps_zero * * handle a pps time stamp in ZERO edge *//*ARGSUSED*/u_longpps_zero(	register parse_t *parseio,	register int status,	register timestamp_t *ptime	){	if (!status)		return pps_simple(parseio, status, ptime);		return CVT_NONE;}/* * timepacket * * process a data packet */static u_longtimepacket(	register parse_t *parseio	){	register unsigned short format;	register time_t t;	u_long cvtrtc;		/* current conversion result */	clocktime_t clock_time;  	memset((char *)&clock_time, 0, sizeof clock_time);	format = parseio->parse_lformat;	if (format == (unsigned short)~0)		return CVT_NONE;		switch ((cvtrtc = clockformats[format]->convert ?		 clockformats[format]->convert((unsigned char *)parseio->parse_ldata, parseio->parse_ldsize, (struct format *)(clockformats[format]->data), &clock_time, parseio->parse_pdata) :		 CVT_NONE) & CVT_MASK)	{	case CVT_FAIL:		parseio->parse_badformat++;		break;			case CVT_NONE:		/*		 * too bad - pretend bad format		 */		parseio->parse_badformat++;		break;			case CVT_OK:		break;			case CVT_SKIP:		return CVT_NONE;	default:		/* shouldn't happen */#ifndef PARSEKERNEL		msyslog(LOG_WARNING, "parse: INTERNAL error: bad return code of convert routine \"%s\"\n", clockformats[format]->name);#endif	  		return CVT_FAIL|cvtrtc;	}	if ((t = parse_to_unixtime(&clock_time, &cvtrtc)) == -1)	{		return CVT_FAIL|cvtrtc;	}  	/*	 * time stamp	 */#ifdef PARSEKERNEL	parseio->parse_dtime.parse_time.tv.tv_sec  = t;	parseio->parse_dtime.parse_time.tv.tv_usec = clock_time.usecond;#else	parseio->parse_dtime.parse_time.fp.l_ui = t + JAN_1970;	TVUTOTSF(clock_time.usecond, parseio->parse_dtime.parse_time.fp.l_uf);#endif	parseio->parse_dtime.parse_format       = format;	return updatetimeinfo(parseio, clock_time.flags);}/*ARGSUSED*/intparse_timecode(	parsectl_t *dct,	parse_t    *parse	){	dct->parsegettc.parse_state  = parse->parse_lstate;	dct->parsegettc.parse_format = parse->parse_lformat;	/*	 * move out current bad packet count	 * user program is expected to sum these up	 * this is not a problem, as "parse" module are	 * exclusive open only	 */	dct->parsegettc.parse_badformat = parse->parse_badformat;	parse->parse_badformat = 0;		  	if (parse->parse_ldsize <= PARSE_TCMAX)	{		dct->parsegettc.parse_count = parse->parse_ldsize;		memcpy(dct->parsegettc.parse_buffer, parse->parse_ldata, dct->parsegettc.parse_count);		return 1;	}	else	{		return 0;	}}		  /*ARGSUSED*/intparse_setfmt(	parsectl_t *dct,	parse_t    *parse	){	if (dct->parseformat.parse_count <= PARSE_TCMAX)	{		if (dct->parseformat.parse_count)		{			register unsigned short i;			for (i = 0; i < nformats; i++)			{				if (!Strcmp(dct->parseformat.parse_buffer, clockformats[i]->name))				{					if (parse->parse_pdata)						FREE(parse->parse_pdata, parse->parse_plen);					parse->parse_pdata = 0;										parse->parse_plen = clockformats[i]->plen;					if (parse->parse_plen)					{						parse->parse_pdata = MALLOC(parse->parse_plen);						if (!parse->parse_pdata)						{							parseprintf(DD_PARSE, ("set format failed: malloc for private data area failed\n"));							return 0;						}						memset((char *)parse->parse_pdata, 0, parse->parse_plen);					}					if (parse->parse_data)						FREE(parse->parse_data, (unsigned)(parse->parse_dsize * 2 + 2));					parse->parse_ldata = parse->parse_data = 0;										parse->parse_dsize = clockformats[i]->length;										if (parse->parse_dsize)					{						parse->parse_data = (char*)MALLOC((unsigned)(parse->parse_dsize * 2 + 2));						if (!parse->parse_data)						{							if (parse->parse_pdata)								FREE(parse->parse_pdata, parse->parse_plen);							parse->parse_pdata = 0;														parseprintf(DD_PARSE, ("init failed: malloc for data area failed\n"));							return 0;						}					}										/*					 * leave room for '\0'					 */					parse->parse_ldata     = parse->parse_data + parse->parse_dsize + 1;										parse->parse_lformat  = i;										return 1;				}			}		}	}	return 0;}/*ARGSUSED*/intparse_getfmt(	parsectl_t *dct,	parse_t    *parse	){	if (dct->parseformat.parse_format < nformats &&	    Strlen(clockformats[dct->parseformat.parse_format]->name) <= PARSE_TCMAX)	{		dct->parseformat.parse_count = Strlen(clockformats[dct->parseformat.parse_format]->name)+1;		memcpy(dct->parseformat.parse_buffer, clockformats[dct->parseformat.parse_format]->name, dct->parseformat.parse_count);		return 1;	}	else	{		return 0;	}}/*ARGSUSED*/intparse_setcs(	parsectl_t *dct,	parse_t    *parse	){	parse->parse_ioflags &= ~PARSE_IO_CSIZE;	parse->parse_ioflags |= dct->parsesetcs.parse_cs & PARSE_IO_CSIZE;	return 1;}#else /* not (REFCLOCK && CLOCK_PARSE) */int parse_bs;#endif /* not (REFCLOCK && CLOCK_PARSE) *//* * History: * * parse.c,v * Revision 4.20  2005/08/06 17:39:40  kardel * cleanup size handling wrt/ to buffer boundaries * * Revision 4.19  2005/04/16 17:32:10  kardel * update copyright * * Revision 4.18  2004/11/14 16:11:05  kardel * update Id tags * * Revision 4.17  2004/11/14 15:29:41  kardel * support PPSAPI, upgrade Copyright to Berkeley style * * Revision 4.14  1999/11/28 09:13:52  kardel * RECON_4_0_98F * * Revision 4.13  1999/02/28 11:50:20  kardel * (timepacket): removed unecessary code * * Revision 4.12  1999/02/21 12:17:44  kardel * 4.91f reconcilation * * Revision 4.11  1999/02/21 11:09:47  kardel * unified debug output * * Revision 4.10  1998/12/20 23:45:30  kardel * fix types and warnings * * Revision 4.9  1998/08/09 22:26:06  kardel * Trimble TSIP support * * Revision 4.8  1998/06/14 21:09:39  kardel * Sun acc cleanup * * Revision 4.7  1998/06/13 15:19:13  kardel * fix mem*() to b*() function macro emulation * * Revision 4.6  1998/06/13 13:24:13  kardel * printf fmt * * Revision 4.5  1998/06/13 13:01:10  kardel * printf fmt * * Revision 4.4  1998/06/13 12:12:10  kardel * bcopy/memcpy cleanup * fix SVSV name clash * * Revision 4.3  1998/06/12 15:22:30  kardel * fix prototypes * * Revision 4.2  1998/06/12 09:13:27  kardel * conditional compile macros fixed * printf prototype * * Revision 4.1  1998/05/24 09:39:55  kardel * implementation of the new IO handling model * * Revision 4.0  1998/04/10 19:45:36  kardel * Start 4.0 release version numbering * * from V3 3.46 log info deleted 1998/04/11 kardel */

⌨️ 快捷键说明

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