xref: /aosp_15_r20/external/iperf3/src/iperf_util.c (revision 7ab6e6ace082586527a400463bc693a412a40341)
1*7ab6e6acSAndroid Build Coastguard Worker /*
2*7ab6e6acSAndroid Build Coastguard Worker  * iperf, Copyright (c) 2014, 2016, 2017, The Regents of the University of
3*7ab6e6acSAndroid Build Coastguard Worker  * California, through Lawrence Berkeley National Laboratory (subject
4*7ab6e6acSAndroid Build Coastguard Worker  * to receipt of any required approvals from the U.S. Dept. of
5*7ab6e6acSAndroid Build Coastguard Worker  * Energy).  All rights reserved.
6*7ab6e6acSAndroid Build Coastguard Worker  *
7*7ab6e6acSAndroid Build Coastguard Worker  * If you have questions about your rights to use or distribute this
8*7ab6e6acSAndroid Build Coastguard Worker  * software, please contact Berkeley Lab's Technology Transfer
9*7ab6e6acSAndroid Build Coastguard Worker  * Department at [email protected].
10*7ab6e6acSAndroid Build Coastguard Worker  *
11*7ab6e6acSAndroid Build Coastguard Worker  * NOTICE.  This software is owned by the U.S. Department of Energy.
12*7ab6e6acSAndroid Build Coastguard Worker  * As such, the U.S. Government has been granted for itself and others
13*7ab6e6acSAndroid Build Coastguard Worker  * acting on its behalf a paid-up, nonexclusive, irrevocable,
14*7ab6e6acSAndroid Build Coastguard Worker  * worldwide license in the Software to reproduce, prepare derivative
15*7ab6e6acSAndroid Build Coastguard Worker  * works, and perform publicly and display publicly.  Beginning five
16*7ab6e6acSAndroid Build Coastguard Worker  * (5) years after the date permission to assert copyright is obtained
17*7ab6e6acSAndroid Build Coastguard Worker  * from the U.S. Department of Energy, and subject to any subsequent
18*7ab6e6acSAndroid Build Coastguard Worker  * five (5) year renewals, the U.S. Government is granted for itself
19*7ab6e6acSAndroid Build Coastguard Worker  * and others acting on its behalf a paid-up, nonexclusive,
20*7ab6e6acSAndroid Build Coastguard Worker  * irrevocable, worldwide license in the Software to reproduce,
21*7ab6e6acSAndroid Build Coastguard Worker  * prepare derivative works, distribute copies to the public, perform
22*7ab6e6acSAndroid Build Coastguard Worker  * publicly and display publicly, and to permit others to do so.
23*7ab6e6acSAndroid Build Coastguard Worker  *
24*7ab6e6acSAndroid Build Coastguard Worker  * This code is distributed under a BSD style license, see the LICENSE
25*7ab6e6acSAndroid Build Coastguard Worker  * file for complete information.
26*7ab6e6acSAndroid Build Coastguard Worker  */
27*7ab6e6acSAndroid Build Coastguard Worker /* iperf_util.c
28*7ab6e6acSAndroid Build Coastguard Worker  *
29*7ab6e6acSAndroid Build Coastguard Worker  * Iperf utility functions
30*7ab6e6acSAndroid Build Coastguard Worker  *
31*7ab6e6acSAndroid Build Coastguard Worker  */
32*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_config.h"
33*7ab6e6acSAndroid Build Coastguard Worker 
34*7ab6e6acSAndroid Build Coastguard Worker #include <stdio.h>
35*7ab6e6acSAndroid Build Coastguard Worker #include <signal.h>
36*7ab6e6acSAndroid Build Coastguard Worker #include <stdlib.h>
37*7ab6e6acSAndroid Build Coastguard Worker #include <unistd.h>
38*7ab6e6acSAndroid Build Coastguard Worker #include <string.h>
39*7ab6e6acSAndroid Build Coastguard Worker #include <stdarg.h>
40*7ab6e6acSAndroid Build Coastguard Worker #include <sys/select.h>
41*7ab6e6acSAndroid Build Coastguard Worker #include <sys/types.h>
42*7ab6e6acSAndroid Build Coastguard Worker #include <sys/time.h>
43*7ab6e6acSAndroid Build Coastguard Worker #include <sys/resource.h>
44*7ab6e6acSAndroid Build Coastguard Worker #include <sys/utsname.h>
45*7ab6e6acSAndroid Build Coastguard Worker #include <time.h>
46*7ab6e6acSAndroid Build Coastguard Worker #include <errno.h>
47*7ab6e6acSAndroid Build Coastguard Worker #include <fcntl.h>
48*7ab6e6acSAndroid Build Coastguard Worker 
49*7ab6e6acSAndroid Build Coastguard Worker #include "cjson.h"
50*7ab6e6acSAndroid Build Coastguard Worker #include "iperf.h"
51*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_api.h"
52*7ab6e6acSAndroid Build Coastguard Worker 
53*7ab6e6acSAndroid Build Coastguard Worker /*
54*7ab6e6acSAndroid Build Coastguard Worker  * Read entropy from /dev/urandom
55*7ab6e6acSAndroid Build Coastguard Worker  * Errors are fatal.
56*7ab6e6acSAndroid Build Coastguard Worker  * Returns 0 on success.
57*7ab6e6acSAndroid Build Coastguard Worker  */
readentropy(void * out,size_t outsize)58*7ab6e6acSAndroid Build Coastguard Worker int readentropy(void *out, size_t outsize)
59*7ab6e6acSAndroid Build Coastguard Worker {
60*7ab6e6acSAndroid Build Coastguard Worker     static FILE *frandom;
61*7ab6e6acSAndroid Build Coastguard Worker     static const char rndfile[] = "/dev/urandom";
62*7ab6e6acSAndroid Build Coastguard Worker 
63*7ab6e6acSAndroid Build Coastguard Worker     if (!outsize) return 0;
64*7ab6e6acSAndroid Build Coastguard Worker 
65*7ab6e6acSAndroid Build Coastguard Worker     if (frandom == NULL) {
66*7ab6e6acSAndroid Build Coastguard Worker         frandom = fopen(rndfile, "rb");
67*7ab6e6acSAndroid Build Coastguard Worker         if (frandom == NULL) {
68*7ab6e6acSAndroid Build Coastguard Worker             iperf_errexit(NULL, "error - failed to open %s: %s\n",
69*7ab6e6acSAndroid Build Coastguard Worker                           rndfile, strerror(errno));
70*7ab6e6acSAndroid Build Coastguard Worker         }
71*7ab6e6acSAndroid Build Coastguard Worker         setbuf(frandom, NULL);
72*7ab6e6acSAndroid Build Coastguard Worker     }
73*7ab6e6acSAndroid Build Coastguard Worker     if (fread(out, 1, outsize, frandom) != outsize) {
74*7ab6e6acSAndroid Build Coastguard Worker         iperf_errexit(NULL, "error - failed to read %s: %s\n",
75*7ab6e6acSAndroid Build Coastguard Worker                       rndfile,
76*7ab6e6acSAndroid Build Coastguard Worker                       feof(frandom) ? "EOF" : strerror(errno));
77*7ab6e6acSAndroid Build Coastguard Worker     }
78*7ab6e6acSAndroid Build Coastguard Worker     return 0;
79*7ab6e6acSAndroid Build Coastguard Worker }
80*7ab6e6acSAndroid Build Coastguard Worker 
81*7ab6e6acSAndroid Build Coastguard Worker 
82*7ab6e6acSAndroid Build Coastguard Worker /*
83*7ab6e6acSAndroid Build Coastguard Worker  * Fills buffer with repeating pattern (similar to pattern that used in iperf2)
84*7ab6e6acSAndroid Build Coastguard Worker  */
fill_with_repeating_pattern(void * out,size_t outsize)85*7ab6e6acSAndroid Build Coastguard Worker void fill_with_repeating_pattern(void *out, size_t outsize)
86*7ab6e6acSAndroid Build Coastguard Worker {
87*7ab6e6acSAndroid Build Coastguard Worker     size_t i;
88*7ab6e6acSAndroid Build Coastguard Worker     int counter = 0;
89*7ab6e6acSAndroid Build Coastguard Worker     char *buf = (char *)out;
90*7ab6e6acSAndroid Build Coastguard Worker 
91*7ab6e6acSAndroid Build Coastguard Worker     if (!outsize) return;
92*7ab6e6acSAndroid Build Coastguard Worker 
93*7ab6e6acSAndroid Build Coastguard Worker     for (i = 0; i < outsize; i++) {
94*7ab6e6acSAndroid Build Coastguard Worker         buf[i] = (char)('0' + counter);
95*7ab6e6acSAndroid Build Coastguard Worker         if (counter >= 9)
96*7ab6e6acSAndroid Build Coastguard Worker             counter = 0;
97*7ab6e6acSAndroid Build Coastguard Worker         else
98*7ab6e6acSAndroid Build Coastguard Worker             counter++;
99*7ab6e6acSAndroid Build Coastguard Worker     }
100*7ab6e6acSAndroid Build Coastguard Worker }
101*7ab6e6acSAndroid Build Coastguard Worker 
102*7ab6e6acSAndroid Build Coastguard Worker 
103*7ab6e6acSAndroid Build Coastguard Worker /* make_cookie
104*7ab6e6acSAndroid Build Coastguard Worker  *
105*7ab6e6acSAndroid Build Coastguard Worker  * Generate and return a cookie string
106*7ab6e6acSAndroid Build Coastguard Worker  *
107*7ab6e6acSAndroid Build Coastguard Worker  * Iperf uses this function to create test "cookies" which
108*7ab6e6acSAndroid Build Coastguard Worker  * server as unique test identifiers. These cookies are also
109*7ab6e6acSAndroid Build Coastguard Worker  * used for the authentication of stream connections.
110*7ab6e6acSAndroid Build Coastguard Worker  * Assumes cookie has size (COOKIE_SIZE + 1) char's.
111*7ab6e6acSAndroid Build Coastguard Worker  */
112*7ab6e6acSAndroid Build Coastguard Worker 
113*7ab6e6acSAndroid Build Coastguard Worker void
make_cookie(const char * cookie)114*7ab6e6acSAndroid Build Coastguard Worker make_cookie(const char *cookie)
115*7ab6e6acSAndroid Build Coastguard Worker {
116*7ab6e6acSAndroid Build Coastguard Worker     unsigned char *out = (unsigned char*)cookie;
117*7ab6e6acSAndroid Build Coastguard Worker     size_t pos;
118*7ab6e6acSAndroid Build Coastguard Worker     static const unsigned char rndchars[] = "abcdefghijklmnopqrstuvwxyz234567";
119*7ab6e6acSAndroid Build Coastguard Worker 
120*7ab6e6acSAndroid Build Coastguard Worker     readentropy(out, COOKIE_SIZE);
121*7ab6e6acSAndroid Build Coastguard Worker     for (pos = 0; pos < (COOKIE_SIZE - 1); pos++) {
122*7ab6e6acSAndroid Build Coastguard Worker         out[pos] = rndchars[out[pos] % (sizeof(rndchars) - 1)];
123*7ab6e6acSAndroid Build Coastguard Worker     }
124*7ab6e6acSAndroid Build Coastguard Worker     out[pos] = '\0';
125*7ab6e6acSAndroid Build Coastguard Worker }
126*7ab6e6acSAndroid Build Coastguard Worker 
127*7ab6e6acSAndroid Build Coastguard Worker 
128*7ab6e6acSAndroid Build Coastguard Worker /* is_closed
129*7ab6e6acSAndroid Build Coastguard Worker  *
130*7ab6e6acSAndroid Build Coastguard Worker  * Test if the file descriptor fd is closed.
131*7ab6e6acSAndroid Build Coastguard Worker  *
132*7ab6e6acSAndroid Build Coastguard Worker  * Iperf uses this function to test whether a TCP stream socket
133*7ab6e6acSAndroid Build Coastguard Worker  * is closed, because accepting and denying an invalid connection
134*7ab6e6acSAndroid Build Coastguard Worker  * in iperf_tcp_accept is not considered an error.
135*7ab6e6acSAndroid Build Coastguard Worker  */
136*7ab6e6acSAndroid Build Coastguard Worker 
137*7ab6e6acSAndroid Build Coastguard Worker int
is_closed(int fd)138*7ab6e6acSAndroid Build Coastguard Worker is_closed(int fd)
139*7ab6e6acSAndroid Build Coastguard Worker {
140*7ab6e6acSAndroid Build Coastguard Worker     struct timeval tv;
141*7ab6e6acSAndroid Build Coastguard Worker     fd_set readset;
142*7ab6e6acSAndroid Build Coastguard Worker 
143*7ab6e6acSAndroid Build Coastguard Worker     FD_ZERO(&readset);
144*7ab6e6acSAndroid Build Coastguard Worker     FD_SET(fd, &readset);
145*7ab6e6acSAndroid Build Coastguard Worker     tv.tv_sec = 0;
146*7ab6e6acSAndroid Build Coastguard Worker     tv.tv_usec = 0;
147*7ab6e6acSAndroid Build Coastguard Worker 
148*7ab6e6acSAndroid Build Coastguard Worker     if (select(fd+1, &readset, NULL, NULL, &tv) < 0) {
149*7ab6e6acSAndroid Build Coastguard Worker         if (errno == EBADF)
150*7ab6e6acSAndroid Build Coastguard Worker             return 1;
151*7ab6e6acSAndroid Build Coastguard Worker     }
152*7ab6e6acSAndroid Build Coastguard Worker     return 0;
153*7ab6e6acSAndroid Build Coastguard Worker }
154*7ab6e6acSAndroid Build Coastguard Worker 
155*7ab6e6acSAndroid Build Coastguard Worker 
156*7ab6e6acSAndroid Build Coastguard Worker double
timeval_to_double(struct timeval * tv)157*7ab6e6acSAndroid Build Coastguard Worker timeval_to_double(struct timeval * tv)
158*7ab6e6acSAndroid Build Coastguard Worker {
159*7ab6e6acSAndroid Build Coastguard Worker     double d;
160*7ab6e6acSAndroid Build Coastguard Worker 
161*7ab6e6acSAndroid Build Coastguard Worker     d = tv->tv_sec + tv->tv_usec / 1000000;
162*7ab6e6acSAndroid Build Coastguard Worker 
163*7ab6e6acSAndroid Build Coastguard Worker     return d;
164*7ab6e6acSAndroid Build Coastguard Worker }
165*7ab6e6acSAndroid Build Coastguard Worker 
166*7ab6e6acSAndroid Build Coastguard Worker int
timeval_equals(struct timeval * tv0,struct timeval * tv1)167*7ab6e6acSAndroid Build Coastguard Worker timeval_equals(struct timeval * tv0, struct timeval * tv1)
168*7ab6e6acSAndroid Build Coastguard Worker {
169*7ab6e6acSAndroid Build Coastguard Worker     if ( tv0->tv_sec == tv1->tv_sec && tv0->tv_usec == tv1->tv_usec )
170*7ab6e6acSAndroid Build Coastguard Worker 	return 1;
171*7ab6e6acSAndroid Build Coastguard Worker     else
172*7ab6e6acSAndroid Build Coastguard Worker 	return 0;
173*7ab6e6acSAndroid Build Coastguard Worker }
174*7ab6e6acSAndroid Build Coastguard Worker 
175*7ab6e6acSAndroid Build Coastguard Worker double
timeval_diff(struct timeval * tv0,struct timeval * tv1)176*7ab6e6acSAndroid Build Coastguard Worker timeval_diff(struct timeval * tv0, struct timeval * tv1)
177*7ab6e6acSAndroid Build Coastguard Worker {
178*7ab6e6acSAndroid Build Coastguard Worker     double time1, time2;
179*7ab6e6acSAndroid Build Coastguard Worker 
180*7ab6e6acSAndroid Build Coastguard Worker     time1 = tv0->tv_sec + (tv0->tv_usec / 1000000.0);
181*7ab6e6acSAndroid Build Coastguard Worker     time2 = tv1->tv_sec + (tv1->tv_usec / 1000000.0);
182*7ab6e6acSAndroid Build Coastguard Worker 
183*7ab6e6acSAndroid Build Coastguard Worker     time1 = time1 - time2;
184*7ab6e6acSAndroid Build Coastguard Worker     if (time1 < 0)
185*7ab6e6acSAndroid Build Coastguard Worker         time1 = -time1;
186*7ab6e6acSAndroid Build Coastguard Worker     return time1;
187*7ab6e6acSAndroid Build Coastguard Worker }
188*7ab6e6acSAndroid Build Coastguard Worker 
189*7ab6e6acSAndroid Build Coastguard Worker void
cpu_util(double pcpu[3])190*7ab6e6acSAndroid Build Coastguard Worker cpu_util(double pcpu[3])
191*7ab6e6acSAndroid Build Coastguard Worker {
192*7ab6e6acSAndroid Build Coastguard Worker     static struct iperf_time last;
193*7ab6e6acSAndroid Build Coastguard Worker     static clock_t clast;
194*7ab6e6acSAndroid Build Coastguard Worker     static struct rusage rlast;
195*7ab6e6acSAndroid Build Coastguard Worker     struct iperf_time now, temp_time;
196*7ab6e6acSAndroid Build Coastguard Worker     clock_t ctemp;
197*7ab6e6acSAndroid Build Coastguard Worker     struct rusage rtemp;
198*7ab6e6acSAndroid Build Coastguard Worker     double timediff;
199*7ab6e6acSAndroid Build Coastguard Worker     double userdiff;
200*7ab6e6acSAndroid Build Coastguard Worker     double systemdiff;
201*7ab6e6acSAndroid Build Coastguard Worker 
202*7ab6e6acSAndroid Build Coastguard Worker     if (pcpu == NULL) {
203*7ab6e6acSAndroid Build Coastguard Worker         iperf_time_now(&last);
204*7ab6e6acSAndroid Build Coastguard Worker         clast = clock();
205*7ab6e6acSAndroid Build Coastguard Worker 	getrusage(RUSAGE_SELF, &rlast);
206*7ab6e6acSAndroid Build Coastguard Worker         return;
207*7ab6e6acSAndroid Build Coastguard Worker     }
208*7ab6e6acSAndroid Build Coastguard Worker 
209*7ab6e6acSAndroid Build Coastguard Worker     iperf_time_now(&now);
210*7ab6e6acSAndroid Build Coastguard Worker     ctemp = clock();
211*7ab6e6acSAndroid Build Coastguard Worker     getrusage(RUSAGE_SELF, &rtemp);
212*7ab6e6acSAndroid Build Coastguard Worker 
213*7ab6e6acSAndroid Build Coastguard Worker     iperf_time_diff(&now, &last, &temp_time);
214*7ab6e6acSAndroid Build Coastguard Worker     timediff = iperf_time_in_usecs(&temp_time);
215*7ab6e6acSAndroid Build Coastguard Worker 
216*7ab6e6acSAndroid Build Coastguard Worker     userdiff = ((rtemp.ru_utime.tv_sec * 1000000.0 + rtemp.ru_utime.tv_usec) -
217*7ab6e6acSAndroid Build Coastguard Worker                 (rlast.ru_utime.tv_sec * 1000000.0 + rlast.ru_utime.tv_usec));
218*7ab6e6acSAndroid Build Coastguard Worker     systemdiff = ((rtemp.ru_stime.tv_sec * 1000000.0 + rtemp.ru_stime.tv_usec) -
219*7ab6e6acSAndroid Build Coastguard Worker                   (rlast.ru_stime.tv_sec * 1000000.0 + rlast.ru_stime.tv_usec));
220*7ab6e6acSAndroid Build Coastguard Worker 
221*7ab6e6acSAndroid Build Coastguard Worker     pcpu[0] = (((ctemp - clast) * 1000000.0 / CLOCKS_PER_SEC) / timediff) * 100;
222*7ab6e6acSAndroid Build Coastguard Worker     pcpu[1] = (userdiff / timediff) * 100;
223*7ab6e6acSAndroid Build Coastguard Worker     pcpu[2] = (systemdiff / timediff) * 100;
224*7ab6e6acSAndroid Build Coastguard Worker }
225*7ab6e6acSAndroid Build Coastguard Worker 
226*7ab6e6acSAndroid Build Coastguard Worker const char *
get_system_info(void)227*7ab6e6acSAndroid Build Coastguard Worker get_system_info(void)
228*7ab6e6acSAndroid Build Coastguard Worker {
229*7ab6e6acSAndroid Build Coastguard Worker     static char buf[1024];
230*7ab6e6acSAndroid Build Coastguard Worker     struct utsname  uts;
231*7ab6e6acSAndroid Build Coastguard Worker 
232*7ab6e6acSAndroid Build Coastguard Worker     memset(buf, 0, 1024);
233*7ab6e6acSAndroid Build Coastguard Worker     uname(&uts);
234*7ab6e6acSAndroid Build Coastguard Worker 
235*7ab6e6acSAndroid Build Coastguard Worker     snprintf(buf, sizeof(buf), "%s %s %s %s %s", uts.sysname, uts.nodename,
236*7ab6e6acSAndroid Build Coastguard Worker 	     uts.release, uts.version, uts.machine);
237*7ab6e6acSAndroid Build Coastguard Worker 
238*7ab6e6acSAndroid Build Coastguard Worker     return buf;
239*7ab6e6acSAndroid Build Coastguard Worker }
240*7ab6e6acSAndroid Build Coastguard Worker 
241*7ab6e6acSAndroid Build Coastguard Worker 
242*7ab6e6acSAndroid Build Coastguard Worker const char *
get_optional_features(void)243*7ab6e6acSAndroid Build Coastguard Worker get_optional_features(void)
244*7ab6e6acSAndroid Build Coastguard Worker {
245*7ab6e6acSAndroid Build Coastguard Worker     static char features[1024];
246*7ab6e6acSAndroid Build Coastguard Worker     unsigned int numfeatures = 0;
247*7ab6e6acSAndroid Build Coastguard Worker 
248*7ab6e6acSAndroid Build Coastguard Worker     snprintf(features, sizeof(features), "Optional features available: ");
249*7ab6e6acSAndroid Build Coastguard Worker 
250*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_CPU_AFFINITY)
251*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
252*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
253*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
254*7ab6e6acSAndroid Build Coastguard Worker     }
255*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "CPU affinity setting",
256*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
257*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
258*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_CPU_AFFINITY */
259*7ab6e6acSAndroid Build Coastguard Worker 
260*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_FLOWLABEL)
261*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
262*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
263*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
264*7ab6e6acSAndroid Build Coastguard Worker     }
265*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "IPv6 flow label",
266*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
267*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
268*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_FLOWLABEL */
269*7ab6e6acSAndroid Build Coastguard Worker 
270*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SCTP_H)
271*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
272*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
273*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
274*7ab6e6acSAndroid Build Coastguard Worker     }
275*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "SCTP",
276*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
277*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
278*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SCTP_H */
279*7ab6e6acSAndroid Build Coastguard Worker 
280*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_TCP_CONGESTION)
281*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
282*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
283*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
284*7ab6e6acSAndroid Build Coastguard Worker     }
285*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "TCP congestion algorithm setting",
286*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
287*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
288*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_TCP_CONGESTION */
289*7ab6e6acSAndroid Build Coastguard Worker 
290*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SENDFILE)
291*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
292*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
293*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
294*7ab6e6acSAndroid Build Coastguard Worker     }
295*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "sendfile / zerocopy",
296*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
297*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
298*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SENDFILE */
299*7ab6e6acSAndroid Build Coastguard Worker 
300*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SO_MAX_PACING_RATE)
301*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
302*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
303*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
304*7ab6e6acSAndroid Build Coastguard Worker     }
305*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "socket pacing",
306*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
307*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
308*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SO_MAX_PACING_RATE */
309*7ab6e6acSAndroid Build Coastguard Worker 
310*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL)
311*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures > 0) {
312*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, ", ",
313*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
314*7ab6e6acSAndroid Build Coastguard Worker     }
315*7ab6e6acSAndroid Build Coastguard Worker     strncat(features, "authentication",
316*7ab6e6acSAndroid Build Coastguard Worker 	sizeof(features) - strlen(features) - 1);
317*7ab6e6acSAndroid Build Coastguard Worker     numfeatures++;
318*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_SSL */
319*7ab6e6acSAndroid Build Coastguard Worker 
320*7ab6e6acSAndroid Build Coastguard Worker     if (numfeatures == 0) {
321*7ab6e6acSAndroid Build Coastguard Worker 	strncat(features, "None",
322*7ab6e6acSAndroid Build Coastguard Worker 		sizeof(features) - strlen(features) - 1);
323*7ab6e6acSAndroid Build Coastguard Worker     }
324*7ab6e6acSAndroid Build Coastguard Worker 
325*7ab6e6acSAndroid Build Coastguard Worker     return features;
326*7ab6e6acSAndroid Build Coastguard Worker }
327*7ab6e6acSAndroid Build Coastguard Worker 
328*7ab6e6acSAndroid Build Coastguard Worker /* Helper routine for building cJSON objects in a printf-like manner.
329*7ab6e6acSAndroid Build Coastguard Worker **
330*7ab6e6acSAndroid Build Coastguard Worker ** Sample call:
331*7ab6e6acSAndroid Build Coastguard Worker **   j = iperf_json_printf("foo: %b  bar: %d  bletch: %f  eep: %s", b, i, f, s);
332*7ab6e6acSAndroid Build Coastguard Worker **
333*7ab6e6acSAndroid Build Coastguard Worker ** The four formatting characters and the types they expect are:
334*7ab6e6acSAndroid Build Coastguard Worker **   %b  boolean           int
335*7ab6e6acSAndroid Build Coastguard Worker **   %d  integer           int64_t
336*7ab6e6acSAndroid Build Coastguard Worker **   %f  floating point    double
337*7ab6e6acSAndroid Build Coastguard Worker **   %s  string            char *
338*7ab6e6acSAndroid Build Coastguard Worker ** If the values you're passing in are not these exact types, you must
339*7ab6e6acSAndroid Build Coastguard Worker ** cast them, there is no automatic type coercion/widening here.
340*7ab6e6acSAndroid Build Coastguard Worker **
341*7ab6e6acSAndroid Build Coastguard Worker ** The colons mark the end of field names, and blanks are ignored.
342*7ab6e6acSAndroid Build Coastguard Worker **
343*7ab6e6acSAndroid Build Coastguard Worker ** This routine is not particularly robust, but it's not part of the API,
344*7ab6e6acSAndroid Build Coastguard Worker ** it's just for internal iperf3 use.
345*7ab6e6acSAndroid Build Coastguard Worker */
346*7ab6e6acSAndroid Build Coastguard Worker cJSON*
iperf_json_printf(const char * format,...)347*7ab6e6acSAndroid Build Coastguard Worker iperf_json_printf(const char *format, ...)
348*7ab6e6acSAndroid Build Coastguard Worker {
349*7ab6e6acSAndroid Build Coastguard Worker     cJSON* o;
350*7ab6e6acSAndroid Build Coastguard Worker     va_list argp;
351*7ab6e6acSAndroid Build Coastguard Worker     const char *cp;
352*7ab6e6acSAndroid Build Coastguard Worker     char name[100];
353*7ab6e6acSAndroid Build Coastguard Worker     char* np;
354*7ab6e6acSAndroid Build Coastguard Worker     cJSON* j;
355*7ab6e6acSAndroid Build Coastguard Worker 
356*7ab6e6acSAndroid Build Coastguard Worker     o = cJSON_CreateObject();
357*7ab6e6acSAndroid Build Coastguard Worker     if (o == NULL)
358*7ab6e6acSAndroid Build Coastguard Worker         return NULL;
359*7ab6e6acSAndroid Build Coastguard Worker     va_start(argp, format);
360*7ab6e6acSAndroid Build Coastguard Worker     np = name;
361*7ab6e6acSAndroid Build Coastguard Worker     for (cp = format; *cp != '\0'; ++cp) {
362*7ab6e6acSAndroid Build Coastguard Worker 	switch (*cp) {
363*7ab6e6acSAndroid Build Coastguard Worker 	    case ' ':
364*7ab6e6acSAndroid Build Coastguard Worker 	    break;
365*7ab6e6acSAndroid Build Coastguard Worker 	    case ':':
366*7ab6e6acSAndroid Build Coastguard Worker 	    *np = '\0';
367*7ab6e6acSAndroid Build Coastguard Worker 	    break;
368*7ab6e6acSAndroid Build Coastguard Worker 	    case '%':
369*7ab6e6acSAndroid Build Coastguard Worker 	    ++cp;
370*7ab6e6acSAndroid Build Coastguard Worker 	    switch (*cp) {
371*7ab6e6acSAndroid Build Coastguard Worker 		case 'b':
372*7ab6e6acSAndroid Build Coastguard Worker 		j = cJSON_CreateBool(va_arg(argp, int));
373*7ab6e6acSAndroid Build Coastguard Worker 		break;
374*7ab6e6acSAndroid Build Coastguard Worker 		case 'd':
375*7ab6e6acSAndroid Build Coastguard Worker 		j = cJSON_CreateNumber(va_arg(argp, int64_t));
376*7ab6e6acSAndroid Build Coastguard Worker 		break;
377*7ab6e6acSAndroid Build Coastguard Worker 		case 'f':
378*7ab6e6acSAndroid Build Coastguard Worker 		j = cJSON_CreateNumber(va_arg(argp, double));
379*7ab6e6acSAndroid Build Coastguard Worker 		break;
380*7ab6e6acSAndroid Build Coastguard Worker 		case 's':
381*7ab6e6acSAndroid Build Coastguard Worker 		j = cJSON_CreateString(va_arg(argp, char *));
382*7ab6e6acSAndroid Build Coastguard Worker 		break;
383*7ab6e6acSAndroid Build Coastguard Worker 		default:
384*7ab6e6acSAndroid Build Coastguard Worker 		va_end(argp);
385*7ab6e6acSAndroid Build Coastguard Worker 		return NULL;
386*7ab6e6acSAndroid Build Coastguard Worker 	    }
387*7ab6e6acSAndroid Build Coastguard Worker 	    if (j == NULL) {
388*7ab6e6acSAndroid Build Coastguard Worker 	    	va_end(argp);
389*7ab6e6acSAndroid Build Coastguard Worker 	    	return NULL;
390*7ab6e6acSAndroid Build Coastguard Worker 	    }
391*7ab6e6acSAndroid Build Coastguard Worker 	    cJSON_AddItemToObject(o, name, j);
392*7ab6e6acSAndroid Build Coastguard Worker 	    np = name;
393*7ab6e6acSAndroid Build Coastguard Worker 	    break;
394*7ab6e6acSAndroid Build Coastguard Worker 	    default:
395*7ab6e6acSAndroid Build Coastguard Worker 	    *np++ = *cp;
396*7ab6e6acSAndroid Build Coastguard Worker 	    break;
397*7ab6e6acSAndroid Build Coastguard Worker 	}
398*7ab6e6acSAndroid Build Coastguard Worker     }
399*7ab6e6acSAndroid Build Coastguard Worker     va_end(argp);
400*7ab6e6acSAndroid Build Coastguard Worker     return o;
401*7ab6e6acSAndroid Build Coastguard Worker }
402*7ab6e6acSAndroid Build Coastguard Worker 
403*7ab6e6acSAndroid Build Coastguard Worker /* Debugging routine to dump out an fd_set. */
404*7ab6e6acSAndroid Build Coastguard Worker void
iperf_dump_fdset(FILE * fp,const char * str,int nfds,fd_set * fds)405*7ab6e6acSAndroid Build Coastguard Worker iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds)
406*7ab6e6acSAndroid Build Coastguard Worker {
407*7ab6e6acSAndroid Build Coastguard Worker     int fd;
408*7ab6e6acSAndroid Build Coastguard Worker     int comma;
409*7ab6e6acSAndroid Build Coastguard Worker 
410*7ab6e6acSAndroid Build Coastguard Worker     fprintf(fp, "%s: [", str);
411*7ab6e6acSAndroid Build Coastguard Worker     comma = 0;
412*7ab6e6acSAndroid Build Coastguard Worker     for (fd = 0; fd < nfds; ++fd) {
413*7ab6e6acSAndroid Build Coastguard Worker         if (FD_ISSET(fd, fds)) {
414*7ab6e6acSAndroid Build Coastguard Worker 	    if (comma)
415*7ab6e6acSAndroid Build Coastguard Worker 		fprintf(fp, ", ");
416*7ab6e6acSAndroid Build Coastguard Worker 	    fprintf(fp, "%d", fd);
417*7ab6e6acSAndroid Build Coastguard Worker 	    comma = 1;
418*7ab6e6acSAndroid Build Coastguard Worker 	}
419*7ab6e6acSAndroid Build Coastguard Worker     }
420*7ab6e6acSAndroid Build Coastguard Worker     fprintf(fp, "]\n");
421*7ab6e6acSAndroid Build Coastguard Worker }
422*7ab6e6acSAndroid Build Coastguard Worker 
423*7ab6e6acSAndroid Build Coastguard Worker /*
424*7ab6e6acSAndroid Build Coastguard Worker  * daemon(3) implementation for systems lacking one.
425*7ab6e6acSAndroid Build Coastguard Worker  * Cobbled together from various daemon(3) implementations,
426*7ab6e6acSAndroid Build Coastguard Worker  * not intended to be general-purpose. */
427*7ab6e6acSAndroid Build Coastguard Worker #ifndef HAVE_DAEMON
daemon(int nochdir,int noclose)428*7ab6e6acSAndroid Build Coastguard Worker int daemon(int nochdir, int noclose)
429*7ab6e6acSAndroid Build Coastguard Worker {
430*7ab6e6acSAndroid Build Coastguard Worker     pid_t pid = 0;
431*7ab6e6acSAndroid Build Coastguard Worker     pid_t sid = 0;
432*7ab6e6acSAndroid Build Coastguard Worker     int fd;
433*7ab6e6acSAndroid Build Coastguard Worker 
434*7ab6e6acSAndroid Build Coastguard Worker     /*
435*7ab6e6acSAndroid Build Coastguard Worker      * Ignore any possible SIGHUP when the parent process exits.
436*7ab6e6acSAndroid Build Coastguard Worker      * Note that the iperf3 server process will eventually install
437*7ab6e6acSAndroid Build Coastguard Worker      * its own signal handler for SIGHUP, so we can be a little
438*7ab6e6acSAndroid Build Coastguard Worker      * sloppy about not restoring the prior value.  This does not
439*7ab6e6acSAndroid Build Coastguard Worker      * generalize.
440*7ab6e6acSAndroid Build Coastguard Worker      */
441*7ab6e6acSAndroid Build Coastguard Worker     signal(SIGHUP, SIG_IGN);
442*7ab6e6acSAndroid Build Coastguard Worker 
443*7ab6e6acSAndroid Build Coastguard Worker     pid = fork();
444*7ab6e6acSAndroid Build Coastguard Worker     if (pid < 0) {
445*7ab6e6acSAndroid Build Coastguard Worker 	    return -1;
446*7ab6e6acSAndroid Build Coastguard Worker     }
447*7ab6e6acSAndroid Build Coastguard Worker     if (pid > 0) {
448*7ab6e6acSAndroid Build Coastguard Worker 	/* Use _exit() to avoid doing atexit() stuff. */
449*7ab6e6acSAndroid Build Coastguard Worker 	_exit(0);
450*7ab6e6acSAndroid Build Coastguard Worker     }
451*7ab6e6acSAndroid Build Coastguard Worker 
452*7ab6e6acSAndroid Build Coastguard Worker     sid = setsid();
453*7ab6e6acSAndroid Build Coastguard Worker     if (sid < 0) {
454*7ab6e6acSAndroid Build Coastguard Worker 	return -1;
455*7ab6e6acSAndroid Build Coastguard Worker     }
456*7ab6e6acSAndroid Build Coastguard Worker 
457*7ab6e6acSAndroid Build Coastguard Worker     /*
458*7ab6e6acSAndroid Build Coastguard Worker      * Fork again to avoid becoming a session leader.
459*7ab6e6acSAndroid Build Coastguard Worker      * This might only matter on old SVr4-derived OSs.
460*7ab6e6acSAndroid Build Coastguard Worker      * Note in particular that glibc and FreeBSD libc
461*7ab6e6acSAndroid Build Coastguard Worker      * only fork once.
462*7ab6e6acSAndroid Build Coastguard Worker      */
463*7ab6e6acSAndroid Build Coastguard Worker     pid = fork();
464*7ab6e6acSAndroid Build Coastguard Worker     if (pid == -1) {
465*7ab6e6acSAndroid Build Coastguard Worker 	return -1;
466*7ab6e6acSAndroid Build Coastguard Worker     } else if (pid != 0) {
467*7ab6e6acSAndroid Build Coastguard Worker 	_exit(0);
468*7ab6e6acSAndroid Build Coastguard Worker     }
469*7ab6e6acSAndroid Build Coastguard Worker 
470*7ab6e6acSAndroid Build Coastguard Worker     if (!nochdir) {
471*7ab6e6acSAndroid Build Coastguard Worker 	chdir("/");
472*7ab6e6acSAndroid Build Coastguard Worker     }
473*7ab6e6acSAndroid Build Coastguard Worker 
474*7ab6e6acSAndroid Build Coastguard Worker     if (!noclose && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
475*7ab6e6acSAndroid Build Coastguard Worker 	dup2(fd, STDIN_FILENO);
476*7ab6e6acSAndroid Build Coastguard Worker 	dup2(fd, STDOUT_FILENO);
477*7ab6e6acSAndroid Build Coastguard Worker 	dup2(fd, STDERR_FILENO);
478*7ab6e6acSAndroid Build Coastguard Worker 	if (fd > 2) {
479*7ab6e6acSAndroid Build Coastguard Worker 	    close(fd);
480*7ab6e6acSAndroid Build Coastguard Worker 	}
481*7ab6e6acSAndroid Build Coastguard Worker     }
482*7ab6e6acSAndroid Build Coastguard Worker     return (0);
483*7ab6e6acSAndroid Build Coastguard Worker }
484*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_DAEMON */
485*7ab6e6acSAndroid Build Coastguard Worker 
486*7ab6e6acSAndroid Build Coastguard Worker /* Compatibility version of getline(3) for systems that don't have it.. */
487*7ab6e6acSAndroid Build Coastguard Worker #ifndef HAVE_GETLINE
488*7ab6e6acSAndroid Build Coastguard Worker /* The following code adopted from NetBSD's getline.c, which is: */
489*7ab6e6acSAndroid Build Coastguard Worker 
490*7ab6e6acSAndroid Build Coastguard Worker /*-
491*7ab6e6acSAndroid Build Coastguard Worker  * Copyright (c) 2011 The NetBSD Foundation, Inc.
492*7ab6e6acSAndroid Build Coastguard Worker  * All rights reserved.
493*7ab6e6acSAndroid Build Coastguard Worker  *
494*7ab6e6acSAndroid Build Coastguard Worker  * This code is derived from software contributed to The NetBSD Foundation
495*7ab6e6acSAndroid Build Coastguard Worker  * by Christos Zoulas.
496*7ab6e6acSAndroid Build Coastguard Worker  *
497*7ab6e6acSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
498*7ab6e6acSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
499*7ab6e6acSAndroid Build Coastguard Worker  * are met:
500*7ab6e6acSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
501*7ab6e6acSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
502*7ab6e6acSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
503*7ab6e6acSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
504*7ab6e6acSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
505*7ab6e6acSAndroid Build Coastguard Worker  *
506*7ab6e6acSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
507*7ab6e6acSAndroid Build Coastguard Worker  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
508*7ab6e6acSAndroid Build Coastguard Worker  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
509*7ab6e6acSAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
510*7ab6e6acSAndroid Build Coastguard Worker  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
511*7ab6e6acSAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
512*7ab6e6acSAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
513*7ab6e6acSAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
514*7ab6e6acSAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
515*7ab6e6acSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
516*7ab6e6acSAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
517*7ab6e6acSAndroid Build Coastguard Worker  */
518*7ab6e6acSAndroid Build Coastguard Worker ssize_t
getdelim(char ** buf,size_t * bufsiz,int delimiter,FILE * fp)519*7ab6e6acSAndroid Build Coastguard Worker getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
520*7ab6e6acSAndroid Build Coastguard Worker {
521*7ab6e6acSAndroid Build Coastguard Worker 	char *ptr, *eptr;
522*7ab6e6acSAndroid Build Coastguard Worker 
523*7ab6e6acSAndroid Build Coastguard Worker 
524*7ab6e6acSAndroid Build Coastguard Worker 	if (*buf == NULL || *bufsiz == 0) {
525*7ab6e6acSAndroid Build Coastguard Worker 		*bufsiz = BUFSIZ;
526*7ab6e6acSAndroid Build Coastguard Worker 		if ((*buf = malloc(*bufsiz)) == NULL)
527*7ab6e6acSAndroid Build Coastguard Worker 			return -1;
528*7ab6e6acSAndroid Build Coastguard Worker 	}
529*7ab6e6acSAndroid Build Coastguard Worker 
530*7ab6e6acSAndroid Build Coastguard Worker 	for (ptr = *buf, eptr = *buf + *bufsiz;;) {
531*7ab6e6acSAndroid Build Coastguard Worker 		int c = fgetc(fp);
532*7ab6e6acSAndroid Build Coastguard Worker 		if (c == -1) {
533*7ab6e6acSAndroid Build Coastguard Worker 			if (feof(fp)) {
534*7ab6e6acSAndroid Build Coastguard Worker 				ssize_t diff = (ssize_t)(ptr - *buf);
535*7ab6e6acSAndroid Build Coastguard Worker 				if (diff != 0) {
536*7ab6e6acSAndroid Build Coastguard Worker 					*ptr = '\0';
537*7ab6e6acSAndroid Build Coastguard Worker 					return diff;
538*7ab6e6acSAndroid Build Coastguard Worker 				}
539*7ab6e6acSAndroid Build Coastguard Worker 			}
540*7ab6e6acSAndroid Build Coastguard Worker 			return -1;
541*7ab6e6acSAndroid Build Coastguard Worker 		}
542*7ab6e6acSAndroid Build Coastguard Worker 		*ptr++ = c;
543*7ab6e6acSAndroid Build Coastguard Worker 		if (c == delimiter) {
544*7ab6e6acSAndroid Build Coastguard Worker 			*ptr = '\0';
545*7ab6e6acSAndroid Build Coastguard Worker 			return ptr - *buf;
546*7ab6e6acSAndroid Build Coastguard Worker 		}
547*7ab6e6acSAndroid Build Coastguard Worker 		if (ptr + 2 >= eptr) {
548*7ab6e6acSAndroid Build Coastguard Worker 			char *nbuf;
549*7ab6e6acSAndroid Build Coastguard Worker 			size_t nbufsiz = *bufsiz * 2;
550*7ab6e6acSAndroid Build Coastguard Worker 			ssize_t d = ptr - *buf;
551*7ab6e6acSAndroid Build Coastguard Worker 			if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
552*7ab6e6acSAndroid Build Coastguard Worker 				return -1;
553*7ab6e6acSAndroid Build Coastguard Worker 			*buf = nbuf;
554*7ab6e6acSAndroid Build Coastguard Worker 			*bufsiz = nbufsiz;
555*7ab6e6acSAndroid Build Coastguard Worker 			eptr = nbuf + nbufsiz;
556*7ab6e6acSAndroid Build Coastguard Worker 			ptr = nbuf + d;
557*7ab6e6acSAndroid Build Coastguard Worker 		}
558*7ab6e6acSAndroid Build Coastguard Worker 	}
559*7ab6e6acSAndroid Build Coastguard Worker }
560*7ab6e6acSAndroid Build Coastguard Worker 
561*7ab6e6acSAndroid Build Coastguard Worker ssize_t
getline(char ** buf,size_t * bufsiz,FILE * fp)562*7ab6e6acSAndroid Build Coastguard Worker getline(char **buf, size_t *bufsiz, FILE *fp)
563*7ab6e6acSAndroid Build Coastguard Worker {
564*7ab6e6acSAndroid Build Coastguard Worker 	return getdelim(buf, bufsiz, '\n', fp);
565*7ab6e6acSAndroid Build Coastguard Worker }
566*7ab6e6acSAndroid Build Coastguard Worker 
567*7ab6e6acSAndroid Build Coastguard Worker #endif
568