diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2014-08-27 16:26:52 -0400 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2014-08-27 16:26:52 -0400 |
commit | 6203e5b8fcac9d78ea54b7b3c53cb8d084e8a219 (patch) | |
tree | d8611d8e44267151c29ab8920702cc94e86063c5 /packet.c | |
parent | b53db1322c70f8b86dfe72e982d6097304a749ae (diff) | |
download | gpsd-6203e5b8fcac9d78ea54b7b3c53cb8d084e8a219.tar.gz |
Introduce struct errout_t to encapsulate error-reporting hooks.
A major step towards eliminating reverse linkage.
All regression tests pass.
Diffstat (limited to 'packet.c')
-rw-r--r-- | packet.c | 99 |
1 files changed, 39 insertions, 60 deletions
@@ -119,22 +119,6 @@ enum #include "packet_states.h" }; -void lexer_report(const struct gps_lexer_t *lexer, - const int errlevel, - const char *fmt, ...) -{ - if (lexer->debug >= errlevel) - { - char buf[128]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - lexer->report(buf); - va_end(ap); - } -} - #define SOH (unsigned char)0x01 #define DLE (unsigned char)0x10 #define STX (unsigned char)0x02 @@ -205,7 +189,7 @@ static void character_pushback(struct gps_lexer_t *lexer) --lexer->inbufptr; /*@+modobserver@*/ --lexer->char_counter; - lexer_report(lexer, LOG_RAW + 2, + gpsd_notify(&lexer->errout, LOG_RAW + 2, "%08ld: character pushed back\n", lexer->char_counter); } @@ -942,7 +926,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c) n++) csum ^= lexer->inbuffer[n]; if (csum != c) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Navcom packet type 0x%hhx bad checksum 0x%hhx, expecting 0x%x\n", lexer->inbuffer[3], csum, c); lexer->state = GROUND_STATE; @@ -1029,14 +1013,14 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c) short sum = getword(0) + getword(1) + getword(2) + getword(3); sum *= -1; if (sum != getword(4)) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Zodiac Header checksum 0x%hx expecting 0x%hx\n", sum, getword(4)); lexer->state = GROUND_STATE; break; } } - lexer_report(lexer, LOG_RAW + 1, + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Zodiac header id=%hd len=%hd flags=%hx\n", getword(1), getword(2), getword(3)); #undef getword @@ -1167,7 +1151,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c) if ((c == '>') && (lexer->inbufptr[0] == '<') && (lexer->inbufptr[1] == '!')) { lexer->state = ITALK_RECOGNIZED; - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "ITALK: trying to process runt packet\n"); break; } else if (--lexer->length == 0) @@ -1315,7 +1299,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c) lexer->state = JSON_STRINGLITERAL; lexer->json_after = JSON_END_ATTRIBUTE; } else { - lexer_report(lexer, LOG_RAW + 2, + gpsd_notify(&lexer->errout, LOG_RAW + 2, "%08ld: missing attribute start after header\n", lexer->char_counter); lexer->state = GROUND_STATE; @@ -1408,9 +1392,9 @@ static void packet_accept(struct gps_lexer_t *lexer, int packet_type) lexer->outbuflen = packetlen; lexer->outbuffer[packetlen] = '\0'; lexer->type = packet_type; - if (lexer->debug >= LOG_RAW+1) { + if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; - lexer_report(lexer, LOG_RAW+1, + gpsd_notify(&lexer->errout, LOG_RAW+1, "Packet type %d accepted %zu = %s\n", packet_type, packetlen, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), @@ -1418,7 +1402,7 @@ static void packet_accept(struct gps_lexer_t *lexer, int packet_type) lexer->outbuflen)); } } else { - lexer_report(lexer, LOG_ERROR, + gpsd_notify(&lexer->errout, LOG_ERROR, "Rejected too long packet type %d len %zu\n", packet_type, packetlen); } @@ -1431,9 +1415,9 @@ static void packet_discard(struct gps_lexer_t *lexer) size_t remaining = lexer->inbuflen - discard; lexer->inbufptr = memmove(lexer->inbuffer, lexer->inbufptr, remaining); lexer->inbuflen = remaining; - if (lexer->debug >= LOG_RAW+1) { + if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; - lexer_report(lexer, LOG_RAW + 1, + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Packet discard of %zu, chars remaining is %zu = %s\n", discard, remaining, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), @@ -1446,9 +1430,9 @@ static void character_discard(struct gps_lexer_t *lexer) { memmove(lexer->inbuffer, lexer->inbuffer + 1, (size_t)-- lexer->inbuflen); lexer->inbufptr = lexer->inbuffer; - if (lexer->debug >= LOG_RAW+1) { + if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; - lexer_report(lexer, LOG_RAW + 1, + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Character discarded, buffer %zu chars = %s\n", lexer->inbuflen, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), @@ -1459,11 +1443,6 @@ static void character_discard(struct gps_lexer_t *lexer) /* get 0-origin big-endian words relative to start of packet buffer */ #define getword(i) (short)(lexer->inbuffer[2*(i)] | (lexer->inbuffer[2*(i)+1] << 8)) -static void basic_lexer_report(const char *buf) -{ - (void)fputs(buf, stderr); -} - /* entry points begin here */ void lexer_init( /*@out@*/ struct gps_lexer_t *lexer) @@ -1477,7 +1456,7 @@ void lexer_init( /*@out@*/ struct gps_lexer_t *lexer) lexer->start_time = 0.0; #endif /* TIMING_ENABLE */ packet_reset(lexer); - lexer->report = basic_lexer_report; + errout_reset(&lexer->errout); } void packet_parse(struct gps_lexer_t *lexer) @@ -1492,7 +1471,7 @@ void packet_parse(struct gps_lexer_t *lexer) #include "packet_names.h" }; nextstate(lexer, c); - lexer_report(lexer, LOG_RAW + 2, + gpsd_notify(&lexer->errout, LOG_RAW + 2, "%08ld: character '%c' [%02x], new state: %s\n", lexer->char_counter, (isprint(c) ? c : '.'), c, state_table[lexer->state]); @@ -1534,7 +1513,7 @@ void packet_parse(struct gps_lexer_t *lexer) && csum[1] == toupper(end[2])); } if (!checksum_ok) { - lexer_report(lexer, LOG_WARN, + gpsd_notify(&lexer->errout, LOG_WARN, "bad checksum in NMEA packet; expected %s.\n", csum); packet_accept(lexer, BAD_PACKET); @@ -1587,11 +1566,11 @@ void packet_parse(struct gps_lexer_t *lexer) for (n = 0; n < lexer->length - 2; n++) a += (unsigned)lexer->inbuffer[n]; b = (unsigned)getleu16(lexer->inbuffer, lexer->length - 2); - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "SuperStarII pkt dump: type %u len %u\n", lexer->inbuffer[1], (unsigned int)lexer->length); if (a != b) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "REJECT SuperStarII packet type 0x%02x" "%zd bad checksum 0x%04x, expecting 0x%04x\n", lexer->inbuffer[1], lexer->length, a, b); @@ -1615,12 +1594,12 @@ void packet_parse(struct gps_lexer_t *lexer) for (i = 2; i < len - 3; i++) b ^= lexer->inbuffer[i]; if (a == b) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Accept OnCore packet @@%c%c len %d\n", lexer->inbuffer[2], lexer->inbuffer[3], len); packet_accept(lexer, ONCORE_PACKET); } else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "REJECT OnCore packet @@%c%c len %d\n", lexer->inbuffer[2], lexer->inbuffer[3], len); packet_accept(lexer, BAD_PACKET); @@ -1643,7 +1622,7 @@ void packet_parse(struct gps_lexer_t *lexer) if (dlecnt > 2) { dlecnt -= 2; dlecnt /= 2; - lexer_report(lexer, LOG_RAW, + gpsd_notify(&lexer->errout, LOG_RAW, "Unstuffed %d DLEs\n", dlecnt); packetlen -= dlecnt; } @@ -1694,7 +1673,7 @@ void packet_parse(struct gps_lexer_t *lexer) /*@ +charint */ chksum &= 0xff; if (chksum) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Garmin checksum failed: %02x!=0\n", chksum); goto not_garmin; } @@ -1702,7 +1681,7 @@ void packet_parse(struct gps_lexer_t *lexer) packet_discard(lexer); break; not_garmin:; - lexer_report(lexer, LOG_RAW + 1, + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Not a Garmin packet\n"); #endif /* GARMIN_ENABLE */ #ifdef TSIP_ENABLE @@ -1753,7 +1732,7 @@ void packet_parse(struct gps_lexer_t *lexer) (0xbc == pkt_id) || (0x38 == pkt_id)) && ((0x41 > pkt_id) || (0x8f < pkt_id))) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Packet ID 0x%02x out of range for TSIP\n", pkt_id); goto not_tsip; @@ -1837,14 +1816,14 @@ void packet_parse(struct gps_lexer_t *lexer) /* pass */ ; else { /* pass */ ; - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "TSIP REJECT pkt_id = %#02x, packetlen= %zu\n", pkt_id, packetlen); goto not_tsip; } #undef TSIP_ID_AND_LENGTH /* Debug */ - lexer_report(lexer, LOG_RAW, + gpsd_notify(&lexer->errout, LOG_RAW, "TSIP pkt_id = %#02x, packetlen= %zu\n", pkt_id, packetlen); /*@ -charint +ifempty @*/ @@ -1852,7 +1831,7 @@ void packet_parse(struct gps_lexer_t *lexer) packet_discard(lexer); break; not_tsip: - lexer_report(lexer, LOG_RAW + 1, "Not a TSIP packet\n"); + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Not a TSIP packet\n"); /* * More attempts to recognize ambiguous TSIP-like * packet types could go here. @@ -1871,7 +1850,7 @@ void packet_parse(struct gps_lexer_t *lexer) lexer->inbufptr - lexer->inbuffer)) { packet_accept(lexer, RTCM3_PACKET); } else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "RTCM3 data checksum failure, " "%0x against %02x %02x %02x\n", crc24q_hash(lexer->inbuffer, @@ -1895,7 +1874,7 @@ void packet_parse(struct gps_lexer_t *lexer) if (len == 0 || sum == getword(5 + len)) { packet_accept(lexer, ZODIAC_PACKET); } else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n", sum, len, getword(5 + len)); packet_accept(lexer, BAD_PACKET); @@ -1912,7 +1891,7 @@ void packet_parse(struct gps_lexer_t *lexer) unsigned char ck_a = (unsigned char)0; unsigned char ck_b = (unsigned char)0; len = lexer->inbufptr - lexer->inbuffer; - lexer_report(lexer, LOG_IO, "UBX: len %d\n", len); + gpsd_notify(&lexer->errout, LOG_IO, "UBX: len %d\n", len); for (n = 2; n < (len - 2); n++) { ck_a += lexer->inbuffer[n]; ck_b += ck_a; @@ -1921,7 +1900,7 @@ void packet_parse(struct gps_lexer_t *lexer) ck_b == lexer->inbuffer[len - 1]) packet_accept(lexer, UBX_PACKET); else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "UBX checksum 0x%02hhx%02hhx over length %d," " expecting 0x%02hhx%02hhx (type 0x%02hhx%02hhx)\n", ck_a, @@ -1972,7 +1951,7 @@ void packet_parse(struct gps_lexer_t *lexer) goto not_evermore; crc &= 0xff; if (crc != checksum) { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "EverMore checksum failed: %02x != %02x\n", crc, checksum); goto not_evermore; @@ -2014,7 +1993,7 @@ void packet_parse(struct gps_lexer_t *lexer) if (len == 0 || csum == xsum) packet_accept(lexer, ITALK_PACKET); else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "ITALK: checksum failed - " "type 0x%02x expected 0x%04x got 0x%04x\n", lexer->inbuffer[4], xsum, csum); @@ -2050,7 +2029,7 @@ void packet_parse(struct gps_lexer_t *lexer) if (cs == 0) packet_accept(lexer, GEOSTAR_PACKET); else { - lexer_report(lexer, LOG_IO, + gpsd_notify(&lexer->errout, LOG_IO, "GeoStar checksum failed 0x%x over length %d\n", cs, len); packet_accept(lexer, BAD_PACKET); @@ -2116,18 +2095,18 @@ ssize_t packet_get(int fd, struct gps_lexer_t *lexer) /*@ +modobserver @*/ if (recvd == -1) { if ((errno == EAGAIN) || (errno == EINTR)) { - lexer_report(lexer, LOG_RAW + 2, "no bytes ready\n"); + gpsd_notify(&lexer->errout, LOG_RAW + 2, "no bytes ready\n"); recvd = 0; /* fall through, input buffer may be nonempty */ } else { - lexer_report(lexer, LOG_RAW + 2, + gpsd_notify(&lexer->errout, LOG_RAW + 2, "errno: %s\n", strerror(errno)); return -1; } } else { - if (lexer->debug >= LOG_RAW+1) { + if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; - lexer_report(lexer, LOG_RAW + 1, + gpsd_notify(&lexer->errout, LOG_RAW + 1, "Read %zd chars to buffer offset %zd (total %zd): %s\n", recvd, lexer->inbuflen, lexer->inbuflen + recvd, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), @@ -2135,7 +2114,7 @@ ssize_t packet_get(int fd, struct gps_lexer_t *lexer) } lexer->inbuflen += recvd; } - lexer_report(lexer, LOG_SPIN, + gpsd_notify(&lexer->errout, LOG_SPIN, "packet_get() fd %d -> %zd (%d)\n", fd, recvd, errno); |