xref: /iperf/src/iperf_error.c (revision 7bdd5b0e)
17d375156SJon Dugan /*
2de006004SBruce A. Mah  * iperf, Copyright (c) 2014-2022, The Regents of the University of
3da9f046fSBruce A. Mah  * California, through Lawrence Berkeley National Laboratory (subject
4da9f046fSBruce A. Mah  * to receipt of any required approvals from the U.S. Dept. of
5da9f046fSBruce A. Mah  * Energy).  All rights reserved.
67d375156SJon Dugan  *
7da9f046fSBruce A. Mah  * If you have questions about your rights to use or distribute this
8da9f046fSBruce A. Mah  * software, please contact Berkeley Lab's Technology Transfer
9da9f046fSBruce A. Mah  * Department at [email protected].
10da9f046fSBruce A. Mah  *
11da9f046fSBruce A. Mah  * NOTICE.  This software is owned by the U.S. Department of Energy.
12da9f046fSBruce A. Mah  * As such, the U.S. Government has been granted for itself and others
13da9f046fSBruce A. Mah  * acting on its behalf a paid-up, nonexclusive, irrevocable,
14da9f046fSBruce A. Mah  * worldwide license in the Software to reproduce, prepare derivative
15da9f046fSBruce A. Mah  * works, and perform publicly and display publicly.  Beginning five
16da9f046fSBruce A. Mah  * (5) years after the date permission to assert copyright is obtained
17da9f046fSBruce A. Mah  * from the U.S. Department of Energy, and subject to any subsequent
18da9f046fSBruce A. Mah  * five (5) year renewals, the U.S. Government is granted for itself
19da9f046fSBruce A. Mah  * and others acting on its behalf a paid-up, nonexclusive,
20da9f046fSBruce A. Mah  * irrevocable, worldwide license in the Software to reproduce,
21da9f046fSBruce A. Mah  * prepare derivative works, distribute copies to the public, perform
22da9f046fSBruce A. Mah  * publicly and display publicly, and to permit others to do so.
23da9f046fSBruce A. Mah  *
24da9f046fSBruce A. Mah  * This code is distributed under a BSD style license, see the LICENSE
25da9f046fSBruce A. Mah  * file for complete information.
267d375156SJon Dugan  */
278430ad49Ssethdelliott #include <stdio.h>
2801ca972bSsethdelliott #include <errno.h>
2901ca972bSsethdelliott #include <netdb.h>
303118b420Ssethdelliott #include <string.h>
31b5e0751fSJef Poskanzer #include <stdlib.h>
32b5e0751fSJef Poskanzer #include <stdarg.h>
338430ad49Ssethdelliott #include "iperf.h"
3498ce496bSjef #include "iperf_api.h"
358430ad49Ssethdelliott 
3638bac802SBruce A. Mah int gerror;
3738bac802SBruce A. Mah 
381a908ce1SBruce A. Mah char iperf_timestrerr[100];
391a908ce1SBruce A. Mah 
40b5e0751fSJef Poskanzer /* Do a printf to stderr. */
41b5e0751fSJef Poskanzer void
iperf_err(struct iperf_test * test,const char * format,...)42b5e0751fSJef Poskanzer iperf_err(struct iperf_test *test, const char *format, ...)
43b5e0751fSJef Poskanzer {
44b5e0751fSJef Poskanzer     va_list argp;
45eb0206e6SJef Poskanzer     char str[1000];
461a908ce1SBruce A. Mah     time_t now;
471a908ce1SBruce A. Mah     struct tm *ltm = NULL;
481a908ce1SBruce A. Mah     char *ct = NULL;
491a908ce1SBruce A. Mah 
501a908ce1SBruce A. Mah     /* Timestamp if requested */
511a908ce1SBruce A. Mah     if (test != NULL && test->timestamps) {
521a908ce1SBruce A. Mah 	time(&now);
531a908ce1SBruce A. Mah 	ltm = localtime(&now);
541a908ce1SBruce A. Mah 	strftime(iperf_timestrerr, sizeof(iperf_timestrerr), test->timestamp_format, ltm);
551a908ce1SBruce A. Mah 	ct = iperf_timestrerr;
561a908ce1SBruce A. Mah     }
57b5e0751fSJef Poskanzer 
58b5e0751fSJef Poskanzer     va_start(argp, format);
59f19a68d5SJef Poskanzer     vsnprintf(str, sizeof(str), format, argp);
60eb0206e6SJef Poskanzer     if (test != NULL && test->json_output && test->json_top != NULL)
61eb0206e6SJef Poskanzer 	cJSON_AddStringToObject(test->json_top, "error", str);
6224753fd7Sswlars     else {
63bd85edb8SBruce A. Mah 	if (test && test->outfile && test->outfile != stdout) {
641a908ce1SBruce A. Mah 	    if (ct) {
651a908ce1SBruce A. Mah 		fprintf(test->outfile, "%s", ct);
661a908ce1SBruce A. Mah 	    }
67aeb6938dSBruce A. Mah 	    fprintf(test->outfile, "iperf3: %s\n", str);
68aeb6938dSBruce A. Mah 	}
69aeb6938dSBruce A. Mah 	else {
701a908ce1SBruce A. Mah 	    if (ct) {
711a908ce1SBruce A. Mah 		fprintf(stderr, "%s", ct);
721a908ce1SBruce A. Mah 	    }
73eb0206e6SJef Poskanzer 	    fprintf(stderr, "iperf3: %s\n", str);
74aeb6938dSBruce A. Mah 	}
7524753fd7Sswlars     }
76b5e0751fSJef Poskanzer     va_end(argp);
77b5e0751fSJef Poskanzer }
78b5e0751fSJef Poskanzer 
79aeb6938dSBruce A. Mah /* Do a printf to stderr or log file as appropriate, then exit. */
80b5e0751fSJef Poskanzer void
iperf_errexit(struct iperf_test * test,const char * format,...)81b5e0751fSJef Poskanzer iperf_errexit(struct iperf_test *test, const char *format, ...)
82b5e0751fSJef Poskanzer {
83b5e0751fSJef Poskanzer     va_list argp;
84eb0206e6SJef Poskanzer     char str[1000];
851a908ce1SBruce A. Mah     time_t now;
861a908ce1SBruce A. Mah     struct tm *ltm = NULL;
871a908ce1SBruce A. Mah     char *ct = NULL;
881a908ce1SBruce A. Mah 
891a908ce1SBruce A. Mah     /* Timestamp if requested */
901a908ce1SBruce A. Mah     if (test != NULL && test->timestamps) {
911a908ce1SBruce A. Mah 	time(&now);
921a908ce1SBruce A. Mah 	ltm = localtime(&now);
931a908ce1SBruce A. Mah 	strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%c ", ltm);
941a908ce1SBruce A. Mah 	ct = iperf_timestrerr;
951a908ce1SBruce A. Mah     }
96b5e0751fSJef Poskanzer 
97b5e0751fSJef Poskanzer     va_start(argp, format);
98f19a68d5SJef Poskanzer     vsnprintf(str, sizeof(str), format, argp);
99eb0206e6SJef Poskanzer     if (test != NULL && test->json_output && test->json_top != NULL) {
100eb0206e6SJef Poskanzer 	cJSON_AddStringToObject(test->json_top, "error", str);
101eb0206e6SJef Poskanzer 	iperf_json_finish(test);
102eb0206e6SJef Poskanzer     } else
103bd85edb8SBruce A. Mah 	if (test && test->outfile && test->outfile != stdout) {
1041a908ce1SBruce A. Mah 	    if (ct) {
1051a908ce1SBruce A. Mah 		fprintf(test->outfile, "%s", ct);
1061a908ce1SBruce A. Mah 	    }
107aeb6938dSBruce A. Mah 	    fprintf(test->outfile, "iperf3: %s\n", str);
108aeb6938dSBruce A. Mah 	}
109aeb6938dSBruce A. Mah 	else {
1101a908ce1SBruce A. Mah 	    if (ct) {
1111a908ce1SBruce A. Mah 		fprintf(stderr, "%s", ct);
1121a908ce1SBruce A. Mah 	    }
113eb0206e6SJef Poskanzer 	    fprintf(stderr, "iperf3: %s\n", str);
114aeb6938dSBruce A. Mah 	}
115b5e0751fSJef Poskanzer     va_end(argp);
1168fcfc247Sg-coder     if (test)
117441d8b75SBruce A. Mah         iperf_delete_pidfile(test);
118b5e0751fSJef Poskanzer     exit(1);
119b5e0751fSJef Poskanzer }
120b5e0751fSJef Poskanzer 
12101ca972bSsethdelliott int i_errno;
1228430ad49Ssethdelliott 
123b60a49ddSsethdelliott char *
iperf_strerror(int int_errno)1245ab2132cSGabriel Ganne iperf_strerror(int int_errno)
125b60a49ddSsethdelliott {
126b60a49ddSsethdelliott     static char errstr[256];
127ffdcc7d4Ssethdelliott     int len, perr, herr;
128ffdcc7d4Ssethdelliott     perr = herr = 0;
129b60a49ddSsethdelliott 
130b60a49ddSsethdelliott     len = sizeof(errstr);
131b60a49ddSsethdelliott     memset(errstr, 0, len);
132b60a49ddSsethdelliott 
1335ab2132cSGabriel Ganne     switch (int_errno) {
134b60a49ddSsethdelliott         case IENONE:
135b5e0751fSJef Poskanzer             snprintf(errstr, len, "no error");
136b60a49ddSsethdelliott             break;
137b60a49ddSsethdelliott         case IESERVCLIENT:
138b5e0751fSJef Poskanzer             snprintf(errstr, len, "cannot be both server and client");
139b60a49ddSsethdelliott             break;
140b60a49ddSsethdelliott         case IENOROLE:
141b5e0751fSJef Poskanzer             snprintf(errstr, len, "must either be a client (-c) or server (-s)");
142b60a49ddSsethdelliott             break;
143987b4323SJef Poskanzer         case IESERVERONLY:
144987b4323SJef Poskanzer             snprintf(errstr, len, "some option you are trying to set is server only");
145987b4323SJef Poskanzer             break;
146b60a49ddSsethdelliott         case IECLIENTONLY:
147b5e0751fSJef Poskanzer             snprintf(errstr, len, "some option you are trying to set is client only");
148b60a49ddSsethdelliott             break;
149b60a49ddSsethdelliott         case IEDURATION:
150b5e0751fSJef Poskanzer             snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
151b60a49ddSsethdelliott             break;
152b60a49ddSsethdelliott         case IENUMSTREAMS:
153b5e0751fSJef Poskanzer             snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
154b60a49ddSsethdelliott             break;
155b60a49ddSsethdelliott         case IEBLOCKSIZE:
156b5e0751fSJef Poskanzer             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
157b60a49ddSsethdelliott             break;
158b60a49ddSsethdelliott         case IEBUFSIZE:
159b5e0751fSJef Poskanzer             snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
160b60a49ddSsethdelliott             break;
161b60a49ddSsethdelliott         case IEINTERVAL:
16256536642SJef Poskanzer             snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
163b60a49ddSsethdelliott             break;
164e7aa59b6SBruce A. Mah     case IEBIND: /* UNUSED */
165b7b1b32aSKevin Constantine             snprintf(errstr, len, "--bind must be specified to use --cport");
166b7b1b32aSKevin Constantine             break;
16796d0c77cSBruce A. Mah         case IEUDPBLOCKSIZE:
16803224c9fSBruce A. Mah             snprintf(errstr, len, "block size invalid (minimum = %d bytes, maximum = %d bytes)", MIN_UDP_BLOCKSIZE, MAX_UDP_BLOCKSIZE);
16996d0c77cSBruce A. Mah             break;
170956d1158SBruce A. Mah         case IEBADTOS:
171956d1158SBruce A. Mah             snprintf(errstr, len, "bad TOS value (must be between 0 and 255 inclusive)");
172956d1158SBruce A. Mah             break;
173a51045deSralcini         case IESETCLIENTAUTH:
17406e3f08dSBruce A. Mah              snprintf(errstr, len, "you must specify a username, password, and path to a valid RSA public key");
175a51045deSralcini             break;
176a51045deSralcini         case IESETSERVERAUTH:
17706e3f08dSBruce A. Mah              snprintf(errstr, len, "you must specify a path to a valid RSA private key and a user credential file");
178a51045deSralcini             break;
17937d913dfSBruce A. Mah 	case IEBADFORMAT:
18037d913dfSBruce A. Mah 	    snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])");
18137d913dfSBruce A. Mah 	    break;
1826c783462SBruce A. Mah 	case IEBADPORT:
1836c783462SBruce A. Mah 	    snprintf(errstr, len, "port number must be between 1 and 65535 inclusive");
1846c783462SBruce A. Mah 	    break;
185b60a49ddSsethdelliott         case IEMSS:
186b60a49ddSsethdelliott             snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
187b60a49ddSsethdelliott             break;
188987b4323SJef Poskanzer         case IENOSENDFILE:
189987b4323SJef Poskanzer             snprintf(errstr, len, "this OS does not support sendfile");
190987b4323SJef Poskanzer             break;
19157892604SJef Poskanzer         case IEOMIT:
19257892604SJef Poskanzer             snprintf(errstr, len, "bogus value for --omit");
193c9693599SJef Poskanzer             break;
194c687db9dSJef Poskanzer         case IEUNIMP:
195c687db9dSJef Poskanzer             snprintf(errstr, len, "an option you are trying to set is not implemented yet");
196c687db9dSJef Poskanzer             break;
197e32a7bcdSJef Poskanzer         case IEFILE:
198e32a7bcdSJef Poskanzer             snprintf(errstr, len, "unable to open -F file");
199e32a7bcdSJef Poskanzer             perr = 1;
200e32a7bcdSJef Poskanzer             break;
201bdf5335cSJef Poskanzer         case IEBURST:
202bdf5335cSJef Poskanzer             snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
203bdf5335cSJef Poskanzer             break;
204f11d3fa3SJef Poskanzer         case IEENDCONDITIONS:
205f11d3fa3SJef Poskanzer             snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
206f11d3fa3SJef Poskanzer             break;
207aeb6938dSBruce A. Mah 	case IELOGFILE:
208aeb6938dSBruce A. Mah 	    snprintf(errstr, len, "unable to open log file");
209aeb6938dSBruce A. Mah 	    perr = 1;
210aeb6938dSBruce A. Mah 	    break;
211cd81de3cSBruce A. Mah 	case IENOSCTP:
212cd81de3cSBruce A. Mah 	    snprintf(errstr, len, "no SCTP support available");
213cd81de3cSBruce A. Mah 	    break;
214b60a49ddSsethdelliott         case IENEWTEST:
215b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to create a new test");
216ffdcc7d4Ssethdelliott             perr = 1;
217b60a49ddSsethdelliott             break;
218b60a49ddSsethdelliott         case IEINITTEST:
219b5e0751fSJef Poskanzer             snprintf(errstr, len, "test initialization failed");
220ffdcc7d4Ssethdelliott             perr = 1;
221b60a49ddSsethdelliott             break;
222a51045deSralcini         case IEAUTHTEST:
223a51045deSralcini             snprintf(errstr, len, "test authorization failed");
224a51045deSralcini             break;
225b60a49ddSsethdelliott         case IELISTEN:
226b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to start listener for connections");
22738bac802SBruce A. Mah 	    herr = 1;
228ffdcc7d4Ssethdelliott             perr = 1;
229b60a49ddSsethdelliott             break;
230b60a49ddSsethdelliott         case IECONNECT:
231b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to connect to server");
232ffdcc7d4Ssethdelliott             perr = 1;
23338bac802SBruce A. Mah 	    herr = 1;
234b60a49ddSsethdelliott             break;
235b60a49ddSsethdelliott         case IEACCEPT:
236b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to accept connection from client");
237ffdcc7d4Ssethdelliott             herr = 1;
238ffdcc7d4Ssethdelliott             perr = 1;
239b60a49ddSsethdelliott             break;
240b60a49ddSsethdelliott         case IESENDCOOKIE:
241b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to send cookie to server");
242ffdcc7d4Ssethdelliott             perr = 1;
243b60a49ddSsethdelliott             break;
244b60a49ddSsethdelliott         case IERECVCOOKIE:
2458115b2a2SJef Poskanzer             snprintf(errstr, len, "unable to receive cookie at server");
246ffdcc7d4Ssethdelliott             perr = 1;
247b60a49ddSsethdelliott             break;
248b60a49ddSsethdelliott         case IECTRLWRITE:
249b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to write to the control socket");
250ffdcc7d4Ssethdelliott             perr = 1;
251b60a49ddSsethdelliott             break;
252b60a49ddSsethdelliott         case IECTRLREAD:
253b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to read from the control socket");
254ffdcc7d4Ssethdelliott             perr = 1;
255b60a49ddSsethdelliott             break;
256b60a49ddSsethdelliott         case IECTRLCLOSE:
257b5e0751fSJef Poskanzer             snprintf(errstr, len, "control socket has closed unexpectedly");
258b60a49ddSsethdelliott             break;
259b60a49ddSsethdelliott         case IEMESSAGE:
260b5e0751fSJef Poskanzer             snprintf(errstr, len, "received an unknown control message");
261b60a49ddSsethdelliott             break;
262b60a49ddSsethdelliott         case IESENDMESSAGE:
263b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to send control message");
264ffdcc7d4Ssethdelliott             perr = 1;
265b60a49ddSsethdelliott             break;
266b60a49ddSsethdelliott         case IERECVMESSAGE:
267b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to receive control message");
268ffdcc7d4Ssethdelliott             perr = 1;
269b60a49ddSsethdelliott             break;
270b60a49ddSsethdelliott         case IESENDPARAMS:
271b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to send parameters to server");
272ffdcc7d4Ssethdelliott             perr = 1;
273b60a49ddSsethdelliott             break;
274b60a49ddSsethdelliott         case IERECVPARAMS:
275b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to receive parameters from client");
276ffdcc7d4Ssethdelliott             perr = 1;
277b60a49ddSsethdelliott             break;
278b60a49ddSsethdelliott         case IEPACKAGERESULTS:
279b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to package results");
280ffdcc7d4Ssethdelliott             perr = 1;
281b60a49ddSsethdelliott             break;
282b60a49ddSsethdelliott         case IESENDRESULTS:
283b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to send results");
284ffdcc7d4Ssethdelliott             perr = 1;
285b60a49ddSsethdelliott             break;
286b60a49ddSsethdelliott         case IERECVRESULTS:
287b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to receive results");
288ffdcc7d4Ssethdelliott             perr = 1;
289b60a49ddSsethdelliott             break;
290b60a49ddSsethdelliott         case IESELECT:
291b5e0751fSJef Poskanzer             snprintf(errstr, len, "select failed");
292ffdcc7d4Ssethdelliott             perr = 1;
293ffdcc7d4Ssethdelliott             break;
294ffdcc7d4Ssethdelliott         case IECLIENTTERM:
295b5e0751fSJef Poskanzer             snprintf(errstr, len, "the client has terminated");
296b60a49ddSsethdelliott             break;
297b60a49ddSsethdelliott         case IESERVERTERM:
298b5e0751fSJef Poskanzer             snprintf(errstr, len, "the server has terminated");
299b60a49ddSsethdelliott             break;
300b60a49ddSsethdelliott         case IEACCESSDENIED:
301b5e0751fSJef Poskanzer             snprintf(errstr, len, "the server is busy running a test. try again later");
302b60a49ddSsethdelliott             break;
303b60a49ddSsethdelliott         case IESETNODELAY:
304e1420625SBruce A. Mah             snprintf(errstr, len, "unable to set TCP/SCTP NODELAY");
305ffdcc7d4Ssethdelliott             perr = 1;
306b60a49ddSsethdelliott             break;
307b60a49ddSsethdelliott         case IESETMSS:
308e1420625SBruce A. Mah             snprintf(errstr, len, "unable to set TCP/SCTP MSS");
309ffdcc7d4Ssethdelliott             perr = 1;
310b60a49ddSsethdelliott             break;
3110bd8d9daSsethdelliott         case IESETBUF:
312b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to set socket buffer size");
3130bd8d9daSsethdelliott             perr = 1;
3140bd8d9daSsethdelliott             break;
3159a599d5fSsethdelliott         case IESETTOS:
316b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to set IP TOS");
3179a599d5fSsethdelliott             perr = 1;
3189a599d5fSsethdelliott             break;
3199a599d5fSsethdelliott         case IESETCOS:
320b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to set IPv6 traffic class");
3219a599d5fSsethdelliott             perr = 1;
3229a599d5fSsethdelliott             break;
323c687db9dSJef Poskanzer         case IESETFLOW:
324c687db9dSJef Poskanzer             snprintf(errstr, len, "unable to set IPv6 flow label");
325c687db9dSJef Poskanzer             break;
326b60a49ddSsethdelliott         case IEREUSEADDR:
327b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to reuse address on socket");
328ffdcc7d4Ssethdelliott             perr = 1;
329b60a49ddSsethdelliott             break;
330b60a49ddSsethdelliott         case IENONBLOCKING:
331b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to set socket to non-blocking");
332ffdcc7d4Ssethdelliott             perr = 1;
333b60a49ddSsethdelliott             break;
334b60a49ddSsethdelliott         case IESETWINDOWSIZE:
335b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to set socket window size");
336ffdcc7d4Ssethdelliott             perr = 1;
337b60a49ddSsethdelliott             break;
33866ce7ad4Ssethdelliott         case IEPROTOCOL:
339b5e0751fSJef Poskanzer             snprintf(errstr, len, "protocol does not exist");
34066ce7ad4Ssethdelliott             break;
3418a7e01ebSJef Poskanzer         case IEAFFINITY:
3428a7e01ebSJef Poskanzer             snprintf(errstr, len, "unable to set CPU affinity");
3438a7e01ebSJef Poskanzer             perr = 1;
3448a7e01ebSJef Poskanzer             break;
3458ffe72e2SDavid Bar-On         case IERCVTIMEOUT:
3468ffe72e2SDavid Bar-On             snprintf(errstr, len, "receive timeout value is incorrect or not in range");
3478ffe72e2SDavid Bar-On             perr = 1;
3488ffe72e2SDavid Bar-On             break;
349*7bdd5b0eSDavid Bar-On         case IESNDTIMEOUT:
350*7bdd5b0eSDavid Bar-On             snprintf(errstr, len, "send timeout value is incorrect or not in range");
351*7bdd5b0eSDavid Bar-On             perr = 1;
352*7bdd5b0eSDavid Bar-On             break;
3538ffe72e2SDavid Bar-On         case IERVRSONLYRCVTIMEOUT:
3548ffe72e2SDavid Bar-On             snprintf(errstr, len, "client receive timeout is valid only in receiving mode");
3558ffe72e2SDavid Bar-On             perr = 1;
3568ffe72e2SDavid Bar-On             break;
357fe4a13abSBruce A. Mah 	case IEDAEMON:
358fe4a13abSBruce A. Mah 	    snprintf(errstr, len, "unable to become a daemon");
359fe4a13abSBruce A. Mah 	    perr = 1;
360fe4a13abSBruce A. Mah 	    break;
361b60a49ddSsethdelliott         case IECREATESTREAM:
362b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to create a new stream");
363ffdcc7d4Ssethdelliott             herr = 1;
364ffdcc7d4Ssethdelliott             perr = 1;
365b60a49ddSsethdelliott             break;
366b60a49ddSsethdelliott         case IEINITSTREAM:
367b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to initialize stream");
368ffdcc7d4Ssethdelliott             herr = 1;
369ffdcc7d4Ssethdelliott             perr = 1;
370b60a49ddSsethdelliott             break;
3718a0b5a5dSsethdelliott         case IESTREAMLISTEN:
372b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to start stream listener");
37338bac802SBruce A. Mah 	    herr = 1;
374ffdcc7d4Ssethdelliott             perr = 1;
3758a0b5a5dSsethdelliott             break;
376b60a49ddSsethdelliott         case IESTREAMCONNECT:
377b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to connect stream");
378ffdcc7d4Ssethdelliott             herr = 1;
379ffdcc7d4Ssethdelliott             perr = 1;
380b60a49ddSsethdelliott             break;
381b60a49ddSsethdelliott         case IESTREAMACCEPT:
382b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to accept stream connection");
383ffdcc7d4Ssethdelliott             perr = 1;
384b60a49ddSsethdelliott             break;
385b60a49ddSsethdelliott         case IESTREAMWRITE:
386b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to write to stream socket");
387ffdcc7d4Ssethdelliott             perr = 1;
388b60a49ddSsethdelliott             break;
389b60a49ddSsethdelliott         case IESTREAMREAD:
390b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to read from stream socket");
391ffdcc7d4Ssethdelliott             perr = 1;
392b60a49ddSsethdelliott             break;
393b60a49ddSsethdelliott         case IESTREAMCLOSE:
394b5e0751fSJef Poskanzer             snprintf(errstr, len, "stream socket has closed unexpectedly");
395b60a49ddSsethdelliott             break;
396b60a49ddSsethdelliott         case IESTREAMID:
397b5e0751fSJef Poskanzer             snprintf(errstr, len, "stream has an invalid id");
398b60a49ddSsethdelliott             break;
399b60a49ddSsethdelliott         case IENEWTIMER:
400b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to create new timer");
401ffdcc7d4Ssethdelliott             perr = 1;
402b60a49ddSsethdelliott             break;
403b60a49ddSsethdelliott         case IEUPDATETIMER:
404b5e0751fSJef Poskanzer             snprintf(errstr, len, "unable to update timer");
405ffdcc7d4Ssethdelliott             perr = 1;
406b60a49ddSsethdelliott             break;
40762bfa88cSJef Poskanzer         case IESETCONGESTION:
40848e66b9bSBruce A. Mah             snprintf(errstr, len, "unable to set TCP_CONGESTION: "
40948e66b9bSBruce A. Mah                                   "Supplied congestion control algorithm not supported on this host");
41062bfa88cSJef Poskanzer             break;
411441d8b75SBruce A. Mah 	case IEPIDFILE:
412441d8b75SBruce A. Mah             snprintf(errstr, len, "unable to write PID file");
413441d8b75SBruce A. Mah             perr = 1;
414441d8b75SBruce A. Mah             break;
4154addea85SBruce A. Mah 	case IEV6ONLY:
4164addea85SBruce A. Mah 	    snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
4174addea85SBruce A. Mah 	    perr = 1;
4184addea85SBruce A. Mah 	    break;
41960bd98a5SBruce A. Mah         case IESETSCTPDISABLEFRAG:
4201d85c269SBruce A. Mah             snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS");
42160bd98a5SBruce A. Mah             perr = 1;
42260bd98a5SBruce A. Mah             break;
423e1420625SBruce A. Mah         case IESETSCTPNSTREAM:
424e1420625SBruce A. Mah             snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n");
425e1420625SBruce A. Mah             perr = 1;
426e1420625SBruce A. Mah             break;
4279915746aSBruce A. Mah 	case IESETPACING:
4289915746aSBruce A. Mah 	    snprintf(errstr, len, "unable to set socket pacing");
4299915746aSBruce A. Mah 	    perr = 1;
4309915746aSBruce A. Mah 	    break;
431d2202ee3SBruce A. Mah 	case IESETBUF2:
432d2202ee3SBruce A. Mah 	    snprintf(errstr, len, "socket buffer size not set correctly");
433d2202ee3SBruce A. Mah 	    break;
4340778f04cSBoris Okunev 	case IEREVERSEBIDIR:
4350778f04cSBoris Okunev 	    snprintf(errstr, len, "cannot be both reverse and bidirectional");
4360778f04cSBoris Okunev             break;
437a0c6f0ecSDavid Bar-On 	case IETOTALRATE:
438a0c6f0ecSDavid Bar-On 	    snprintf(errstr, len, "total required bandwidth is larger than server limit");
439a0c6f0ecSDavid Bar-On             break;
440bd143779Sralcini     case IESKEWTHRESHOLD:
441bd143779Sralcini 	    snprintf(errstr, len, "skew threshold must be a positive number");
442bd143779Sralcini             break;
443be66b575SDavid Bar-On 	case IEIDLETIMEOUT:
44450d6cce6Sa1346054 	    snprintf(errstr, len, "idle timeout parameter is not positive or larger than allowed limit");
445be66b575SDavid Bar-On             break;
446f54b6b4bSDavid Bar-On 	case IEBINDDEV:
447f54b6b4bSDavid Bar-On 	    snprintf(errstr, len, "Unable to bind-to-device (check perror, maybe permissions?)");
448f54b6b4bSDavid Bar-On             break;
449f54b6b4bSDavid Bar-On     case IEBINDDEVNOSUPPORT:
450f54b6b4bSDavid Bar-On 	    snprintf(errstr, len, "`<ip>%%<dev>` is not supported as system does not support bind to device");
451f54b6b4bSDavid Bar-On             break;
452f54b6b4bSDavid Bar-On     case IEHOSTDEV:
453f54b6b4bSDavid Bar-On 	    snprintf(errstr, len, "host device name (ip%%<dev>) is supported (and required) only for IPv6 link-local address");
454f54b6b4bSDavid Bar-On             break;
455be66b575SDavid Bar-On 	case IENOMSG:
456de006004SBruce A. Mah 	    snprintf(errstr, len, "idle timeout for receiving data");
457be66b575SDavid Bar-On             break;
45849a5771aSDavid Bar-On     case IESETDONTFRAGMENT:
45949a5771aSDavid Bar-On 	    snprintf(errstr, len, "unable to set IP Do-Not-Fragment flag");
46049a5771aSDavid Bar-On             break;
461*7bdd5b0eSDavid Bar-On         case IESETUSERTIMEOUT:
462*7bdd5b0eSDavid Bar-On             snprintf(errstr, len, "unable to set TCP/SCTP MSS");
463*7bdd5b0eSDavid Bar-On             perr = 1;
464*7bdd5b0eSDavid Bar-On             break;
465a9c28038SBruce A. Mah 	default:
466a9c28038SBruce A. Mah 	    snprintf(errstr, len, "int_errno=%d", int_errno);
467a9c28038SBruce A. Mah 	    perr = 1;
468a9c28038SBruce A. Mah 	    break;
469b60a49ddSsethdelliott     }
470b60a49ddSsethdelliott 
47138bac802SBruce A. Mah     /* Append the result of strerror() or gai_strerror() if appropriate */
472ffdcc7d4Ssethdelliott     if (herr || perr)
47373936538SBruce A. Mah         strncat(errstr, ": ", len - strlen(errstr) - 1);
4749f28b247SShaunCurrier     if (errno && perr)
47573936538SBruce A. Mah         strncat(errstr, strerror(errno), len - strlen(errstr) - 1);
47638bac802SBruce A. Mah     else if (herr && gerror) {
47738bac802SBruce A. Mah         strncat(errstr, gai_strerror(gerror), len - strlen(errstr) - 1);
47838bac802SBruce A. Mah 	gerror = 0;
47938bac802SBruce A. Mah     }
480ffdcc7d4Ssethdelliott 
481ec2d0670SJef Poskanzer     return errstr;
482b60a49ddSsethdelliott }
483