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);
 	}
 }

Reply via email to