Annotation of embedaddon/iperf/src/iperf_error.c, revision 1.1.1.2

1.1       misho       1: /*
1.1.1.2 ! misho       2:  * iperf, Copyright (c) 2014-2020, The Regents of the University of
1.1       misho       3:  * California, through Lawrence Berkeley National Laboratory (subject
                      4:  * to receipt of any required approvals from the U.S. Dept. of
                      5:  * Energy).  All rights reserved.
                      6:  *
                      7:  * If you have questions about your rights to use or distribute this
                      8:  * software, please contact Berkeley Lab's Technology Transfer
                      9:  * Department at TTD@lbl.gov.
                     10:  *
                     11:  * NOTICE.  This software is owned by the U.S. Department of Energy.
                     12:  * As such, the U.S. Government has been granted for itself and others
                     13:  * acting on its behalf a paid-up, nonexclusive, irrevocable,
                     14:  * worldwide license in the Software to reproduce, prepare derivative
                     15:  * works, and perform publicly and display publicly.  Beginning five
                     16:  * (5) years after the date permission to assert copyright is obtained
                     17:  * from the U.S. Department of Energy, and subject to any subsequent
                     18:  * five (5) year renewals, the U.S. Government is granted for itself
                     19:  * and others acting on its behalf a paid-up, nonexclusive,
                     20:  * irrevocable, worldwide license in the Software to reproduce,
                     21:  * prepare derivative works, distribute copies to the public, perform
                     22:  * publicly and display publicly, and to permit others to do so.
                     23:  *
                     24:  * This code is distributed under a BSD style license, see the LICENSE
                     25:  * file for complete information.
                     26:  */
                     27: #include <stdio.h>
                     28: #include <errno.h>
                     29: #include <netdb.h>
                     30: #include <string.h>
                     31: #include <stdlib.h>
                     32: #include <stdarg.h>
                     33: #include "iperf.h"
                     34: #include "iperf_api.h"
                     35: 
1.1.1.2 ! misho      36: int gerror;
        !            37: 
        !            38: char iperf_timestrerr[100];
        !            39: 
1.1       misho      40: /* Do a printf to stderr. */
                     41: void
                     42: iperf_err(struct iperf_test *test, const char *format, ...)
                     43: {
                     44:     va_list argp;
                     45:     char str[1000];
1.1.1.2 ! misho      46:     time_t now;
        !            47:     struct tm *ltm = NULL;
        !            48:     char *ct = NULL;
        !            49: 
        !            50:     /* Timestamp if requested */
        !            51:     if (test != NULL && test->timestamps) {
        !            52:        time(&now);
        !            53:        ltm = localtime(&now);
        !            54:        strftime(iperf_timestrerr, sizeof(iperf_timestrerr), test->timestamp_format, ltm);
        !            55:        ct = iperf_timestrerr;
        !            56:     }
1.1       misho      57: 
                     58:     va_start(argp, format);
                     59:     vsnprintf(str, sizeof(str), format, argp);
                     60:     if (test != NULL && test->json_output && test->json_top != NULL)
                     61:        cJSON_AddStringToObject(test->json_top, "error", str);
                     62:     else
1.1.1.2 ! misho      63:        if (test && test->outfile && test->outfile != stdout) {
        !            64:            if (ct) {
        !            65:                fprintf(test->outfile, "%s", ct);
        !            66:            }
1.1       misho      67:            fprintf(test->outfile, "iperf3: %s\n", str);
                     68:        }
                     69:        else {
1.1.1.2 ! misho      70:            if (ct) {
        !            71:                fprintf(stderr, "%s", ct);
        !            72:            }
1.1       misho      73:            fprintf(stderr, "iperf3: %s\n", str);
                     74:        }
                     75:     va_end(argp);
                     76: }
                     77: 
                     78: /* Do a printf to stderr or log file as appropriate, then exit. */
                     79: void
                     80: iperf_errexit(struct iperf_test *test, const char *format, ...)
                     81: {
                     82:     va_list argp;
                     83:     char str[1000];
1.1.1.2 ! misho      84:     time_t now;
        !            85:     struct tm *ltm = NULL;
        !            86:     char *ct = NULL;
        !            87: 
        !            88:     /* Timestamp if requested */
        !            89:     if (test != NULL && test->timestamps) {
        !            90:        time(&now);
        !            91:        ltm = localtime(&now);
        !            92:        strftime(iperf_timestrerr, sizeof(iperf_timestrerr), "%c ", ltm);
        !            93:        ct = iperf_timestrerr;
        !            94:     }
1.1       misho      95: 
                     96:     va_start(argp, format);
                     97:     vsnprintf(str, sizeof(str), format, argp);
                     98:     if (test != NULL && test->json_output && test->json_top != NULL) {
                     99:        cJSON_AddStringToObject(test->json_top, "error", str);
                    100:        iperf_json_finish(test);
                    101:     } else
1.1.1.2 ! misho     102:        if (test && test->outfile && test->outfile != stdout) {
        !           103:            if (ct) {
        !           104:                fprintf(test->outfile, "%s", ct);
        !           105:            }
1.1       misho     106:            fprintf(test->outfile, "iperf3: %s\n", str);
                    107:        }
                    108:        else {
1.1.1.2 ! misho     109:            if (ct) {
        !           110:                fprintf(stderr, "%s", ct);
        !           111:            }
1.1       misho     112:            fprintf(stderr, "iperf3: %s\n", str);
                    113:        }
                    114:     va_end(argp);
                    115:     if (test)
                    116:         iperf_delete_pidfile(test);
                    117:     exit(1);
                    118: }
                    119: 
                    120: int i_errno;
                    121: 
                    122: char *
1.1.1.2 ! misho     123: iperf_strerror(int int_errno)
1.1       misho     124: {
                    125:     static char errstr[256];
                    126:     int len, perr, herr;
                    127:     perr = herr = 0;
                    128: 
                    129:     len = sizeof(errstr);
                    130:     memset(errstr, 0, len);
                    131: 
1.1.1.2 ! misho     132:     switch (int_errno) {
1.1       misho     133:         case IENONE:
                    134:             snprintf(errstr, len, "no error");
                    135:             break;
                    136:         case IESERVCLIENT:
                    137:             snprintf(errstr, len, "cannot be both server and client");
                    138:             break;
                    139:         case IENOROLE:
                    140:             snprintf(errstr, len, "must either be a client (-c) or server (-s)");
                    141:             break;
                    142:         case IESERVERONLY:
                    143:             snprintf(errstr, len, "some option you are trying to set is server only");
                    144:             break;
                    145:         case IECLIENTONLY:
                    146:             snprintf(errstr, len, "some option you are trying to set is client only");
                    147:             break;
                    148:         case IEDURATION:
                    149:             snprintf(errstr, len, "test duration too long (maximum = %d seconds)", MAX_TIME);
                    150:             break;
                    151:         case IENUMSTREAMS:
                    152:             snprintf(errstr, len, "number of parallel streams too large (maximum = %d)", MAX_STREAMS);
                    153:             break;
                    154:         case IEBLOCKSIZE:
                    155:             snprintf(errstr, len, "block size too large (maximum = %d bytes)", MAX_BLOCKSIZE);
                    156:             break;
                    157:         case IEBUFSIZE:
                    158:             snprintf(errstr, len, "socket buffer size too large (maximum = %d bytes)", MAX_TCP_BUFFER);
                    159:             break;
                    160:         case IEINTERVAL:
                    161:             snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
                    162:             break;
1.1.1.2 ! misho     163:     case IEBIND: /* UNUSED */
1.1       misho     164:             snprintf(errstr, len, "--bind must be specified to use --cport");
                    165:             break;
                    166:         case IEUDPBLOCKSIZE:
1.1.1.2 ! misho     167:             snprintf(errstr, len, "block size invalid (minimum = %d bytes, maximum = %d bytes)", MIN_UDP_BLOCKSIZE, MAX_UDP_BLOCKSIZE);
        !           168:             break;
        !           169:         case IEBADTOS:
        !           170:             snprintf(errstr, len, "bad TOS value (must be between 0 and 255 inclusive)");
        !           171:             break;
        !           172:         case IESETCLIENTAUTH:
        !           173:              snprintf(errstr, len, "you must specify a username, password, and path to a valid RSA public key");
1.1       misho     174:             break;
1.1.1.2 ! misho     175:         case IESETSERVERAUTH:
        !           176:              snprintf(errstr, len, "you must specify a path to a valid RSA private key and a user credential file");
        !           177:             break;
        !           178:        case IEBADFORMAT:
        !           179:            snprintf(errstr, len, "bad format specifier (valid formats are in the set [kmgtKMGT])");
        !           180:            break;
        !           181:        case IEBADPORT:
        !           182:            snprintf(errstr, len, "port number must be between 1 and 65535 inclusive");
1.1       misho     183:            break;
                    184:         case IEMSS:
                    185:             snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
                    186:             break;
                    187:         case IENOSENDFILE:
                    188:             snprintf(errstr, len, "this OS does not support sendfile");
                    189:             break;
                    190:         case IEOMIT:
                    191:             snprintf(errstr, len, "bogus value for --omit");
                    192:             break;
                    193:         case IEUNIMP:
                    194:             snprintf(errstr, len, "an option you are trying to set is not implemented yet");
                    195:             break;
                    196:         case IEFILE:
                    197:             snprintf(errstr, len, "unable to open -F file");
                    198:             perr = 1;
                    199:             break;
                    200:         case IEBURST:
                    201:             snprintf(errstr, len, "invalid burst count (maximum = %d)", MAX_BURST);
                    202:             break;
                    203:         case IEENDCONDITIONS:
                    204:             snprintf(errstr, len, "only one test end condition (-t, -n, -k) may be specified");
                    205:             break;
                    206:        case IELOGFILE:
                    207:            snprintf(errstr, len, "unable to open log file");
                    208:            perr = 1;
                    209:            break;
                    210:        case IENOSCTP:
                    211:            snprintf(errstr, len, "no SCTP support available");
                    212:            break;
                    213:         case IENEWTEST:
                    214:             snprintf(errstr, len, "unable to create a new test");
                    215:             perr = 1;
                    216:             break;
                    217:         case IEINITTEST:
                    218:             snprintf(errstr, len, "test initialization failed");
                    219:             perr = 1;
                    220:             break;
1.1.1.2 ! misho     221:         case IEAUTHTEST:
        !           222:             snprintf(errstr, len, "test authorization failed");
        !           223:             break;
1.1       misho     224:         case IELISTEN:
                    225:             snprintf(errstr, len, "unable to start listener for connections");
1.1.1.2 ! misho     226:            herr = 1;
1.1       misho     227:             perr = 1;
                    228:             break;
                    229:         case IECONNECT:
                    230:             snprintf(errstr, len, "unable to connect to server");
                    231:             perr = 1;
1.1.1.2 ! misho     232:            herr = 1;
1.1       misho     233:             break;
                    234:         case IEACCEPT:
                    235:             snprintf(errstr, len, "unable to accept connection from client");
                    236:             herr = 1;
                    237:             perr = 1;
                    238:             break;
                    239:         case IESENDCOOKIE:
                    240:             snprintf(errstr, len, "unable to send cookie to server");
                    241:             perr = 1;
                    242:             break;
                    243:         case IERECVCOOKIE:
                    244:             snprintf(errstr, len, "unable to receive cookie at server");
                    245:             perr = 1;
                    246:             break;
                    247:         case IECTRLWRITE:
                    248:             snprintf(errstr, len, "unable to write to the control socket");
                    249:             perr = 1;
                    250:             break;
                    251:         case IECTRLREAD:
                    252:             snprintf(errstr, len, "unable to read from the control socket");
                    253:             perr = 1;
                    254:             break;
                    255:         case IECTRLCLOSE:
                    256:             snprintf(errstr, len, "control socket has closed unexpectedly");
                    257:             break;
                    258:         case IEMESSAGE:
                    259:             snprintf(errstr, len, "received an unknown control message");
                    260:             break;
                    261:         case IESENDMESSAGE:
                    262:             snprintf(errstr, len, "unable to send control message");
                    263:             perr = 1;
                    264:             break;
                    265:         case IERECVMESSAGE:
                    266:             snprintf(errstr, len, "unable to receive control message");
                    267:             perr = 1;
                    268:             break;
                    269:         case IESENDPARAMS:
                    270:             snprintf(errstr, len, "unable to send parameters to server");
                    271:             perr = 1;
                    272:             break;
                    273:         case IERECVPARAMS:
                    274:             snprintf(errstr, len, "unable to receive parameters from client");
                    275:             perr = 1;
                    276:             break;
                    277:         case IEPACKAGERESULTS:
                    278:             snprintf(errstr, len, "unable to package results");
                    279:             perr = 1;
                    280:             break;
                    281:         case IESENDRESULTS:
                    282:             snprintf(errstr, len, "unable to send results");
                    283:             perr = 1;
                    284:             break;
                    285:         case IERECVRESULTS:
                    286:             snprintf(errstr, len, "unable to receive results");
                    287:             perr = 1;
                    288:             break;
                    289:         case IESELECT:
                    290:             snprintf(errstr, len, "select failed");
                    291:             perr = 1;
                    292:             break;
                    293:         case IECLIENTTERM:
                    294:             snprintf(errstr, len, "the client has terminated");
                    295:             break;
                    296:         case IESERVERTERM:
                    297:             snprintf(errstr, len, "the server has terminated");
                    298:             break;
                    299:         case IEACCESSDENIED:
                    300:             snprintf(errstr, len, "the server is busy running a test. try again later");
                    301:             break;
                    302:         case IESETNODELAY:
                    303:             snprintf(errstr, len, "unable to set TCP/SCTP NODELAY");
                    304:             perr = 1;
                    305:             break;
                    306:         case IESETMSS:
                    307:             snprintf(errstr, len, "unable to set TCP/SCTP MSS");
                    308:             perr = 1;
                    309:             break;
                    310:         case IESETBUF:
                    311:             snprintf(errstr, len, "unable to set socket buffer size");
                    312:             perr = 1;
                    313:             break;
                    314:         case IESETTOS:
                    315:             snprintf(errstr, len, "unable to set IP TOS");
                    316:             perr = 1;
                    317:             break;
                    318:         case IESETCOS:
                    319:             snprintf(errstr, len, "unable to set IPv6 traffic class");
                    320:             perr = 1;
                    321:             break;
                    322:         case IESETFLOW:
                    323:             snprintf(errstr, len, "unable to set IPv6 flow label");
                    324:             break;
                    325:         case IEREUSEADDR:
                    326:             snprintf(errstr, len, "unable to reuse address on socket");
                    327:             perr = 1;
                    328:             break;
                    329:         case IENONBLOCKING:
                    330:             snprintf(errstr, len, "unable to set socket to non-blocking");
                    331:             perr = 1;
                    332:             break;
                    333:         case IESETWINDOWSIZE:
                    334:             snprintf(errstr, len, "unable to set socket window size");
                    335:             perr = 1;
                    336:             break;
                    337:         case IEPROTOCOL:
                    338:             snprintf(errstr, len, "protocol does not exist");
                    339:             break;
                    340:         case IEAFFINITY:
                    341:             snprintf(errstr, len, "unable to set CPU affinity");
                    342:             perr = 1;
                    343:             break;
                    344:        case IEDAEMON:
                    345:            snprintf(errstr, len, "unable to become a daemon");
                    346:            perr = 1;
                    347:            break;
                    348:         case IECREATESTREAM:
                    349:             snprintf(errstr, len, "unable to create a new stream");
                    350:             herr = 1;
                    351:             perr = 1;
                    352:             break;
                    353:         case IEINITSTREAM:
                    354:             snprintf(errstr, len, "unable to initialize stream");
                    355:             herr = 1;
                    356:             perr = 1;
                    357:             break;
                    358:         case IESTREAMLISTEN:
                    359:             snprintf(errstr, len, "unable to start stream listener");
1.1.1.2 ! misho     360:            herr = 1;
1.1       misho     361:             perr = 1;
                    362:             break;
                    363:         case IESTREAMCONNECT:
                    364:             snprintf(errstr, len, "unable to connect stream");
                    365:             herr = 1;
                    366:             perr = 1;
                    367:             break;
                    368:         case IESTREAMACCEPT:
                    369:             snprintf(errstr, len, "unable to accept stream connection");
                    370:             perr = 1;
                    371:             break;
                    372:         case IESTREAMWRITE:
                    373:             snprintf(errstr, len, "unable to write to stream socket");
                    374:             perr = 1;
                    375:             break;
                    376:         case IESTREAMREAD:
                    377:             snprintf(errstr, len, "unable to read from stream socket");
                    378:             perr = 1;
                    379:             break;
                    380:         case IESTREAMCLOSE:
                    381:             snprintf(errstr, len, "stream socket has closed unexpectedly");
                    382:             break;
                    383:         case IESTREAMID:
                    384:             snprintf(errstr, len, "stream has an invalid id");
                    385:             break;
                    386:         case IENEWTIMER:
                    387:             snprintf(errstr, len, "unable to create new timer");
                    388:             perr = 1;
                    389:             break;
                    390:         case IEUPDATETIMER:
                    391:             snprintf(errstr, len, "unable to update timer");
                    392:             perr = 1;
                    393:             break;
                    394:         case IESETCONGESTION:
                    395:             snprintf(errstr, len, "unable to set TCP_CONGESTION: " 
                    396:                                   "Supplied congestion control algorithm not supported on this host");
                    397:             break;
                    398:        case IEPIDFILE:
                    399:             snprintf(errstr, len, "unable to write PID file");
                    400:             perr = 1;
                    401:             break;
                    402:        case IEV6ONLY:
                    403:            snprintf(errstr, len, "Unable to set/reset IPV6_V6ONLY");
                    404:            perr = 1;
                    405:            break;
                    406:         case IESETSCTPDISABLEFRAG:
                    407:             snprintf(errstr, len, "unable to set SCTP_DISABLE_FRAGMENTS");
                    408:             perr = 1;
                    409:             break;
                    410:         case IESETSCTPNSTREAM:
                    411:             snprintf(errstr, len, "unable to set SCTP_INIT num of SCTP streams\n");
                    412:             perr = 1;
                    413:             break;
                    414:        case IESETPACING:
                    415:            snprintf(errstr, len, "unable to set socket pacing");
                    416:            perr = 1;
                    417:            break;
1.1.1.2 ! misho     418:        case IESETBUF2:
        !           419:            snprintf(errstr, len, "socket buffer size not set correctly");
        !           420:            break;
        !           421:        case IEREVERSEBIDIR:
        !           422:            snprintf(errstr, len, "cannot be both reverse and bidirectional");
        !           423:             break;
        !           424:        case IETOTALRATE:
        !           425:            snprintf(errstr, len, "total required bandwidth is larger than server limit");
        !           426:             break;
        !           427:        default:
        !           428:            snprintf(errstr, len, "int_errno=%d", int_errno);
        !           429:            perr = 1;
        !           430:            break;
1.1       misho     431:     }
                    432: 
1.1.1.2 ! misho     433:     /* Append the result of strerror() or gai_strerror() if appropriate */
1.1       misho     434:     if (herr || perr)
                    435:         strncat(errstr, ": ", len - strlen(errstr) - 1);
1.1.1.2 ! misho     436:     if (errno && perr)
1.1       misho     437:         strncat(errstr, strerror(errno), len - strlen(errstr) - 1);
1.1.1.2 ! misho     438:     else if (herr && gerror) {
        !           439:         strncat(errstr, gai_strerror(gerror), len - strlen(errstr) - 1);
        !           440:        gerror = 0;
1.1       misho     441:     }
                    442: 
                    443:     return errstr;
                    444: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>