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 IENEWTEST: 134 snprintf(errstr, len, "unable to create a new test"); 135 perr = 1; 136 break; 137 case IEINITTEST: 138 snprintf(errstr, len, "test initialization failed"); 139 perr = 1; 140 break; 141 case IELISTEN: 142 snprintf(errstr, len, "unable to start listener for connections"); 143 perr = 1; 144 break; 145 case IECONNECT: 146 snprintf(errstr, len, "unable to connect to server"); 147 perr = 1; 148 break; 149 case IEACCEPT: 150 snprintf(errstr, len, "unable to accept connection from client"); 151 herr = 1; 152 perr = 1; 153 break; 154 case IESENDCOOKIE: 155 snprintf(errstr, len, "unable to send cookie to server"); 156 perr = 1; 157 break; 158 case IERECVCOOKIE: 159 snprintf(errstr, len, "unable to receive cookie at server"); 160 perr = 1; 161 break; 162 case IECTRLWRITE: 163 snprintf(errstr, len, "unable to write to the control socket"); 164 perr = 1; 165 break; 166 case IECTRLREAD: 167 snprintf(errstr, len, "unable to read from the control socket"); 168 perr = 1; 169 break; 170 case IECTRLCLOSE: 171 snprintf(errstr, len, "control socket has closed unexpectedly"); 172 break; 173 case IEMESSAGE: 174 snprintf(errstr, len, "received an unknown control message"); 175 break; 176 case IESENDMESSAGE: 177 snprintf(errstr, len, "unable to send control message"); 178 perr = 1; 179 break; 180 case IERECVMESSAGE: 181 snprintf(errstr, len, "unable to receive control message"); 182 perr = 1; 183 break; 184 case IESENDPARAMS: 185 snprintf(errstr, len, "unable to send parameters to server"); 186 perr = 1; 187 break; 188 case IERECVPARAMS: 189 snprintf(errstr, len, "unable to receive parameters from client"); 190 perr = 1; 191 break; 192 case IEPACKAGERESULTS: 193 snprintf(errstr, len, "unable to package results"); 194 perr = 1; 195 break; 196 case IESENDRESULTS: 197 snprintf(errstr, len, "unable to send results"); 198 perr = 1; 199 break; 200 case IERECVRESULTS: 201 snprintf(errstr, len, "unable to receive results"); 202 perr = 1; 203 break; 204 case IESELECT: 205 snprintf(errstr, len, "select failed"); 206 perr = 1; 207 break; 208 case IECLIENTTERM: 209 snprintf(errstr, len, "the client has terminated"); 210 break; 211 case IESERVERTERM: 212 snprintf(errstr, len, "the server has terminated"); 213 break; 214 case IEACCESSDENIED: 215 snprintf(errstr, len, "the server is busy running a test. try again later"); 216 break; 217 case IESETNODELAY: 218 snprintf(errstr, len, "unable to set TCP NODELAY"); 219 perr = 1; 220 break; 221 case IESETMSS: 222 snprintf(errstr, len, "unable to set TCP MSS"); 223 perr = 1; 224 break; 225 case IESETBUF: 226 snprintf(errstr, len, "unable to set socket buffer size"); 227 perr = 1; 228 break; 229 case IESETTOS: 230 snprintf(errstr, len, "unable to set IP TOS"); 231 perr = 1; 232 break; 233 case IESETCOS: 234 snprintf(errstr, len, "unable to set IPv6 traffic class"); 235 perr = 1; 236 break; 237 case IESETFLOW: 238 snprintf(errstr, len, "unable to set IPv6 flow label"); 239 break; 240 case IEREUSEADDR: 241 snprintf(errstr, len, "unable to reuse address on socket"); 242 perr = 1; 243 break; 244 case IENONBLOCKING: 245 snprintf(errstr, len, "unable to set socket to non-blocking"); 246 perr = 1; 247 break; 248 case IESETWINDOWSIZE: 249 snprintf(errstr, len, "unable to set socket window size"); 250 perr = 1; 251 break; 252 case IEPROTOCOL: 253 snprintf(errstr, len, "protocol does not exist"); 254 break; 255 case IEAFFINITY: 256 snprintf(errstr, len, "unable to set CPU affinity"); 257 perr = 1; 258 break; 259 case IEDAEMON: 260 snprintf(errstr, len, "unable to become a daemon"); 261 perr = 1; 262 break; 263 case IECREATESTREAM: 264 snprintf(errstr, len, "unable to create a new stream"); 265 herr = 1; 266 perr = 1; 267 break; 268 case IEINITSTREAM: 269 snprintf(errstr, len, "unable to initialize stream"); 270 herr = 1; 271 perr = 1; 272 break; 273 case IESTREAMLISTEN: 274 snprintf(errstr, len, "unable to start stream listener"); 275 perr = 1; 276 break; 277 case IESTREAMCONNECT: 278 snprintf(errstr, len, "unable to connect stream"); 279 herr = 1; 280 perr = 1; 281 break; 282 case IESTREAMACCEPT: 283 snprintf(errstr, len, "unable to accept stream connection"); 284 perr = 1; 285 break; 286 case IESTREAMWRITE: 287 snprintf(errstr, len, "unable to write to stream socket"); 288 perr = 1; 289 break; 290 case IESTREAMREAD: 291 snprintf(errstr, len, "unable to read from stream socket"); 292 perr = 1; 293 break; 294 case IESTREAMCLOSE: 295 snprintf(errstr, len, "stream socket has closed unexpectedly"); 296 break; 297 case IESTREAMID: 298 snprintf(errstr, len, "stream has an invalid id"); 299 break; 300 case IENEWTIMER: 301 snprintf(errstr, len, "unable to create new timer"); 302 perr = 1; 303 break; 304 case IEUPDATETIMER: 305 snprintf(errstr, len, "unable to update timer"); 306 perr = 1; 307 break; 308 case IESETCONGESTION: 309 snprintf(errstr, len, "unable to set TCP_CONGESTION: " 310 "Supplied congestion control algorithm not supported on this host"); 311 break; 312 case IEPIDFILE: 313 snprintf(errstr, len, "unable to write PID file"); 314 perr = 1; 315 break; 316 case IEV6ONLY: 317 snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY"); 318 perr = 1; 319 break; 320 case IESETSCTPDISABLEFRAG: 321 snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAG"); 322 perr = 1; 323 break; 324 } 325 326 if (herr || perr) 327 strncat(errstr, ": ", len); 328 if (h_errno && herr) { 329 strncat(errstr, hstrerror(h_errno), len); 330 } else if (errno && perr) { 331 strncat(errstr, strerror(errno), len); 332 } 333 334 return errstr; 335 } 336