Annotation of embedaddon/curl/tests/libtest/test.h, revision 1.1

1.1     ! misho       1: /***************************************************************************
        !             2:  *                                  _   _ ____  _
        !             3:  *  Project                     ___| | | |  _ \| |
        !             4:  *                             / __| | | | |_) | |
        !             5:  *                            | (__| |_| |  _ <| |___
        !             6:  *                             \___|\___/|_| \_\_____|
        !             7:  *
        !             8:  * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
        !             9:  *
        !            10:  * This software is licensed as described in the file COPYING, which
        !            11:  * you should have received as part of this distribution. The terms
        !            12:  * are also available at https://curl.haxx.se/docs/copyright.html.
        !            13:  *
        !            14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
        !            15:  * copies of the Software, and permit persons to whom the Software is
        !            16:  * furnished to do so, under the terms of the COPYING file.
        !            17:  *
        !            18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
        !            19:  * KIND, either express or implied.
        !            20:  *
        !            21:  ***************************************************************************/
        !            22: 
        !            23: /* !checksrc! disable ASSIGNWITHINCONDITION 14 */
        !            24: 
        !            25: /* Now include the curl_setup.h file from libcurl's private libdir (the source
        !            26:    version, but that might include "curl_config.h" from the build dir so we
        !            27:    need both of them in the include path), so that we get good in-depth
        !            28:    knowledge about the system we're building this on */
        !            29: 
        !            30: #define CURL_NO_OLDIES
        !            31: 
        !            32: #include "curl_setup.h"
        !            33: 
        !            34: #include <curl/curl.h>
        !            35: 
        !            36: #ifdef HAVE_SYS_SELECT_H
        !            37: /* since so many tests use select(), we can just as well include it here */
        !            38: #include <sys/select.h>
        !            39: #elif defined(HAVE_UNISTD_H)
        !            40: #include <unistd.h>
        !            41: #endif
        !            42: 
        !            43: #ifdef TPF
        !            44: #  include "select.h"
        !            45: #endif
        !            46: 
        !            47: #include "curl_printf.h"
        !            48: 
        !            49: #define test_setopt(A,B,C)                                      \
        !            50:   if((res = curl_easy_setopt((A), (B), (C))) != CURLE_OK)       \
        !            51:     goto test_cleanup
        !            52: 
        !            53: #define test_multi_setopt(A,B,C)                                \
        !            54:   if((res = curl_multi_setopt((A), (B), (C))) != CURLE_OK)      \
        !            55:     goto test_cleanup
        !            56: 
        !            57: extern char *libtest_arg2; /* set by first.c to the argv[2] or NULL */
        !            58: extern char *libtest_arg3; /* set by first.c to the argv[3] or NULL */
        !            59: 
        !            60: /* argc and argv as passed in to the main() function */
        !            61: extern int test_argc;
        !            62: extern char **test_argv;
        !            63: 
        !            64: extern struct timeval tv_test_start; /* for test timing */
        !            65: 
        !            66: extern int select_wrapper(int nfds, fd_set *rd, fd_set *wr, fd_set *exc,
        !            67:                           struct timeval *tv);
        !            68: 
        !            69: extern void wait_ms(int ms); /* wait this many milliseconds */
        !            70: 
        !            71: extern int test(char *URL); /* the actual test function provided by each
        !            72:                                individual libXXX.c file */
        !            73: 
        !            74: extern char *hexdump(const unsigned char *buffer, size_t len);
        !            75: 
        !            76: #ifdef UNITTESTS
        !            77: extern int unitfail;
        !            78: #endif
        !            79: 
        !            80: /*
        !            81: ** TEST_ERR_* values must be greater than CURL_LAST CURLcode in order
        !            82: ** to avoid confusion with any CURLcode or CURLMcode. These TEST_ERR_*
        !            83: ** codes are returned to signal test specific situations and should
        !            84: ** not get mixed with CURLcode or CURLMcode values.
        !            85: **
        !            86: ** For portability reasons TEST_ERR_* values should be less than 127.
        !            87: */
        !            88: 
        !            89: #define TEST_ERR_MAJOR_BAD     126
        !            90: #define TEST_ERR_RUNS_FOREVER  125
        !            91: #define TEST_ERR_EASY_INIT     124
        !            92: #define TEST_ERR_MULTI_INIT    123
        !            93: #define TEST_ERR_NUM_HANDLES   122
        !            94: #define TEST_ERR_SELECT        121
        !            95: #define TEST_ERR_SUCCESS       120
        !            96: #define TEST_ERR_FAILURE       119
        !            97: #define TEST_ERR_USAGE         118
        !            98: #define TEST_ERR_FOPEN         117
        !            99: #define TEST_ERR_FSTAT         116
        !           100: #define TEST_ERR_BAD_TIMEOUT   115
        !           101: 
        !           102: /*
        !           103: ** Macros for test source code readability/maintainability.
        !           104: **
        !           105: ** All of the following macros require that an int data type 'res' variable
        !           106: ** exists in scope where macro is used, and that it has been initialized to
        !           107: ** zero before the macro is used.
        !           108: **
        !           109: ** exe_* and chk_* macros are helper macros not intended to be used from
        !           110: ** outside of this header file. Arguments 'Y' and 'Z' of these represent
        !           111: ** source code file and line number, while Arguments 'A', 'B', etc, are
        !           112: ** the arguments used to actually call a libcurl function.
        !           113: **
        !           114: ** All easy_* and multi_* macros call a libcurl function and evaluate if
        !           115: ** the function has succeeded or failed. When the function succeeds 'res'
        !           116: ** variable is not set nor cleared and program continues normal flow. On
        !           117: ** the other hand if function fails 'res' variable is set and a jump to
        !           118: ** label 'test_cleanup' is performed.
        !           119: **
        !           120: ** Every easy_* and multi_* macros have a res_easy_* and res_multi_* macro
        !           121: ** counterpart that operates in the same way with the exception that no
        !           122: ** jump takes place in case of failure. res_easy_* and res_multi_* macros
        !           123: ** should be immediately followed by checking if 'res' variable has been
        !           124: ** set.
        !           125: **
        !           126: ** 'res' variable when set will hold a CURLcode, CURLMcode, or any of the
        !           127: ** TEST_ERR_* values defined above. It is advisable to return this value
        !           128: ** as test result.
        !           129: */
        !           130: 
        !           131: /* ---------------------------------------------------------------- */
        !           132: 
        !           133: #define exe_easy_init(A,Y,Z) do {                                 \
        !           134:   if(((A) = curl_easy_init()) == NULL) {                          \
        !           135:     fprintf(stderr, "%s:%d curl_easy_init() failed\n", (Y), (Z)); \
        !           136:     res = TEST_ERR_EASY_INIT;                                     \
        !           137:   }                                                               \
        !           138: } while(0)
        !           139: 
        !           140: #define res_easy_init(A) \
        !           141:   exe_easy_init((A), (__FILE__), (__LINE__))
        !           142: 
        !           143: #define chk_easy_init(A,Y,Z) do { \
        !           144:   exe_easy_init((A), (Y), (Z));   \
        !           145:   if(res)                         \
        !           146:     goto test_cleanup;            \
        !           147: } while(0)
        !           148: 
        !           149: #define easy_init(A) \
        !           150:   chk_easy_init((A), (__FILE__), (__LINE__))
        !           151: 
        !           152: /* ---------------------------------------------------------------- */
        !           153: 
        !           154: #define exe_multi_init(A,Y,Z) do {                                 \
        !           155:   if(((A) = curl_multi_init()) == NULL) {                          \
        !           156:     fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
        !           157:     res = TEST_ERR_MULTI_INIT;                                     \
        !           158:   }                                                                \
        !           159: } while(0)
        !           160: 
        !           161: #define res_multi_init(A) \
        !           162:   exe_multi_init((A), (__FILE__), (__LINE__))
        !           163: 
        !           164: #define chk_multi_init(A,Y,Z) do { \
        !           165:   exe_multi_init((A), (Y), (Z));   \
        !           166:   if(res)                          \
        !           167:     goto test_cleanup;             \
        !           168: } while(0)
        !           169: 
        !           170: #define multi_init(A) \
        !           171:   chk_multi_init((A), (__FILE__), (__LINE__))
        !           172: 
        !           173: /* ---------------------------------------------------------------- */
        !           174: 
        !           175: #define exe_easy_setopt(A,B,C,Y,Z) do {                    \
        !           176:   CURLcode ec;                                             \
        !           177:   if((ec = curl_easy_setopt((A), (B), (C))) != CURLE_OK) { \
        !           178:     fprintf(stderr, "%s:%d curl_easy_setopt() failed, "    \
        !           179:             "with code %d (%s)\n",                         \
        !           180:             (Y), (Z), (int)ec, curl_easy_strerror(ec));    \
        !           181:     res = (int)ec;                                         \
        !           182:   }                                                        \
        !           183: } while(0)
        !           184: 
        !           185: #define res_easy_setopt(A, B, C) \
        !           186:   exe_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
        !           187: 
        !           188: #define chk_easy_setopt(A, B, C, Y, Z) do { \
        !           189:   exe_easy_setopt((A), (B), (C), (Y), (Z)); \
        !           190:   if(res)                                   \
        !           191:     goto test_cleanup;                      \
        !           192: } while(0)
        !           193: 
        !           194: #define easy_setopt(A, B, C) \
        !           195:   chk_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
        !           196: 
        !           197: /* ---------------------------------------------------------------- */
        !           198: 
        !           199: #define exe_multi_setopt(A, B, C, Y, Z) do {                \
        !           200:   CURLMcode ec;                                             \
        !           201:   if((ec = curl_multi_setopt((A), (B), (C))) != CURLM_OK) { \
        !           202:     fprintf(stderr, "%s:%d curl_multi_setopt() failed, "    \
        !           203:             "with code %d (%s)\n",                          \
        !           204:             (Y), (Z), (int)ec, curl_multi_strerror(ec));    \
        !           205:     res = (int)ec;                                          \
        !           206:   }                                                         \
        !           207: } while(0)
        !           208: 
        !           209: #define res_multi_setopt(A,B,C) \
        !           210:   exe_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
        !           211: 
        !           212: #define chk_multi_setopt(A,B,C,Y,Z) do {     \
        !           213:   exe_multi_setopt((A), (B), (C), (Y), (Z)); \
        !           214:   if(res)                                    \
        !           215:     goto test_cleanup;                       \
        !           216: } while(0)
        !           217: 
        !           218: #define multi_setopt(A,B,C) \
        !           219:   chk_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
        !           220: 
        !           221: /* ---------------------------------------------------------------- */
        !           222: 
        !           223: #define exe_multi_add_handle(A,B,Y,Z) do {                   \
        !           224:   CURLMcode ec;                                              \
        !           225:   if((ec = curl_multi_add_handle((A), (B))) != CURLM_OK) {   \
        !           226:     fprintf(stderr, "%s:%d curl_multi_add_handle() failed, " \
        !           227:             "with code %d (%s)\n",                           \
        !           228:             (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
        !           229:     res = (int)ec;                                           \
        !           230:   }                                                          \
        !           231: } while(0)
        !           232: 
        !           233: #define res_multi_add_handle(A, B) \
        !           234:   exe_multi_add_handle((A), (B), (__FILE__), (__LINE__))
        !           235: 
        !           236: #define chk_multi_add_handle(A, B, Y, Z) do { \
        !           237:   exe_multi_add_handle((A), (B), (Y), (Z));   \
        !           238:   if(res)                                     \
        !           239:     goto test_cleanup;                        \
        !           240: } while(0)
        !           241: 
        !           242: #define multi_add_handle(A, B) \
        !           243:   chk_multi_add_handle((A), (B), (__FILE__), (__LINE__))
        !           244: 
        !           245: /* ---------------------------------------------------------------- */
        !           246: 
        !           247: #define exe_multi_remove_handle(A,B,Y,Z) do {                   \
        !           248:   CURLMcode ec;                                                 \
        !           249:   if((ec = curl_multi_remove_handle((A), (B))) != CURLM_OK) {   \
        !           250:     fprintf(stderr, "%s:%d curl_multi_remove_handle() failed, " \
        !           251:             "with code %d (%s)\n",                              \
        !           252:             (Y), (Z), (int)ec, curl_multi_strerror(ec));        \
        !           253:     res = (int)ec;                                              \
        !           254:   }                                                             \
        !           255: } while(0)
        !           256: 
        !           257: #define res_multi_remove_handle(A, B) \
        !           258:   exe_multi_remove_handle((A), (B), (__FILE__), (__LINE__))
        !           259: 
        !           260: #define chk_multi_remove_handle(A, B, Y, Z) do { \
        !           261:   exe_multi_remove_handle((A), (B), (Y), (Z));   \
        !           262:   if(res)                                        \
        !           263:     goto test_cleanup;                           \
        !           264: } while(0)
        !           265: 
        !           266: 
        !           267: #define multi_remove_handle(A, B) \
        !           268:   chk_multi_remove_handle((A), (B), (__FILE__), (__LINE__))
        !           269: 
        !           270: /* ---------------------------------------------------------------- */
        !           271: 
        !           272: #define exe_multi_perform(A,B,Y,Z) do {                          \
        !           273:   CURLMcode ec;                                                  \
        !           274:   if((ec = curl_multi_perform((A), (B))) != CURLM_OK) {          \
        !           275:     fprintf(stderr, "%s:%d curl_multi_perform() failed, "        \
        !           276:             "with code %d (%s)\n",                               \
        !           277:             (Y), (Z), (int)ec, curl_multi_strerror(ec));         \
        !           278:     res = (int)ec;                                               \
        !           279:   }                                                              \
        !           280:   else if(*((B)) < 0) {                                          \
        !           281:     fprintf(stderr, "%s:%d curl_multi_perform() succeeded, "     \
        !           282:             "but returned invalid running_handles value (%d)\n", \
        !           283:             (Y), (Z), (int)*((B)));                              \
        !           284:     res = TEST_ERR_NUM_HANDLES;                                  \
        !           285:   }                                                              \
        !           286: } while(0)
        !           287: 
        !           288: #define res_multi_perform(A, B) \
        !           289:   exe_multi_perform((A), (B), (__FILE__), (__LINE__))
        !           290: 
        !           291: #define chk_multi_perform(A, B, Y, Z) do { \
        !           292:   exe_multi_perform((A), (B), (Y), (Z));   \
        !           293:   if(res)                                  \
        !           294:     goto test_cleanup;                     \
        !           295: } while(0)
        !           296: 
        !           297: #define multi_perform(A,B) \
        !           298:   chk_multi_perform((A), (B), (__FILE__), (__LINE__))
        !           299: 
        !           300: /* ---------------------------------------------------------------- */
        !           301: 
        !           302: #define exe_multi_fdset(A, B, C, D, E, Y, Z) do {                    \
        !           303:   CURLMcode ec;                                                      \
        !           304:   if((ec = curl_multi_fdset((A), (B), (C), (D), (E))) != CURLM_OK) { \
        !           305:     fprintf(stderr, "%s:%d curl_multi_fdset() failed, "              \
        !           306:             "with code %d (%s)\n",                                   \
        !           307:             (Y), (Z), (int)ec, curl_multi_strerror(ec));             \
        !           308:     res = (int)ec;                                                   \
        !           309:   }                                                                  \
        !           310:   else if(*((E)) < -1) {                                             \
        !           311:     fprintf(stderr, "%s:%d curl_multi_fdset() succeeded, "           \
        !           312:             "but returned invalid max_fd value (%d)\n",              \
        !           313:             (Y), (Z), (int)*((E)));                                  \
        !           314:     res = TEST_ERR_NUM_HANDLES;                                      \
        !           315:   }                                                                  \
        !           316: } while(0)
        !           317: 
        !           318: #define res_multi_fdset(A, B, C, D, E) \
        !           319:   exe_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           320: 
        !           321: #define chk_multi_fdset(A, B, C, D, E, Y, Z) do {       \
        !           322:     exe_multi_fdset((A), (B), (C), (D), (E), (Y), (Z)); \
        !           323:     if(res)                                             \
        !           324:       goto test_cleanup;                                \
        !           325:   } while(0)
        !           326: 
        !           327: #define multi_fdset(A, B, C, D, E) \
        !           328:   chk_multi_fdset((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           329: 
        !           330: /* ---------------------------------------------------------------- */
        !           331: 
        !           332: #define exe_multi_timeout(A,B,Y,Z) do {                      \
        !           333:   CURLMcode ec;                                              \
        !           334:   if((ec = curl_multi_timeout((A), (B))) != CURLM_OK) {      \
        !           335:     fprintf(stderr, "%s:%d curl_multi_timeout() failed, "    \
        !           336:             "with code %d (%s)\n",                           \
        !           337:             (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
        !           338:     res = (int)ec;                                           \
        !           339:   }                                                          \
        !           340:   else if(*((B)) < -1L) {                                    \
        !           341:     fprintf(stderr, "%s:%d curl_multi_timeout() succeeded, " \
        !           342:             "but returned invalid timeout value (%ld)\n",    \
        !           343:             (Y), (Z), (long)*((B)));                         \
        !           344:     res = TEST_ERR_BAD_TIMEOUT;                              \
        !           345:   }                                                          \
        !           346: } while(0)
        !           347: 
        !           348: #define res_multi_timeout(A, B) \
        !           349:   exe_multi_timeout((A), (B), (__FILE__), (__LINE__))
        !           350: 
        !           351: #define chk_multi_timeout(A, B, Y, Z) do { \
        !           352:     exe_multi_timeout((A), (B), (Y), (Z)); \
        !           353:     if(res)                                \
        !           354:       goto test_cleanup;                   \
        !           355:   } while(0)
        !           356: 
        !           357: #define multi_timeout(A, B) \
        !           358:   chk_multi_timeout((A), (B), (__FILE__), (__LINE__))
        !           359: 
        !           360: /* ---------------------------------------------------------------- */
        !           361: 
        !           362: #define exe_multi_poll(A,B,C,D,E,Y,Z) do {                          \
        !           363:   CURLMcode ec;                                                     \
        !           364:   if((ec = curl_multi_poll((A), (B), (C), (D), (E))) != CURLM_OK) { \
        !           365:     fprintf(stderr, "%s:%d curl_multi_poll() failed, "              \
        !           366:             "with code %d (%s)\n",                                  \
        !           367:             (Y), (Z), (int)ec, curl_multi_strerror(ec));            \
        !           368:     res = (int)ec;                                                  \
        !           369:   }                                                                 \
        !           370:   else if(*((E)) < 0) {                                             \
        !           371:     fprintf(stderr, "%s:%d curl_multi_poll() succeeded, "           \
        !           372:             "but returned invalid numfds value (%d)\n",             \
        !           373:             (Y), (Z), (int)*((E)));                                 \
        !           374:     res = TEST_ERR_NUM_HANDLES;                                     \
        !           375:   }                                                                 \
        !           376: } while(0)
        !           377: 
        !           378: #define res_multi_poll(A, B, C, D, E) \
        !           379:   exe_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           380: 
        !           381: #define chk_multi_poll(A, B, C, D, E, Y, Z) do {     \
        !           382:   exe_multi_poll((A), (B), (C), (D), (E), (Y), (Z)); \
        !           383:   if(res)                                            \
        !           384:     goto test_cleanup;                               \
        !           385: } while(0)
        !           386: 
        !           387: #define multi_poll(A, B, C, D, E) \
        !           388:   chk_multi_poll((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           389: 
        !           390: /* ---------------------------------------------------------------- */
        !           391: 
        !           392: #define exe_multi_wakeup(A,Y,Z) do {                     \
        !           393:   CURLMcode ec;                                          \
        !           394:   if((ec = curl_multi_wakeup((A))) != CURLM_OK) {        \
        !           395:     fprintf(stderr, "%s:%d curl_multi_wakeup() failed, " \
        !           396:             "with code %d (%s)\n",                       \
        !           397:             (Y), (Z), (int)ec, curl_multi_strerror(ec)); \
        !           398:     res = (int)ec;                                       \
        !           399:   }                                                      \
        !           400: } while(0)
        !           401: 
        !           402: #define res_multi_wakeup(A) \
        !           403:   exe_multi_wakeup((A), (__FILE__), (__LINE__))
        !           404: 
        !           405: #define chk_multi_wakeup(A, Y, Z) do { \
        !           406:   exe_multi_wakeup((A), (Y), (Z));     \
        !           407:   if(res)                              \
        !           408:     goto test_cleanup;                 \
        !           409: } while(0)
        !           410: 
        !           411: #define multi_wakeup(A) \
        !           412:   chk_multi_wakeup((A), (__FILE__), (__LINE__))
        !           413: 
        !           414: /* ---------------------------------------------------------------- */
        !           415: 
        !           416: #define exe_select_test(A, B, C, D, E, Y, Z) do {               \
        !           417:     int ec;                                                     \
        !           418:     if(select_wrapper((A), (B), (C), (D), (E)) == -1) {         \
        !           419:       ec = SOCKERRNO;                                           \
        !           420:       fprintf(stderr, "%s:%d select() failed, with "            \
        !           421:               "errno %d (%s)\n",                                \
        !           422:               (Y), (Z), ec, strerror(ec));                      \
        !           423:       res = TEST_ERR_SELECT;                                    \
        !           424:     }                                                           \
        !           425:   } while(0)
        !           426: 
        !           427: #define res_select_test(A, B, C, D, E) \
        !           428:   exe_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           429: 
        !           430: #define chk_select_test(A, B, C, D, E, Y, Z) do {       \
        !           431:     exe_select_test((A), (B), (C), (D), (E), (Y), (Z)); \
        !           432:     if(res)                                             \
        !           433:       goto test_cleanup;                                \
        !           434:   } while(0)
        !           435: 
        !           436: #define select_test(A, B, C, D, E) \
        !           437:   chk_select_test((A), (B), (C), (D), (E), (__FILE__), (__LINE__))
        !           438: 
        !           439: /* ---------------------------------------------------------------- */
        !           440: 
        !           441: #define start_test_timing() do { \
        !           442:   tv_test_start = tutil_tvnow(); \
        !           443: } while(0)
        !           444: 
        !           445: #define exe_test_timedout(Y,Z) do {                                    \
        !           446:   if(tutil_tvdiff(tutil_tvnow(), tv_test_start) > TEST_HANG_TIMEOUT) { \
        !           447:     fprintf(stderr, "%s:%d ABORTING TEST, since it seems "             \
        !           448:                     "that it would have run forever.\n", (Y), (Z));    \
        !           449:     res = TEST_ERR_RUNS_FOREVER;                                       \
        !           450:   }                                                                    \
        !           451: } while(0)
        !           452: 
        !           453: #define res_test_timedout() \
        !           454:   exe_test_timedout((__FILE__), (__LINE__))
        !           455: 
        !           456: #define chk_test_timedout(Y, Z) do { \
        !           457:     exe_test_timedout(Y, Z);         \
        !           458:     if(res)                          \
        !           459:       goto test_cleanup;             \
        !           460:   } while(0)
        !           461: 
        !           462: #define abort_on_test_timeout() \
        !           463:   chk_test_timedout((__FILE__), (__LINE__))
        !           464: 
        !           465: /* ---------------------------------------------------------------- */
        !           466: 
        !           467: #define exe_global_init(A,Y,Z) do {                     \
        !           468:   CURLcode ec;                                          \
        !           469:   if((ec = curl_global_init((A))) != CURLE_OK) {        \
        !           470:     fprintf(stderr, "%s:%d curl_global_init() failed, " \
        !           471:             "with code %d (%s)\n",                      \
        !           472:             (Y), (Z), (int)ec, curl_easy_strerror(ec)); \
        !           473:     res = (int)ec;                                      \
        !           474:   }                                                     \
        !           475: } while(0)
        !           476: 
        !           477: #define res_global_init(A) \
        !           478:   exe_global_init((A), (__FILE__), (__LINE__))
        !           479: 
        !           480: #define chk_global_init(A, Y, Z) do { \
        !           481:     exe_global_init((A), (Y), (Z));   \
        !           482:     if(res)                           \
        !           483:       return res;                     \
        !           484:   } while(0)
        !           485: 
        !           486: /* global_init() is different than other macros. In case of
        !           487:    failure it 'return's instead of going to 'test_cleanup'. */
        !           488: 
        !           489: #define global_init(A) \
        !           490:   chk_global_init((A), (__FILE__), (__LINE__))
        !           491: 
        !           492: /* ---------------------------------------------------------------- */

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