3232#include <math.h>
3333#include <stdio.h>
3434#include <string.h>
35+ #include <stdarg.h>
3536
3637#include "ntimed.h"
3738#include "ntp.h"
@@ -70,6 +71,17 @@ NTP_Tool_Client_Req(struct ntp_packet *np)
7071 * XXX: Nanosecond precision is enough for everybody.
7172 */
7273
74+ static void __printflike (3 , 4 )
75+ bxprintf (char * * bp , const char * e , const char * fmt , ...)
76+ {
77+ va_list ap ;
78+
79+ assert (* bp < e );
80+ va_start (ap , fmt );
81+ * bp += vsnprintf (* bp , (unsigned )(e - * bp ), fmt , ap );
82+ va_end (ap );
83+ }
84+
7385void
7486NTP_Tool_Format (char * p , ssize_t len , const struct ntp_packet * pkt )
7587{
@@ -82,58 +94,44 @@ NTP_Tool_Format(char *p, ssize_t len, const struct ntp_packet *pkt)
8294
8395 e = p + len ;
8496
85- p += snprintf ( p , e - p , "[%d" , pkt -> ntp_leap );
86- assert ( p < e );
97+ bxprintf ( & p , e , "[%d" , pkt -> ntp_leap );
98+ bxprintf ( & p , e , " %u" , pkt -> ntp_version );
8799
88- p += snprintf (p , e - p , " %u" , pkt -> ntp_version );
89- assert (p < e );
90-
91- p += snprintf (p , e - p , " %d" , pkt -> ntp_mode );
92- assert (p < e );
100+ bxprintf (& p , e , " %d" , pkt -> ntp_mode );
93101
94- p += snprintf (p , e - p , " %3u" , pkt -> ntp_stratum );
95- assert (p < e );
102+ bxprintf (& p , e , " %3u" , pkt -> ntp_stratum );
96103
97- p += snprintf (p , e - p , " %3u" , pkt -> ntp_poll );
98- assert (p < e );
104+ bxprintf (& p , e , " %3u" , pkt -> ntp_poll );
99105
100- p += snprintf (p , e - p , " %4d" , pkt -> ntp_precision );
101- assert (p < e );
106+ bxprintf (& p , e , " %4d" , pkt -> ntp_precision );
102107
103108 TS_Format (buf , sizeof buf , & pkt -> ntp_delay );
104- p += snprintf (p , e - p , " %s" , buf ); assert (p < e );
105- assert (p < e );
109+ bxprintf (& p , e , " %s" , buf ); assert (p < e );
106110
107111 TS_Format (buf , sizeof buf , & pkt -> ntp_dispersion );
108- p += snprintf (p , e - p , " %s" , buf ); assert (p < e );
109- assert (p < e );
112+ bxprintf (& p , e , " %s" , buf ); assert (p < e );
110113
111- p += snprintf ( p , e - p , " 0x%02x%02x%02x%02x" ,
114+ bxprintf ( & p , e , " 0x%02x%02x%02x%02x" ,
112115 pkt -> ntp_refid [0 ], pkt -> ntp_refid [1 ],
113116 pkt -> ntp_refid [2 ], pkt -> ntp_refid [3 ]);
114- assert (p < e );
115117
116- p += snprintf ( p , e - p , " %.9f" ,
118+ bxprintf ( & p , e , " %.9f" ,
117119 TS_Diff (& pkt -> ntp_reference , & pkt -> ntp_origin ));
118- assert (p < e );
119120
120121 TS_Format (buf , sizeof buf , & pkt -> ntp_origin );
121- p += snprintf (p , e - p , " %s" , buf ); assert (p < e );
122- assert (p < e );
122+ bxprintf (& p , e , " %s" , buf ); assert (p < e );
123123
124- p += snprintf ( p , e - p , " %.9f" ,
124+ bxprintf ( & p , e , " %.9f" ,
125125 TS_Diff (& pkt -> ntp_receive , & pkt -> ntp_origin ));
126- assert (p < e );
127126
128- p += snprintf ( p , e - p , " %.9f" ,
127+ bxprintf ( & p , e , " %.9f" ,
129128 TS_Diff (& pkt -> ntp_transmit , & pkt -> ntp_receive ));
130- assert (p < e );
131129
132130 if (pkt -> ts_rx .sec && pkt -> ts_rx .frac ) {
133- p += snprintf ( p , e - p , " %.9f]" ,
131+ bxprintf ( & p , e , " %.9f]" ,
134132 TS_Diff (& pkt -> ts_rx , & pkt -> ntp_transmit ));
135133 } else {
136- p += snprintf ( p , e - p , " %.9f]" , 0.0 );
134+ bxprintf ( & p , e , " %.9f]" , 0.0 );
137135 }
138136 assert (p < e );
139137}
@@ -173,10 +171,10 @@ NTP_Tool_Scan(struct ntp_packet *pkt, const char *buf)
173171
174172 INIT_OBJ (pkt , NTP_PACKET_MAGIC );
175173 pkt -> ntp_leap = (enum ntp_leap )u_fields [0 ];
176- pkt -> ntp_version = u_fields [1 ];
174+ pkt -> ntp_version = ( uint8_t ) u_fields [1 ];
177175 pkt -> ntp_mode = (enum ntp_mode )u_fields [2 ];
178- pkt -> ntp_stratum = u_fields [3 ];
179- pkt -> ntp_poll = u_fields [4 ];
176+ pkt -> ntp_stratum = ( uint8_t ) u_fields [3 ];
177+ pkt -> ntp_poll = ( uint8_t ) u_fields [4 ];
180178 pkt -> ntp_precision = (int8_t )floor (d_fields [0 ]);
181179 TS_Double (& pkt -> ntp_delay , d_fields [1 ]);
182180 TS_Double (& pkt -> ntp_dispersion , d_fields [2 ]);
0 commit comments