154359Sroberto/*
2182007Sroberto * /src/NTP/REPOSITORY/ntp4-dev/include/parse.h,v 4.12 2007/01/14 08:36:03 kardel RELEASE_20070114_A
354359Sroberto *
4182007Sroberto * parse.h,v 4.12 2007/01/14 08:36:03 kardel RELEASE_20070114_A
554359Sroberto *
6290001Sglebius * Copyright (c) 1995-2015 by Frank Kardel <kardel <AT> ntp.org>
7290001Sglebius * Copyright (c) 1989-1994 by Frank Kardel, Friedrich-Alexander Universitaet Erlangen-Nuernberg, Germany
854359Sroberto *
9182007Sroberto * Redistribution and use in source and binary forms, with or without
10182007Sroberto * modification, are permitted provided that the following conditions
11182007Sroberto * are met:
12182007Sroberto * 1. Redistributions of source code must retain the above copyright
13182007Sroberto *    notice, this list of conditions and the following disclaimer.
14182007Sroberto * 2. Redistributions in binary form must reproduce the above copyright
15182007Sroberto *    notice, this list of conditions and the following disclaimer in the
16182007Sroberto *    documentation and/or other materials provided with the distribution.
17182007Sroberto * 3. Neither the name of the author nor the names of its contributors
18182007Sroberto *    may be used to endorse or promote products derived from this software
19182007Sroberto *    without specific prior written permission.
20182007Sroberto *
21182007Sroberto * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22182007Sroberto * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23182007Sroberto * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24182007Sroberto * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25182007Sroberto * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26182007Sroberto * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27182007Sroberto * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28182007Sroberto * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29182007Sroberto * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30182007Sroberto * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31182007Sroberto * SUCH DAMAGE.
32182007Sroberto *
3354359Sroberto */
3454359Sroberto
3554359Sroberto#ifndef __PARSE_H__
3654359Sroberto#define __PARSE_H__
3754359Sroberto#if	!(defined(lint) || defined(__GNUC__))
38182007Sroberto  static char parsehrcsid[]="parse.h,v 4.12 2007/01/14 08:36:03 kardel RELEASE_20070114_A";
3954359Sroberto#endif
4054359Sroberto
4154359Sroberto#include "ntp_types.h"
4254359Sroberto
4354359Sroberto#include "parse_conf.h"
4454359Sroberto
4554359Sroberto/*
4654359Sroberto * we use the following datastructures in two modes
4754359Sroberto * either in the NTP itself where we use NTP time stamps at some places
4854359Sroberto * or in the kernel, where only struct timeval will be used.
4954359Sroberto */
5054359Sroberto#undef PARSEKERNEL
5154359Sroberto#if defined(KERNEL) || defined(_KERNEL)
5254359Sroberto#ifndef PARSESTREAM
5354359Sroberto#define PARSESTREAM
5454359Sroberto#endif
5554359Sroberto#endif
5654359Sroberto#if defined(PARSESTREAM) && defined(HAVE_SYS_STREAM_H)
5754359Sroberto#define PARSEKERNEL
5854359Sroberto#endif
5954359Sroberto#ifdef PARSEKERNEL
6054359Sroberto#ifndef _KERNEL
61290001Sglebiusextern caddr_t kmem_alloc (unsigned int);
62290001Sglebiusextern caddr_t kmem_free (caddr_t, unsigned int);
63290001Sglebiusextern unsigned int splx (unsigned int);
64290001Sglebiusextern unsigned int splhigh (void);
65290001Sglebiusextern unsigned int splclock (void);
6654359Sroberto#define MALLOC(_X_) (char *)kmem_alloc(_X_)
6754359Sroberto#define FREE(_X_, _Y_) kmem_free((caddr_t)_X_, _Y_)
6854359Sroberto#else
6954359Sroberto#include <sys/kmem.h>
7054359Sroberto#define MALLOC(_X_) (char *)kmem_alloc(_X_, KM_SLEEP)
7154359Sroberto#define FREE(_X_, _Y_) kmem_free((caddr_t)_X_, _Y_)
7254359Sroberto#endif
7354359Sroberto#else
7454359Sroberto#define MALLOC(_X_) malloc(_X_)
7554359Sroberto#define FREE(_X_, _Y_) free(_X_)
7654359Sroberto#endif
7754359Sroberto
7854359Sroberto#if defined(PARSESTREAM) && defined(HAVE_SYS_STREAM_H)
7954359Sroberto#include <sys/stream.h>
8054359Sroberto#include <sys/stropts.h>
8154359Sroberto#else	/* STREAM */
8254359Sroberto#include <stdio.h>
8354359Sroberto#include "ntp_syslog.h"
8454359Sroberto#ifdef	DEBUG
8554359Sroberto#define DD_PARSE 5
8654359Sroberto#define DD_RAWDCF 4
8754359Sroberto#define parseprintf(LEVEL, ARGS) if (debug > LEVEL) printf ARGS
8854359Sroberto#else	/* DEBUG */
8954359Sroberto#define parseprintf(LEVEL, ARGS)
9054359Sroberto#endif	/* DEBUG */
9154359Sroberto#endif	/* PARSESTREAM */
9254359Sroberto
9354359Sroberto#if defined(timercmp) && defined(__GNUC__)
9454359Sroberto#undef timercmp
9554359Sroberto#endif
9654359Sroberto
9754359Sroberto#if !defined(timercmp)
9854359Sroberto#define	timercmp(tvp, uvp, cmp)	\
9954359Sroberto	((tvp)->tv_sec cmp (uvp)->tv_sec || \
10054359Sroberto	 ((tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec))
10154359Sroberto#endif
10254359Sroberto
10354359Sroberto#ifndef TIMES10
10454359Sroberto#define TIMES10(_X_)	(((_X_) << 3) + ((_X_) << 1))
10554359Sroberto#endif
10654359Sroberto
10754359Sroberto/*
108290001Sglebius * some constants useful for GPS time conversion
109290001Sglebius */
110294905Sdelphij#define GPSORIGIN       2524953600UL         /* NTP origin - GPS origin in seconds */
111294905Sdelphij#define GPSWRAP         990                  /* assume week count less than this in the previous epoch */
112294905Sdelphij#define GPSWEEKS        1024                 /* number of weeks until the GPS epch rolls over */
113290001Sglebius
114290001Sglebius/*
11554359Sroberto * state flags
11654359Sroberto */
11754359Sroberto#define PARSEB_POWERUP            0x00000001 /* no synchronisation */
11854359Sroberto#define PARSEB_NOSYNC             0x00000002 /* timecode currently not confirmed */
11954359Sroberto
12054359Sroberto/*
12154359Sroberto * time zone information
12254359Sroberto */
12354359Sroberto#define PARSEB_ANNOUNCE           0x00000010 /* switch time zone warning (DST switch) */
12454359Sroberto#define PARSEB_DST                0x00000020 /* DST in effect */
12554359Sroberto#define PARSEB_UTC		  0x00000040 /* UTC time */
12654359Sroberto
12754359Sroberto/*
12854359Sroberto * leap information
12954359Sroberto */
13054359Sroberto#define PARSEB_LEAPDEL		  0x00000100 /* LEAP deletion warning */
13154359Sroberto#define PARSEB_LEAPADD		  0x00000200 /* LEAP addition warning */
13254359Sroberto#define PARSEB_LEAPS		  0x00000300 /* LEAP warnings */
13354359Sroberto#define PARSEB_LEAPSECOND	  0x00000400 /* actual leap second */
13454359Sroberto/*
13554359Sroberto * optional status information
13654359Sroberto */
137290001Sglebius#define PARSEB_CALLBIT		  0x00001000 /* "call bit" used to signalize irregularities in the control facilities */
13854359Sroberto#define PARSEB_POSITION		  0x00002000 /* position available */
13954359Sroberto#define PARSEB_MESSAGE            0x00004000 /* addtitional message data */
14054359Sroberto/*
14154359Sroberto * feature information
14254359Sroberto */
14354359Sroberto#define PARSEB_S_LEAP		  0x00010000 /* supports LEAP */
144290001Sglebius#define PARSEB_S_CALLBIT	  0x00020000 /* supports callbit information */
14554359Sroberto#define PARSEB_S_PPS     	  0x00040000 /* supports PPS time stamping */
14654359Sroberto#define PARSEB_S_POSITION	  0x00080000 /* supports position information (GPS) */
14754359Sroberto
14854359Sroberto/*
14954359Sroberto * time stamp availability
15054359Sroberto */
15154359Sroberto#define PARSEB_TIMECODE		  0x10000000 /* valid time code sample */
15254359Sroberto#define PARSEB_PPS		  0x20000000 /* valid PPS sample */
15354359Sroberto
15454359Sroberto#define PARSE_TCINFO		(PARSEB_ANNOUNCE|PARSEB_POWERUP|PARSEB_NOSYNC|PARSEB_DST|\
155290001Sglebius				 PARSEB_UTC|PARSEB_LEAPS|PARSEB_CALLBIT|PARSEB_S_LEAP|\
15654359Sroberto				 PARSEB_S_LOCATION|PARSEB_TIMECODE|PARSEB_MESSAGE)
15754359Sroberto
15854359Sroberto#define PARSE_POWERUP(x)        ((x) & PARSEB_POWERUP)
15954359Sroberto#define PARSE_NOSYNC(x)         (((x) & (PARSEB_POWERUP|PARSEB_NOSYNC)) == PARSEB_NOSYNC)
16054359Sroberto#define PARSE_SYNC(x)           (((x) & (PARSEB_POWERUP|PARSEB_NOSYNC)) == 0)
16154359Sroberto#define PARSE_ANNOUNCE(x)       ((x) & PARSEB_ANNOUNCE)
16254359Sroberto#define PARSE_DST(x)            ((x) & PARSEB_DST)
16354359Sroberto#define PARSE_UTC(x)		((x) & PARSEB_UTC)
16454359Sroberto#define PARSE_LEAPADD(x)	(PARSE_SYNC(x) && (((x) & PARSEB_LEAPS) == PARSEB_LEAPADD))
16554359Sroberto#define PARSE_LEAPDEL(x)	(PARSE_SYNC(x) && (((x) & PARSEB_LEAPS) == PARSEB_LEAPDEL))
166290001Sglebius#define PARSE_CALLBIT(x)	((x) & PARSEB_CALLBIT)
16754359Sroberto#define PARSE_LEAPSECOND(x)	(PARSE_SYNC(x) && ((x) & PARSEB_LEAP_SECOND))
16854359Sroberto
16954359Sroberto#define PARSE_S_LEAP(x)		((x) & PARSEB_S_LEAP)
170290001Sglebius#define PARSE_S_CALLBIT(x)	((x) & PARSEB_S_CALLBIT)
17154359Sroberto#define PARSE_S_PPS(x)		((x) & PARSEB_S_PPS)
17254359Sroberto#define PARSE_S_POSITION(x)	((x) & PARSEB_S_POSITION)
17354359Sroberto
17454359Sroberto#define PARSE_TIMECODE(x)	((x) & PARSEB_TIMECODE)
17554359Sroberto#define PARSE_PPS(x)		((x) & PARSEB_PPS)
17654359Sroberto#define PARSE_POSITION(x)	((x) & PARSEB_POSITION)
17754359Sroberto#define PARSE_MESSAGE(x)	((x) & PARSEB_MESSAGE)
17854359Sroberto
17954359Sroberto/*
18054359Sroberto * operation flags - lower nibble contains fudge flags
18154359Sroberto */
182182007Sroberto#define PARSE_TRUSTTIME     CLK_FLAG1  /* use flag1 to indicate the time2 references mean the trust time */
183182007Sroberto#define PARSE_CLEAR         CLK_FLAG2  /* use flag2 to control pps on assert */
184182007Sroberto#define PARSE_PPSKERNEL     CLK_FLAG3  /* use flag3 to bind PPS to kernel */
185182007Sroberto#define PARSE_LEAP_DELETE   CLK_FLAG4  /* use flag4 to force leap deletion - only necessary when earth slows down */
186182007Sroberto
18754359Sroberto#define PARSE_FIXED_FMT     0x10  /* fixed format */
18854359Sroberto#define PARSE_PPSCLOCK      0x20  /* try to get PPS time stamp via ppsclock ioctl */
18954359Sroberto
19054359Sroberto/*
19154359Sroberto * size of buffers
19254359Sroberto */
19354359Sroberto#define PARSE_TCMAX	    400	  /* maximum addition data size */
19454359Sroberto
195182007Srobertotypedef union
19654359Sroberto{
19754359Sroberto  struct timeval tv;		/* timeval - kernel view */
19854359Sroberto  l_fp           fp;		/* fixed point - ntp view */
19954359Sroberto} timestamp_t;
20054359Sroberto
20154359Sroberto/*
20254359Sroberto * standard time stamp structure
20354359Sroberto */
20454359Srobertostruct parsetime
20554359Sroberto{
20654359Sroberto  u_long  parse_status;	/* data status - CVT_OK, CVT_NONE, CVT_FAIL ... */
20754359Sroberto  timestamp_t	 parse_time;	/* PARSE timestamp */
20854359Sroberto  timestamp_t	 parse_stime;	/* telegram sample timestamp */
20954359Sroberto  timestamp_t	 parse_ptime;	/* PPS time stamp */
21054359Sroberto  long           parse_usecerror;	/* sampled usec error */
21154359Sroberto  u_long	 parse_state;	/* current receiver state */
21254359Sroberto  unsigned short parse_format;	/* format code */
21354359Sroberto  unsigned short parse_msglen;	/* length of message */
21454359Sroberto  unsigned char  parse_msg[PARSE_TCMAX]; /* original messages */
21554359Sroberto};
21654359Sroberto
21754359Srobertotypedef struct parsetime parsetime_t;
21854359Sroberto
21954359Sroberto/*---------- STREAMS interface ----------*/
22054359Sroberto
22154359Sroberto#ifdef HAVE_SYS_STREAM_H
22254359Sroberto/*
22354359Sroberto * ioctls
22454359Sroberto */
22554359Sroberto#define PARSEIOC_ENABLE		(('D'<<8) + 'E')
22654359Sroberto#define PARSEIOC_DISABLE	(('D'<<8) + 'D')
22754359Sroberto#define PARSEIOC_SETFMT         (('D'<<8) + 'f')
22854359Sroberto#define PARSEIOC_GETFMT	        (('D'<<8) + 'F')
22954359Sroberto#define PARSEIOC_SETCS	        (('D'<<8) + 'C')
23054359Sroberto#define PARSEIOC_TIMECODE	(('D'<<8) + 'T')
23154359Sroberto
23254359Sroberto#endif
23354359Sroberto
23454359Sroberto/*------ IO handling flags (sorry) ------*/
23554359Sroberto
23654359Sroberto#define PARSE_IO_CSIZE	0x00000003
23754359Sroberto#define PARSE_IO_CS5	0x00000000
23854359Sroberto#define PARSE_IO_CS6	0x00000001
239290001Sglebius#define PARSE_IO_CS7	0x00000002
240290001Sglebius#define PARSE_IO_CS8	0x00000003
24154359Sroberto
24254359Sroberto/*
24354359Sroberto * ioctl structure
24454359Sroberto */
245290001Sglebiusunion parsectl
24654359Sroberto{
24754359Sroberto  struct parsegettc
24854359Sroberto    {
24954359Sroberto      u_long         parse_state;	/* last state */
25054359Sroberto      u_long         parse_badformat; /* number of bad packets since last query */
25154359Sroberto      unsigned short parse_format;/* last decoded format */
25254359Sroberto      unsigned short parse_count;	/* count of valid time code bytes */
25354359Sroberto      char           parse_buffer[PARSE_TCMAX+1]; /* timecode buffer */
25454359Sroberto    } parsegettc;
25554359Sroberto
25654359Sroberto  struct parseformat
25754359Sroberto    {
25854359Sroberto      unsigned short parse_format;/* number of examined format */
25954359Sroberto      unsigned short parse_count;	/* count of valid string bytes */
26054359Sroberto      char           parse_buffer[PARSE_TCMAX+1]; /* format code string */
26154359Sroberto    } parseformat;
26254359Sroberto
26354359Sroberto  struct parsesetcs
26454359Sroberto    {
26554359Sroberto      u_long         parse_cs;	/* character size (needed for stripping) */
26654359Sroberto    } parsesetcs;
26754359Sroberto};
268290001Sglebius
26954359Srobertotypedef union parsectl parsectl_t;
27054359Sroberto
27154359Sroberto/*------ for conversion routines --------*/
27254359Sroberto
27354359Srobertostruct parse			/* parse module local data */
27454359Sroberto{
27554359Sroberto  int            parse_flags;	/* operation and current status flags */
276290001Sglebius
27754359Sroberto  int		 parse_ioflags;	   /* io handling flags (5-8 Bit control currently) */
27854359Sroberto
27954359Sroberto  /*
28054359Sroberto   * private data - fixed format only
28154359Sroberto   */
28254359Sroberto  unsigned short parse_plen;	/* length of private data */
28354359Sroberto  void          *parse_pdata;	/* private data pointer */
28454359Sroberto
28554359Sroberto  /*
28654359Sroberto   * time code input buffer (from RS232 or PPS)
28754359Sroberto   */
28854359Sroberto  unsigned short parse_index;	/* current buffer index */
28954359Sroberto  char          *parse_data;    /* data buffer */
29054359Sroberto  unsigned short parse_dsize;	/* size of data buffer */
29154359Sroberto  unsigned short parse_lformat;	/* last format used */
29254359Sroberto  u_long         parse_lstate;	/* last state code */
29354359Sroberto  char          *parse_ldata;	/* last data buffer */
29454359Sroberto  unsigned short parse_ldsize;	/* last data buffer length */
29554359Sroberto  u_long         parse_badformat;	/* number of unparsable pakets */
296290001Sglebius
29754359Sroberto  timestamp_t    parse_lastchar; /* last time a character was received */
29854359Sroberto  parsetime_t    parse_dtime;	/* external data prototype */
29954359Sroberto};
30054359Sroberto
30154359Srobertotypedef struct parse parse_t;
30254359Sroberto
30354359Srobertostruct clocktime		/* clock time broken up from time code */
30454359Sroberto{
30554359Sroberto  long day;
30654359Sroberto  long month;
30754359Sroberto  long year;
30854359Sroberto  long hour;
30954359Sroberto  long minute;
31054359Sroberto  long second;
31154359Sroberto  long usecond;
31254359Sroberto  long utcoffset;	/* in seconds */
31354359Sroberto  time_t utctime;	/* the actual time - alternative to date/time */
31454359Sroberto  u_long flags;		/* current clock status */
31554359Sroberto};
31654359Sroberto
31754359Srobertotypedef struct clocktime clocktime_t;
31854359Sroberto
31954359Sroberto/*
32054359Sroberto * parser related return/error codes
32154359Sroberto */
32254359Sroberto#define CVT_MASK	 (unsigned)0x0000000F /* conversion exit code */
32354359Sroberto#define   CVT_NONE	 (unsigned)0x00000001 /* format not applicable */
32454359Sroberto#define   CVT_FAIL	 (unsigned)0x00000002 /* conversion failed - error code returned */
32554359Sroberto#define   CVT_OK	 (unsigned)0x00000004 /* conversion succeeded */
32654359Sroberto#define   CVT_SKIP	 (unsigned)0x00000008 /* conversion succeeded */
32754359Sroberto#define CVT_ADDITIONAL   (unsigned)0x00000010 /* additional data is available */
32854359Sroberto#define CVT_BADFMT	 (unsigned)0x00000100 /* general format error - (unparsable) */
32954359Sroberto#define CVT_BADDATE      (unsigned)0x00000200 /* date field incorrect */
33054359Sroberto#define CVT_BADTIME	 (unsigned)0x00000400 /* time field incorrect */
33154359Sroberto
33254359Sroberto/*
33354359Sroberto * return codes used by special input parsers
33454359Sroberto */
33554359Sroberto#define PARSE_INP_SKIP  0x00	/* discard data - may have been consumed */
33654359Sroberto#define PARSE_INP_TIME  0x01	/* time code assembled */
33754359Sroberto#define PARSE_INP_PARSE 0x02	/* parse data using normal algorithm */
33854359Sroberto#define PARSE_INP_DATA  0x04	/* additional data to pass up */
33954359Sroberto#define PARSE_INP_SYNTH 0x08	/* just pass up synthesized time */
34054359Sroberto
34154359Sroberto/*
34254359Sroberto * PPS edge info
34354359Sroberto */
34454359Sroberto#define SYNC_ZERO	0x00
34554359Sroberto#define SYNC_ONE	0x01
34654359Sroberto
347290001Sglebiustypedef u_long parse_inp_fnc_t(parse_t *, char, timestamp_t *);
348290001Sglebiustypedef u_long parse_cvt_fnc_t(unsigned char *, int, struct format *, clocktime_t *, void *);
349290001Sglebiustypedef u_long parse_pps_fnc_t(parse_t *, int, timestamp_t *);
350290001Sglebius
35154359Srobertostruct clockformat
35254359Sroberto{
35354359Sroberto  /* special input protocol - implies fixed format */
354290001Sglebius  parse_inp_fnc_t *input;
35554359Sroberto  /* conversion routine */
356290001Sglebius  parse_cvt_fnc_t *convert;
35754359Sroberto  /* routine for handling RS232 sync events (time stamps) */
35854359Sroberto  /* PPS input routine */
359290001Sglebius  parse_pps_fnc_t *syncpps;
36054359Sroberto  /* time code synthesizer */
36154359Sroberto
36254359Sroberto  void           *data;		/* local parameters */
36354359Sroberto  const char     *name;		/* clock format name */
36454359Sroberto  unsigned short  length;	/* maximum length of data packet */
36554359Sroberto  unsigned short  plen;		/* length of private data - implies fixed format */
36654359Sroberto};
36754359Sroberto
36854359Srobertotypedef struct clockformat clockformat_t;
36954359Sroberto
37054359Sroberto/*
37154359Sroberto * parse interface
37254359Sroberto */
373290001Sglebiusextern int  parse_ioinit (parse_t *);
374290001Sglebiusextern void parse_ioend (parse_t *);
375290001Sglebiusextern int  parse_ioread (parse_t *, char, timestamp_t *);
376290001Sglebiusextern int  parse_iopps (parse_t *, int, timestamp_t *);
377290001Sglebiusextern void parse_iodone (parse_t *);
378290001Sglebiusextern int  parse_timecode (parsectl_t *, parse_t *);
379290001Sglebiusextern int  parse_getfmt (parsectl_t *, parse_t *);
380290001Sglebiusextern int  parse_setfmt (parsectl_t *, parse_t *);
381290001Sglebiusextern int  parse_setcs (parsectl_t *, parse_t *);
38254359Sroberto
383290001Sglebiusextern unsigned int parse_restart (parse_t *, char);
384290001Sglebiusextern unsigned int parse_addchar (parse_t *, char);
385290001Sglebiusextern unsigned int parse_end (parse_t *);
38654359Sroberto
387290001Sglebiusextern int Strok (const unsigned char *, const unsigned char *);
388290001Sglebiusextern int Stoi (const unsigned char *, long *, int);
38954359Sroberto
390290001Sglebiusextern time_t parse_to_unixtime (clocktime_t *, u_long *);
391290001Sglebiusextern u_long updatetimeinfo (parse_t *, u_long);
392290001Sglebiusextern void syn_simple (parse_t *, timestamp_t *, struct format *, u_long);
393290001Sglebiusextern parse_pps_fnc_t pps_simple;
394290001Sglebiusextern parse_pps_fnc_t pps_one;
395290001Sglebiusextern parse_pps_fnc_t pps_zero;
396290001Sglebiusextern int parse_timedout (parse_t *, timestamp_t *, struct timeval *);
39754359Sroberto
39854359Sroberto#endif
39954359Sroberto
40054359Sroberto/*
40154359Sroberto * History:
40254359Sroberto *
40354359Sroberto * parse.h,v
404182007Sroberto * Revision 4.12  2007/01/14 08:36:03  kardel
405182007Sroberto * make timestamp union anonymous to avoid conflicts with
406182007Sroberto * some OSes that choose to create a nameing conflic here.
407182007Sroberto *
408182007Sroberto * Revision 4.11  2005/06/25 10:58:45  kardel
409182007Sroberto * add missing log keywords
410182007Sroberto *
41154359Sroberto * Revision 4.5  1998/08/09 22:23:32  kardel
41254359Sroberto * 4.0.73e2 adjustments
41354359Sroberto *
41454359Sroberto * Revision 4.4  1998/06/14 21:09:27  kardel
41554359Sroberto * Sun acc cleanup
41654359Sroberto *
41754359Sroberto * Revision 4.3  1998/06/13 11:49:25  kardel
41854359Sroberto * STREAM macro gone in favor of HAVE_SYS_STREAM_H
41954359Sroberto *
42054359Sroberto * Revision 4.2  1998/06/12 15:14:25  kardel
42154359Sroberto * fixed prototypes
42254359Sroberto *
42354359Sroberto * Revision 4.1  1998/05/24 10:07:59  kardel
42454359Sroberto * removed old data structure cruft (new input model)
42554359Sroberto * new PARSE_INP* macros for input handling
42654359Sroberto * removed old SYNC_* macros from old input model
42754359Sroberto * (struct clockformat): removed old parse functions in favor of the
42854359Sroberto * new input model
42954359Sroberto * updated prototypes
43054359Sroberto *
43154359Sroberto * form V3 3.31 - log info deleted 1998/04/11 kardel
43254359Sroberto */
433