Module Name: src Committed By: christos Date: Fri Aug 10 08:22:49 UTC 2012
Modified Files: src/external/bsd/ntp/dist/ntpd: refclock_parse.c Log Message: Homogenize all strn{cpy,cat} and snprintf() to a single append function to prevent incorrect usage and buffer overflow. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/external/bsd/ntp/dist/ntpd/refclock_parse.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/ntp/dist/ntpd/refclock_parse.c diff -u src/external/bsd/ntp/dist/ntpd/refclock_parse.c:1.5 src/external/bsd/ntp/dist/ntpd/refclock_parse.c:1.6 --- src/external/bsd/ntp/dist/ntpd/refclock_parse.c:1.5 Wed Feb 1 02:46:22 2012 +++ src/external/bsd/ntp/dist/ntpd/refclock_parse.c Fri Aug 10 04:22:49 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: refclock_parse.c,v 1.5 2012/02/01 07:46:22 kardel Exp $ */ +/* $NetBSD: refclock_parse.c,v 1.6 2012/08/10 08:22:49 christos Exp $ */ /* * /src/NTP/REPOSITORY/ntp4-dev/ntpd/refclock_parse.c,v 4.81 2009/05/01 10:15:29 kardel RELEASE_20090105_A @@ -2418,6 +2418,20 @@ init_iobinding( ** support routines **/ +static char * +ap(char *buffer, size_t len, char *pos, const char *fmt, ...) +{ + va_list va; + int l; + + va_start(va, fmt); + l = vsnprintf(pos, len - (pos - buffer), fmt, va); + va_end(va); + if (l != -1) + pos += l; + return pos; +} + /*-------------------------------------------------- * convert a flag field to a string */ @@ -2464,8 +2478,6 @@ parsestate( int i; char *s, *t; - - *buffer = '\0'; s = t = buffer; i = 0; @@ -2474,9 +2486,8 @@ parsestate( if (flagstrings[i].bit & lstate) { if (s != t) - strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); - strncat(t, flagstrings[i].name, BUFFER_SIZES(buffer, t, size)); - t += strlen(t); + t = ap(buffer, size, t, "; "); + t = ap(buffer, size, t, "%s", flagstrings[i].name); } i++; } @@ -2484,13 +2495,11 @@ parsestate( if (lstate & (PARSEB_S_LEAP|PARSEB_S_ANTENNA|PARSEB_S_PPS|PARSEB_S_POSITION)) { if (s != t) - strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); - - t += strlen(t); + t = ap(buffer, size, t, "; "); - strncpy(t, "(", BUFFER_SIZES(buffer, t, size)); + t = ap(buffer, size, t, "("); - s = t = t + strlen(t); + s = t; i = 0; while (sflagstrings[i].bit) @@ -2499,16 +2508,15 @@ parsestate( { if (t != s) { - strncpy(t, "; ", BUFFER_SIZES(buffer, t, size)); - t += 2; + t = ap(buffer, size, t, "; "); } - strncpy(t, sflagstrings[i].name, BUFFER_SIZES(buffer, t, size)); - t += strlen(t); + t = ap(buffer, size, t, "%s", + sflagstrings[i].name); } i++; } - strncpy(t, ")", BUFFER_SIZES(buffer, t, size)); + t = ap(buffer, size, t, ")"); } return buffer; } @@ -2539,7 +2547,9 @@ parsestatus( { 0, NULL } }; int i; + char *t; + t = buffer; *buffer = '\0'; i = 0; @@ -2547,9 +2557,9 @@ parsestatus( { if (flagstrings[i].bit & lstate) { - if (buffer[0]) - strncat(buffer, "; ", size); - strncat(buffer, flagstrings[i].name, size - 2); + if (t == buffer) + t = ap(buffer, size, t, "; "); + t = ap(buffer, size, t, "%s", flagstrings[i].name); } i++; } @@ -2612,10 +2622,11 @@ l_mktime( char *t; buffer[0] = '\0'; + t = buffer; if ((tmp = delta / (60*60*24)) != 0) { - snprintf(buffer, BUFFER_SIZE(buffer, buffer), "%ldd+", (u_long)tmp); + t = ap(buffer, sizeof(buffer), t, "%ldd+", (u_long)tmp); delta -= tmp * 60*60*24; } @@ -2624,10 +2635,8 @@ l_mktime( m = delta % 60; delta /= 60; - t = buffer + strlen(buffer); - - snprintf(t, BUFFER_SIZE(buffer, t), "%02d:%02d:%02d", - (int)delta, (int)m, (int)s); + t = ap(buffer, sizeof(buffer), t, "%02d:%02d:%02d", + (int)delta, (int)m, (int)s); return buffer; } @@ -3206,7 +3215,7 @@ parse_start( return 0; /* well, ok - special initialisation broke */ } - strncpy(tmp_ctl.parseformat.parse_buffer, parse->parse_type->cl_format, sizeof(tmp_ctl.parseformat.parse_buffer)); + strlcpy(tmp_ctl.parseformat.parse_buffer, parse->parse_type->cl_format, sizeof(tmp_ctl.parseformat.parse_buffer)); tmp_ctl.parseformat.parse_count = strlen(tmp_ctl.parseformat.parse_buffer); if (!PARSE_SETFMT(parse, &tmp_ctl)) @@ -3490,16 +3499,16 @@ parse_control( } start = tt = add_var(&out->kv_list, 128, RO|DEF); - snprintf(tt, 128, "refclock_time=\""); - tt += strlen(tt); + tt = ap(start, 128, tt, "refclock_time=\""); if (parse->timedata.parse_time.fp.l_ui == 0) { - strncpy(tt, "<UNDEFINED>\"", BUFFER_SIZES(start, tt, 128)); + tt = ap(start, 128, tt, "<UNDEFINED>\""); } else { - snprintf(tt, 128, "%s\"", gmprettydate(&parse->timedata.parse_time.fp)); + tt = ap(start, 128, tt, "%s\"", + gmprettydate(&parse->timedata.parse_time.fp)); } if (!PARSE_GETTIMECODE(parse, &tmpctl)) @@ -3510,8 +3519,7 @@ parse_control( else { start = tt = add_var(&out->kv_list, 512, RO|DEF); - snprintf(tt, 512, "refclock_status=\""); - tt += strlen(tt); + tt = ap(start, 512, tt, "refclock_status=\""); /* * copy PPS flags from last read transaction (informational only) @@ -3521,7 +3529,7 @@ parse_control( (void) parsestate(tmpctl.parsegettc.parse_state, tt, BUFFER_SIZES(start, tt, 512)); - strncat(tt, "\"", BUFFER_SIZES(start, tt, 512)); + tt = ap(start, 512, tt, "\""); if (tmpctl.parsegettc.parse_count) mkascii(outstatus+strlen(outstatus), (int)(sizeof(outstatus)- strlen(outstatus) - 1), @@ -3538,11 +3546,14 @@ parse_control( } else { - tt = add_var(&out->kv_list, 80, RO|DEF); - snprintf(tt, 80, "refclock_format=\""); + start = tt = add_var(&out->kv_list, 80, RO|DEF); + tt = ap(start, 80, tt, "refclock_format=\""); - strncat(tt, tmpctl.parseformat.parse_buffer, tmpctl.parseformat.parse_count); - strncat(tt,"\"", 80); + tt = ap(start, 80, tt, "*.*s", + tmpctl.parseformat.parse_count, + tmpctl.parseformat.parse_count, + tmpctl.parseformat.parse_buffer); + tt = ap(start, 80, tt, "\""); } /* @@ -3550,8 +3561,7 @@ parse_control( */ start = tt = add_var(&out->kv_list, LEN_STATES, RO|DEF); - strncpy(tt, "refclock_states=\"", LEN_STATES); - tt += strlen(tt); + tt = ap(start, LEN_STATES, tt, "refclock_states=\""); for (i = 0; i <= CEVNT_MAX; i++) { @@ -3585,14 +3595,15 @@ parse_control( (int)(percent / 100), (int)(percent % 100)); if ((count = strlen(item)) < (LEN_STATES - 40 - (tt - start))) { - strncpy(tt, item, BUFFER_SIZES(start, tt, LEN_STATES)); - tt += count; + tt = ap(start, LEN_STATES, tt, + "%s", item); } sum += s_time; } } - snprintf(tt, BUFFER_SIZES(start, tt, LEN_STATES), "; running time: %s\"", l_mktime(sum)); + tt = ap(start, LEN_STATES, tt, + "; running time: %s\"", l_mktime(sum)); tt = add_var(&out->kv_list, 32, RO); snprintf(tt, 32, "refclock_id=\"%s\"", parse->parse_type->cl_id); @@ -4263,32 +4274,32 @@ gps16x_message( char *p, *b; status = get_lsb_short(&bufp); - snprintf(buffer, sizeof(buffer), "meinberg_gps_status=\"[0x%04x] ", status); + p = b = buffer; + p = ap(buffer, sizeof(buffer), p, + "meinberg_gps_status=\"[0x%04x] ", + status); if (status) { - p = b = buffer + strlen(buffer); + b = p; while (s->flag) { if (status & s->flag) { if (p != b) { - *p++ = ','; - *p++ = ' '; + p = ap(buffer, sizeof(buffer), p, ", "); } - strncat(p, (const char *)s->string, sizeof(buffer)); + p = ap(buffer, sizeof(buffer), p, "%s", (const char *)s->string); } s++; } - - *p++ = '"'; - *p = '\0'; + p = ap(buffer, sizeof(buffer), p, "\""); } else { - strncat(buffer, "<OK>\"", sizeof(buffer)); + p = ap(buffer, sizeof(buffer), p, "<OK>\""); } set_var(&parse->kv, buffer, strlen(buffer)+1, RO|DEF); @@ -4339,53 +4350,54 @@ gps16x_message( { ANT_INFO antinfo; char buffer[512]; - char *p; + char *p, *q; get_mbg_antinfo(&bufp, &antinfo); - snprintf(buffer, sizeof(buffer), "meinberg_antenna_status=\""); - p = buffer + strlen(buffer); - + p = buffer; + p = ap(buffer, sizeof(buffer), p, "meinberg_antenna_status=\""); switch (antinfo.status) { case ANT_INVALID: - strncat(p, "<OK>", BUFFER_SIZE(buffer, p)); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "<OK>"); break; case ANT_DISCONN: - strncat(p, "DISCONNECTED since ", BUFFER_SIZE(buffer, p)); + q = ap(buffer, sizeof(buffer), + p, "DISCONNECTED since "); NLOG(NLOG_CLOCKSTATUS) ERR(ERR_BADSTATUS) msyslog(LOG_ERR,"PARSE receiver #%d: ANTENNA FAILURE: %s", CLK_UNIT(parse->peer), p); - p += strlen(p); + p = q; mbg_tm_str(&p, &antinfo.tm_disconn, BUFFER_SIZE(buffer, p)); *p = '\0'; break; case ANT_RECONN: - strncat(p, "RECONNECTED on ", BUFFER_SIZE(buffer, p)); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "RECONNECTED on "); mbg_tm_str(&p, &antinfo.tm_reconn, BUFFER_SIZE(buffer, p)); - snprintf(p, BUFFER_SIZE(buffer, p), ", reconnect clockoffset %c%ld.%07ld s, disconnect time ", + p = ap(buffer, sizeof(buffer), + p, ", reconnect clockoffset %c%ld.%07ld s, disconnect time ", (antinfo.delta_t < 0) ? '-' : '+', ABS(antinfo.delta_t) / 10000, ABS(antinfo.delta_t) % 10000); - p += strlen(p); mbg_tm_str(&p, &antinfo.tm_disconn, BUFFER_SIZE(buffer, p)); *p = '\0'; break; default: - snprintf(p, BUFFER_SIZE(buffer, p), "bad status 0x%04x", antinfo.status); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "bad status 0x%04x", + antinfo.status); break; } - strncat(p, "\"", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "\""); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO|DEF); + set_var(&parse->kv, buffer, sizeof(buffer), RO|DEF); } break; @@ -4404,102 +4416,101 @@ gps16x_message( int i; p = buffer; - strncpy(buffer, "gps_tot_51=\"", BUFFER_SIZE(buffer, p)); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "gps_tot_51=\""); mbg_tgps_str(&p, &cfgh.tot_51, BUFFER_SIZE(buffer, p)); - strncpy(p, "\"", BUFFER_SIZE(buffer, p)); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO); + p = ap(buffer, sizeof(buffer), + p, "\""); + set_var(&parse->kv, buffer, sizeof(buffer), RO); p = buffer; - strncpy(buffer, "gps_tot_63=\"", BUFFER_SIZE(buffer, p)); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "gps_tot_63=\""); mbg_tgps_str(&p, &cfgh.tot_63, BUFFER_SIZE(buffer, p)); - strncpy(p, "\"", BUFFER_SIZE(buffer, p)); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO); + p = ap(buffer, sizeof(buffer), + p, "\""); + set_var(&parse->kv, buffer, sizeof(buffer), RO); p = buffer; - strncpy(buffer, "gps_t0a=\"", BUFFER_SIZE(buffer, p)); - p += strlen(p); + p = ap(buffer, sizeof(buffer), + p, "gps_t0a=\""); mbg_tgps_str(&p, &cfgh.t0a, BUFFER_SIZE(buffer, p)); - strncpy(p, "\"", BUFFER_SIZE(buffer, p)); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO); + p = ap(buffer, sizeof(buffer), + p, "\""); + set_var(&parse->kv, buffer, sizeof(buffer), RO); for (i = MIN_SVNO; i < MAX_SVNO; i++) { p = buffer; - snprintf(p, BUFFER_SIZE(buffer, p), "gps_cfg[%d]=\"[0x%x] ", i, cfgh.cfg[i]); - p += strlen(p); + p = ap(buffer, sizeof(buffer), p, "gps_cfg[%d]=\"[0x%x] ", i, cfgh.cfg[i]); switch (cfgh.cfg[i] & 0x7) { case 0: - strncpy(p, "BLOCK I", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "BLOCK I"); break; case 1: - strncpy(p, "BLOCK II", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "BLOCK II"); break; default: - strncpy(p, "bad CFG", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "bad CFG"); break; } - strncat(p, "\"", BUFFER_SIZE(buffer, p)); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO); + p = ap(buffer, sizeof(buffer), p, "\""); + set_var(&parse->kv, buffer, sizeof(buffer), RO); p = buffer; - snprintf(p, BUFFER_SIZE(buffer, p), "gps_health[%d]=\"[0x%x] ", i, cfgh.health[i]); - p += strlen(p); + p = ap(buffer, sizeof(buffer), p, "gps_health[%d]=\"[0x%x] ", i, cfgh.health[i]); switch ((cfgh.health[i] >> 5) & 0x7 ) { case 0: - strncpy(p, "OK;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "OK;"); break; case 1: - strncpy(p, "PARITY;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "PARITY;"); break; case 2: - strncpy(p, "TLM/HOW;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "TLM/HOW;"); break; case 3: - strncpy(p, "Z-COUNT;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "Z-COUNT;"); break; case 4: - strncpy(p, "SUBFRAME 1,2,3;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "SUBFRAME 1,2,3;"); break; case 5: - strncpy(p, "SUBFRAME 4,5;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "SUBFRAME 4,5;"); break; case 6: - strncpy(p, "UPLOAD BAD;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "UPLOAD BAD;"); break; case 7: - strncpy(p, "DATA BAD;", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "DATA BAD;"); break; } - p += strlen(p); - switch (cfgh.health[i] & 0x1F) { case 0: - strncpy(p, "SIGNAL OK", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "SIGNAL OK"); break; case 0x1C: - strncpy(p, "SV TEMP OUT", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "SV TEMP OUT"); break; case 0x1D: - strncpy(p, "SV WILL BE TEMP OUT", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "SV WILL BE TEMP OUT"); break; case 0x1E: break; case 0x1F: - strncpy(p, "MULTIPLE ERRS", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "MULTIPLE ERRS"); break; default: - strncpy(p, "TRANSMISSION PROBLEMS", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "TRANSMISSION PROBLEMS"); break; } - strncat(p, "\"", sizeof(buffer)); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO); + p = ap(buffer, sizeof(buffer), p, "\""); + set_var(&parse->kv, buffer, sizeof(buffer), RO); } } } @@ -4523,16 +4534,16 @@ gps16x_message( if (utc.valid) { - strncpy(p, "gps_utc_correction=\"", sizeof(buffer)); + p = ap(buffer, sizeof(buffer), p, "gps_utc_correction=\""); p += strlen(p); mk_utcinfo(p, utc.t0t.wn, utc.WNlsf, utc.DNt, utc.delta_tls, utc.delta_tlsf, BUFFER_SIZE(buffer, p)); - strncat(p, "\"", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "\""); } else { - strncpy(p, "gps_utc_correction=\"<NO UTC DATA>\"", BUFFER_SIZE(buffer, p)); + p = ap(buffer, sizeof(buffer), p, "gps_utc_correction=\"<NO UTC DATA>\""); } - set_var(&parse->kv, buffer, strlen(buffer)+1, RO|DEF); + set_var(&parse->kv, buffer, sizeof(buffer), RO|DEF); } break; @@ -4554,9 +4565,9 @@ gps16x_message( snprintf(buffer, sizeof(buffer), "gps_message=\"%s\"", buffer1); } else - strncpy(buffer, "gps_message=<NONE>", sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "gps_message=<NONE>"); - set_var(&parse->kv, buffer, strlen(buffer)+1, RO|DEF); + set_var(&parse->kv, buffer, sizeof(buffer), RO|DEF); } break; @@ -5422,34 +5433,33 @@ trimbletsip_message( break; case CMD_RBEST4: - strncpy(t, "mode: ", BUFFER_SIZE(pbuffer, t)); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, "mode: "); switch (mb(0) & 0xF) { default: - snprintf(t, BUFFER_SIZE(pbuffer, t), "0x%x", mb(0) & 0x7); + t = ap(pbuffer, sizeof(pbuffer), t, + "0x%x", mb(0) & 0x7); break; case 1: - strncpy(t, "0D", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "0D"); break; case 3: - strncpy(t, "2D", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "2D"); break; case 4: - strncpy(t, "3D", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "3D"); break; } - t += strlen(t); if (mb(0) & 0x10) - strncpy(t, "-MANUAL, ", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "-MANUAL, "); else - strncpy(t, "-AUTO, ", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "-AUTO, "); t += strlen(t); - snprintf(t, BUFFER_SIZE(pbuffer, t), "satellites %02d %02d %02d %02d, PDOP %.2f, HDOP %.2f, VDOP %.2f, TDOP %.2f", + t = ap(pbuffer, sizeof(pbuffer), t, "satellites %02d %02d %02d %02d, PDOP %.2f, HDOP %.2f, VDOP %.2f, TDOP %.2f", mb(1), mb(2), mb(3), mb(4), getflt((unsigned char *)&mb(5)), getflt((unsigned char *)&mb(9)), @@ -5459,7 +5469,7 @@ trimbletsip_message( break; case CMD_RVERSION: - snprintf(t, BUFFER_SIZE(pbuffer, t), "%d.%d (%d/%d/%d)", + t = ap(pbuffer, sizeof(pbuffer), t, "%d.%d (%d/%d/%d)", mb(0)&0xff, mb(1)&0xff, 1900+(mb(4)&0xff), mb(2)&0xff, mb(3)&0xff); break; @@ -5482,43 +5492,40 @@ trimbletsip_message( switch (mb(0) & 0xFF) { default: - snprintf(t, BUFFER_SIZE(pbuffer, t), "illegal value 0x%02x", mb(0) & 0xFF); + t = ap(pbuffer, sizeof(pbuffer), t, "illegal value 0x%02x", mb(0) & 0xFF); break; case 0x00: - strncpy(t, "doing position fixes", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "doing position fixes", BUFFER_SIZE(pbuffer, t)); break; case 0x01: - strncpy(t, "no GPS time yet", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "no GPS time yet", BUFFER_SIZE(pbuffer, t)); break; case 0x03: - strncpy(t, "PDOP too high", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "PDOP too high", BUFFER_SIZE(pbuffer, t)); break; case 0x08: - strncpy(t, "no usable satellites", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "no usable satellites", BUFFER_SIZE(pbuffer, t)); break; case 0x09: - strncpy(t, "only ONE usable satellite", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "only ONE usable satellite", BUFFER_SIZE(pbuffer, t)); break; case 0x0A: - strncpy(t, "only TWO usable satellites", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "only TWO usable satellites", BUFFER_SIZE(pbuffer, t)); break; case 0x0B: - strncpy(t, "only THREE usable satellites", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "only THREE usable satellites", BUFFER_SIZE(pbuffer, t)); break; case 0x0C: - strncpy(t, "the chosen satellite is unusable", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "the chosen satellite is unusable", BUFFER_SIZE(pbuffer, t)); break; } - t += strlen(t); - bits = mb(1) & 0xFF; for (i = 0; i < 8; i++) if (bits & (0x1<<i)) { - snprintf(t, BUFFER_SIZE(pbuffer, t), ", %s", msgs[i]); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, ", %s", msgs[i]); } } break; @@ -5543,24 +5550,21 @@ trimbletsip_message( int i, bits; - snprintf(t, BUFFER_SIZE(pbuffer, t), "machine id 0x%02x", mb(0) & 0xFF); - t += strlen(t); - + t = ap(pbuffer, sizeof(pbuffer), t, "machine id 0x%02x", mb(0) & 0xFF); bits = mb(1) & 0xFF; for (i = 0; i < 8; i++) if (bits & (0x1<<i)) { - snprintf(t, BUFFER_SIZE(pbuffer, t), ", %s", msgs[i]); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, ", %s", msgs[i]); } - snprintf(t, BUFFER_SIZE(pbuffer, t), ", Superpackets %ssupported", (mb(2) & 0xFF) ? "" :"un" ); + t = ap(pbuffer, sizeof(pbuffer), t, ", Superpackets %ssupported", (mb(2) & 0xFF) ? "" :"un" ); } break; case CMD_ROPERPARAM: - snprintf(t, BUFFER_SIZE(pbuffer, t), "%2x %.1f %.1f %.1f %.1f", + t = ap(pbuffer, sizeof(pbuffer), t, "%2x %.1f %.1f %.1f %.1f", mb(0), getflt((unsigned char *)&mb(1)), getflt((unsigned char *)&mb(5)), getflt((unsigned char *)&mb(9)), getflt((unsigned char *)&mb(13))); break; @@ -5580,19 +5584,19 @@ trimbletsip_message( } else { - strncpy(t, "<NO UTC DATA>", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "<NO UTC DATA>"); } } break; case CMD_RSAT1BIAS: - snprintf(t, BUFFER_SIZE(pbuffer, t), "%.1fm %.2fm/s at %.1fs", + t = ap(pbuffer, sizeof(pbuffer), t, "%.1fm %.2fm/s at %.1fs", getflt(&mb(0)), getflt(&mb(4)), getflt(&mb(8))); break; case CMD_RIOOPTIONS: { - snprintf(t, BUFFER_SIZE(pbuffer, t), "%02x %02x %02x %02x", + t = ap(pbuffer, sizeof(pbuffer), t, "%02x %02x %02x %02x", mb(0), mb(1), mb(2), mb(3)); if (mb(0) != TRIM_POS_OPT || mb(2) != TRIM_TIME_OPT) @@ -5610,7 +5614,7 @@ trimbletsip_message( double f = getflt((unsigned char *)&mb(12)); if (f > 0.0) - snprintf(t, BUFFER_SIZE(pbuffer, t), "x= %.1fm, y= %.1fm, z= %.1fm, time_of_fix= %f sec", + t = ap(pbuffer, sizeof(pbuffer), t, "x= %.1fm, y= %.1fm, z= %.1fm, time_of_fix= %f sec", x, y, z, f); else @@ -5625,7 +5629,7 @@ trimbletsip_message( double f = getflt((unsigned char *)&mb(12)); if (f > 0.0) - snprintf(t, BUFFER_SIZE(pbuffer, t), "lat %f %c, long %f %c, alt %.2fm", + t = ap(pbuffer, sizeof(pbuffer), t, "lat %f %c, long %f %c, alt %.2fm", ((lat < 0.0) ? (-lat) : (lat))*RTOD, (lat < 0.0 ? 'S' : 'N'), ((lng < 0.0) ? (-lng) : (lng))*RTOD, (lng < 0.0 ? 'W' : 'E'), getflt((unsigned char *)&mb(8))); @@ -5639,7 +5643,7 @@ trimbletsip_message( double x = getdbl((unsigned char *)&mb(0)); double y = getdbl((unsigned char *)&mb(8)); double z = getdbl((unsigned char *)&mb(16)); - snprintf(t, BUFFER_SIZE(pbuffer, t), "x= %.1fm, y= %.1fm, z= %.1fm", + t = ap(pbuffer, sizeof(pbuffer), t, "x= %.1fm, y= %.1fm, z= %.1fm", x, y, z); } break; @@ -5648,7 +5652,7 @@ trimbletsip_message( { double lat = getdbl((unsigned char *)&mb(0)); double lng = getdbl((unsigned char *)&mb(8)); - snprintf(t, BUFFER_SIZE(pbuffer, t), "lat %f %c, lon %f %c, alt %.2fm", + t = ap(pbuffer, sizeof(pbuffer), t, "lat %f %c, lon %f %c, alt %.2fm", ((lat < 0.0) ? (-lat) : (lat))*RTOD, (lat < 0.0 ? 'S' : 'N'), ((lng < 0.0) ? (-lng) : (lng))*RTOD, (lng < 0.0 ? 'W' : 'E'), getdbl((unsigned char *)&mb(16))); @@ -5659,43 +5663,38 @@ trimbletsip_message( { int i, sats; - strncpy(t, "mode: ", BUFFER_SIZE(pbuffer, t)); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, "mode: "); switch (mb(0) & 0x7) { default: - snprintf(t, BUFFER_SIZE(pbuffer, t), "0x%x", mb(0) & 0x7); + t = ap(pbuffer, sizeof(pbuffer), t, "0x%x", mb(0) & 0x7); break; case 3: - strncpy(t, "2D", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "2D"); break; case 4: - strncpy(t, "3D", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "3D"); break; } - t += strlen(t); if (mb(0) & 0x8) - strncpy(t, "-MANUAL, ", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "-MANUAL, "); else - strncpy(t, "-AUTO, ", BUFFER_SIZE(pbuffer, t)); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, "-AUTO, "); sats = (mb(0)>>4) & 0xF; - snprintf(t, BUFFER_SIZE(pbuffer, t), "PDOP %.2f, HDOP %.2f, VDOP %.2f, TDOP %.2f, %d satellite%s in view: ", + t = ap(pbuffer, sizeof(pbuffer), t, "PDOP %.2f, HDOP %.2f, VDOP %.2f, TDOP %.2f, %d satellite%s in view: ", getflt((unsigned char *)&mb(1)), getflt((unsigned char *)&mb(5)), getflt((unsigned char *)&mb(9)), getflt((unsigned char *)&mb(13)), sats, (sats == 1) ? "" : "s"); - t += strlen(t); for (i=0; i < sats; i++) { - snprintf(t, BUFFER_SIZE(pbuffer, t), "%s%02d", i ? ", " : "", mb(17+i)); - t += strlen(t); + t = ap(pbuffer, sizeof(pbuffer), t, "%s%02d", i ? ", " : "", mb(17+i)); if (tr) tr->ctrack |= (1 << (mb(17+i)-1)); } @@ -5709,52 +5708,46 @@ trimbletsip_message( case CMD_RSTATTRACK: { - snprintf(t-2, BUFFER_SIZE(pbuffer, t-2), "[%02d]=\"", mb(0)); /* add index to var name */ - t += strlen(t); - + t = ap(pbuffer, sizeof(pbuffer), t-2, "[%02d]=\"", mb(0)); /* add index to var name */ if (getflt((unsigned char *)&mb(4)) < 0.0) { - strncpy(t, "<NO MEASUREMENTS>", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "<NO MEASUREMENTS>"); var_flag &= ~DEF; } else { - snprintf(t, BUFFER_SIZE(pbuffer, t), "ch=%d, acq=%s, eph=%d, signal_level= %5.2f, elevation= %5.2f, azimuth= %6.2f", + t = ap(pbuffer, sizeof(pbuffer), t, "ch=%d, acq=%s, eph=%d, signal_level= %5.2f, elevation= %5.2f, azimuth= %6.2f", (mb(1) & 0xFF)>>3, mb(2) ? ((mb(2) == 1) ? "ACQ" : "SRCH") : "NEVER", mb(3), getflt((unsigned char *)&mb(4)), getflt((unsigned char *)&mb(12)) * RTOD, getflt((unsigned char *)&mb(16)) * RTOD); - t += strlen(t); if (mb(20)) { var_flag &= ~DEF; - strncpy(t, ", OLD", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, ", OLD"); } - t += strlen(t); if (mb(22)) { if (mb(22) == 1) - strncpy(t, ", BAD PARITY", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, ", BAD PARITY"); else if (mb(22) == 2) - strncpy(t, ", BAD EPH HEALTH", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, ", BAD EPH HEALTH"); } - t += strlen(t); if (mb(23)) - strncpy(t, ", collecting data", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, ", collecting data"); } } break; default: - strncpy(t, "<UNDECODED>", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t, "<UNDECODED>"); break; } - t += strlen(t); - strncpy(t,"\"", BUFFER_SIZE(pbuffer, t)); + t = ap(pbuffer, sizeof(pbuffer), t,"\""); set_var(&parse->kv, pbuffer, sizeof(pbuffer), var_flag); } }