1 /* 2 * Copyright (c) 2009-2014, The Regents of the University of California, 3 * through Lawrence Berkeley National Laboratory (subject to receipt of any 4 * required approvals from the U.S. Dept. of Energy). All rights reserved. 5 * 6 * This code is distributed under a BSD style license, see the LICENSE file 7 * for complete information. 8 */ 9 10 #include <stdio.h> 11 #include <errno.h> 12 #include <netdb.h> 13 #include <string.h> 14 #include <stdlib.h> 15 #include <stdarg.h> 16 #include "iperf.h" 17 #include "iperf_api.h" 18 19 /* Do a printf to stderr. */ 20 void 21 iperf_err(struct iperf_test *test, const char *format, ...) 22 { 23 va_list argp; 24 char str[1000]; 25 26 va_start(argp, format); 27 vsnprintf(str, sizeof(str), format, argp); 28 if (test != NULL && test->json_output && test->json_top != NULL) 29 cJSON_AddStringToObject(test->json_top, "error", str); 30 else 31 if (test && test->outfile) { 32 fprintf(test->outfile, "iperf3: %s\n", str); 33 } 34 else { 35 fprintf(stderr, "iperf3: %s\n", str); 36 } 37 va_end(argp); 38 } 39 40 /* Do a printf to stderr or log file as appropriate, then exit. */ 41 void 42 iperf_errexit(struct iperf_test *test, const char *format, ...) 43 { 44 va_list argp; 45 char str[1000]; 46 47 va_start(argp, format); 48 vsnprintf(str, sizeof(str), format, argp); 49 if (test != NULL && test->json_output && test->json_top != NULL) { 50 cJSON_AddStringToObject(test->json_top, "error", str); 51 iperf_json_finish(test); 52 } else 53 if (test && test->outfile) { 54 fprintf(test->outfile, "iperf3: %s\n", str); 55 } 56 else { 57 fprintf(stderr, "iperf3: %s\n", str); 58 } 59 va_end(argp); 60 iperf_delete_pidfile(test); 61 exit(1); 62 } 63 64 int i_errno; 65 66 char * 67 iperf_strerror(int i_errno) 68 { 69 static char errstr[256]; 70 int len, perr, herr; 71 perr = herr = 0; 72 73 len = sizeof(errstr); 74 memset(errstr, 0, len); 75 76 switch (i_errno) { 77 case IENONE: 78 snprintf(errstr, len, "no error"); 79 break; 80 case IESERVCLIENT: 81 snprintf(errstr, len, "cannot be both server and client"); 82 break; 83 case IENOROLE: 84 snprintf(errstr, len, "must either be a client (-c) or server (-s)"); 85 break; 86 case IESERVERONLY: 87 snprintf(errstr, len, "some option you are trying to set is server only"); 88 break; 89 case IECLIENTONLY: 90 snprintf(errstr, len, "some option you are trying to set is client only"); 91 break; 92 case IEDURATION: 93 snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME); 94 break; 95 case IENUMSTREAMS: 96 snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS); 97 break; 98 case IEBLOCKSIZE: 99 snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE); 100 break; 101 case IEBUFSIZE: 102 snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER); 103 break; 104 case IEINTERVAL: 105 snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL); 106 break; 107 case IEMSS: 108 snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS); 109 break; 110 case IENOSENDFILE: 111 snprintf(errstr, len, "this OS does not support sendfile"); 112 break; 113 case IEOMIT: 114 snprintf(errstr, len, "bogus value for --omit"); 115 break; 116 case IEUNIMP: 117 snprintf(errstr, len, "an option you are trying to set is not implemented yet"); 118 break; 119 case IEFILE: 120 snprintf(errstr, len, "unable to open -F file"); 121 perr = 1; 122 break; 123 case IEBURST: 124 snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST); 125 break; 126 case IEENDCONDITIONS: 127 snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified"); 128 break; 129 case IELOGFILE: 130 snprintf(errstr, len, "unable to open log file"); 131 perr = 1; 132 break; 133 case IENOSCTP: 134 snprintf(errstr, len, "no SCTP support available"); 135 break; 136 case IENEWTEST: 137 snprintf(errstr, len, "unable to create a new test"); 138 perr = 1; 139 break; 140 case IEINITTEST: 141 snprintf(errstr, len, "test initialization failed"); 142 perr = 1; 143 break; 144 case IELISTEN: 145 snprintf(errstr, len, "unable to start listener for connections"); 146 perr = 1; 147 break; 148 case IECONNECT: 149 snprintf(errstr, len, "unable to connect to server"); 150 perr = 1; 151 break; 152 case IEACCEPT: 153 snprintf(errstr, len, "unable to accept connection from client"); 154 herr = 1; 155 perr = 1; 156 break; 157 case IESENDCOOKIE: 158 snprintf(errstr, len, "unable to send cookie to server"); 159 perr = 1; 160 break; 161 case IERECVCOOKIE: 162 snprintf(errstr, len, "unable to receive cookie at server"); 163 perr = 1; 164 break; 165 case IECTRLWRITE: 166 snprintf(errstr, len, "unable to write to the control socket"); 167 perr = 1; 168 break; 169 case IECTRLREAD: 170 snprintf(errstr, len, "unable to read from the control socket"); 171 perr = 1; 172 break; 173 case IECTRLCLOSE: 174 snprintf(errstr, len, "control socket has closed unexpectedly"); 175 break; 176 case IEMESSAGE: 177 snprintf(errstr, len, "received an unknown control message"); 178 break; 179 case IESENDMESSAGE: 180 snprintf(errstr, len, "unable to send control message"); 181 perr = 1; 182 break; 183 case IERECVMESSAGE: 184 snprintf(errstr, len, "unable to receive control message"); 185 perr = 1; 186 break; 187 case IESENDPARAMS: 188 snprintf(errstr, len, "unable to send parameters to server"); 189 perr = 1; 190 break; 191 case IERECVPARAMS: 192 snprintf(errstr, len, "unable to receive parameters from client"); 193 perr = 1; 194 break; 195 case IEPACKAGERESULTS: 196 snprintf(errstr, len, "unable to package results"); 197 perr = 1; 198 break; 199 case IESENDRESULTS: 200 snprintf(errstr, len, "unable to send results"); 201 perr = 1; 202 break; 203 case IERECVRESULTS: 204 snprintf(errstr, len, "unable to receive results"); 205 perr = 1; 206 break; 207 case IESELECT: 208 snprintf(errstr, len, "select failed"); 209 perr = 1; 210 break; 211 case IECLIENTTERM: 212 snprintf(errstr, len, "the client has terminated"); 213 break; 214 case IESERVERTERM: 215 snprintf(errstr, len, "the server has terminated"); 216 break; 217 case IEACCESSDENIED: 218 snprintf(errstr, len, "the server is busy running a test. try again later"); 219 break; 220 case IESETNODELAY: 221 snprintf(errstr, len, "unable to set TCP NODELAY"); 222 perr = 1; 223 break; 224 case IESETMSS: 225 snprintf(errstr, len, "unable to set TCP MSS"); 226 perr = 1; 227 break; 228 case IESETBUF: 229 snprintf(errstr, len, "unable to set socket buffer size"); 230 perr = 1; 231 break; 232 case IESETTOS: 233 snprintf(errstr, len, "unable to set IP TOS"); 234 perr = 1; 235 break; 236 case IESETCOS: 237 snprintf(errstr, len, "unable to set IPv6 traffic class"); 238 perr = 1; 239 break; 240 case IESETFLOW: 241 snprintf(errstr, len, "unable to set IPv6 flow label"); 242 break; 243 case IEREUSEADDR: 244 snprintf(errstr, len, "unable to reuse address on socket"); 245 perr = 1; 246 break; 247 case IENONBLOCKING: 248 snprintf(errstr, len, "unable to set socket to non-blocking"); 249 perr = 1; 250 break; 251 case IESETWINDOWSIZE: 252 snprintf(errstr, len, "unable to set socket window size"); 253 perr = 1; 254 break; 255 case IEPROTOCOL: 256 snprintf(errstr, len, "protocol does not exist"); 257 break; 258 case IEAFFINITY: 259 snprintf(errstr, len, "unable to set CPU affinity"); 260 perr = 1; 261 break; 262 case IEDAEMON: 263 snprintf(errstr, len, "unable to become a daemon"); 264 perr = 1; 265 break; 266 case IECREATESTREAM: 267 snprintf(errstr, len, "unable to create a new stream"); 268 herr = 1; 269 perr = 1; 270 break; 271 case IEINITSTREAM: 272 snprintf(errstr, len, "unable to initialize stream"); 273 herr = 1; 274 perr = 1; 275 break; 276 case IESTREAMLISTEN: 277 snprintf(errstr, len, "unable to start stream listener"); 278 perr = 1; 279 break; 280 case IESTREAMCONNECT: 281 snprintf(errstr, len, "unable to connect stream"); 282 herr = 1; 283 perr = 1; 284 break; 285 case IESTREAMACCEPT: 286 snprintf(errstr, len, "unable to accept stream connection"); 287 perr = 1; 288 break; 289 case IESTREAMWRITE: 290 snprintf(errstr, len, "unable to write to stream socket"); 291 perr = 1; 292 break; 293 case IESTREAMREAD: 294 snprintf(errstr, len, "unable to read from stream socket"); 295 perr = 1; 296 break; 297 case IESTREAMCLOSE: 298 snprintf(errstr, len, "stream socket has closed unexpectedly"); 299 break; 300 case IESTREAMID: 301 snprintf(errstr, len, "stream has an invalid id"); 302 break; 303 case IENEWTIMER: 304 snprintf(errstr, len, "unable to create new timer"); 305 perr = 1; 306 break; 307 case IEUPDATETIMER: 308 snprintf(errstr, len, "unable to update timer"); 309 perr = 1; 310 break; 311 case IESETCONGESTION: 312 snprintf(errstr, len, "unable to set TCP_CONGESTION: " 313 "Supplied congestion control algorithm not supported on this host"); 314 break; 315 case IEPIDFILE: 316 snprintf(errstr, len, "unable to write PID file"); 317 perr = 1; 318 break; 319 case IEV6ONLY: 320 snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY"); 321 perr = 1; 322 break; 323 case IESETSCTPDISABLEFRAG: 324 snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAG"); 325 perr = 1; 326 break; 327 } 328 329 if (herr || perr) 330 strncat(errstr, ": ", len - strlen(errstr) - 1); 331 if (h_errno && herr) { 332 strncat(errstr, hstrerror(h_errno), len - strlen(errstr) - 1); 333 } else if (errno && perr) { 334 strncat(errstr, strerror(errno), len - strlen(errstr) - 1); 335 } 336 337 return errstr; 338 } 339