📄 refclock_parse.c
字号:
{ 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 + -