static void tst_print(const char *tcid, int tnum, int ttype, const char *tmesg) { int err = errno; const char *type; int ttype_result = TTYPE_RESULT(ttype); char message[USERMESG]; size_t size = 0; /* * Save the test result type by ORing ttype into the current exit value * (used by tst_exit()). This is already done in tst_res(), but is * also done here to catch internal warnings. For internal warnings, * tst_print() is called directly with a case of TWARN. */ T_exitval |= ttype_result; /* * If output mode is DISCARD, or if the output mode is NOPASS and this * result is not one of FAIL, BROK, or WARN, just return. This check * is necessary even though we check for DISCARD mode inside of * tst_res(), since occasionally we get to this point without going * through tst_res() (e.g. internal TWARN messages). */ if (T_mode == DISCARD || (T_mode == NOPASS && ttype_result != TFAIL && ttype_result != TBROK && ttype_result != TWARN)) return; /* * Build the result line and print it. */ type = strttype(ttype); if (T_mode == VERBOSE) { size += snprintf(message + size, sizeof(message) - size, "%-8s %4d ", tcid, tnum); } else { size += snprintf(message + size, sizeof(message) - size, "%-8s %4d ", tcid, tnum); } if (size >= sizeof(message)) { printf("%s: %i: line too long\n", __func__, __LINE__); abort(); } if (tst_color_enabled(STDOUT_FILENO)) size += snprintf(message + size, sizeof(message) - size, "%s%s%s : %s", tst_ttype2color(ttype), type, ANSI_COLOR_RESET, tmesg); else size += snprintf(message + size, sizeof(message) - size, "%s : %s", type, tmesg); if (size >= sizeof(message)) { printf("%s: %i: line too long\n", __func__, __LINE__); abort(); } if (ttype & TERRNO) { size += snprintf(message + size, sizeof(message) - size, ": errno=%s(%i): %s", tst_strerrno(err), err, strerror(err)); } if (size >= sizeof(message)) { printf("%s: %i: line too long\n", __func__, __LINE__); abort(); } if (ttype & TTERRNO) { size += snprintf(message + size, sizeof(message) - size, ": TEST_ERRNO=%s(%i): %s", tst_strerrno(TEST_ERRNO), (int)TEST_ERRNO, strerror(TEST_ERRNO)); } if (size >= sizeof(message)) { printf("%s: %i: line too long\n", __func__, __LINE__); abort(); } if (ttype & TRERRNO) { err = TEST_RETURN < 0 ? -(int)TEST_RETURN : (int)TEST_RETURN; size += snprintf(message + size, sizeof(message) - size, ": TEST_RETURN=%s(%i): %s", tst_strerrno(err), err, strerror(err)); } if (size + 1 >= sizeof(message)) { printf("%s: %i: line too long\n", __func__, __LINE__); abort(); } message[size] = '\n'; message[size + 1] = '\0'; fputs(message, stdout); }
static void print_result(const char *file, const int lineno, int ttype, const char *fmt, va_list va) { char buf[1024]; char *str = buf; int ret, size = sizeof(buf), ssize; const char *str_errno = NULL; const char *res; switch (TTYPE_RESULT(ttype)) { case TPASS: res = "PASS"; break; case TFAIL: res = "FAIL"; break; case TBROK: res = "BROK"; break; case TCONF: res = "CONF"; break; case TWARN: res = "WARN"; break; case TINFO: res = "INFO"; break; default: tst_brk(TBROK, "Invalid ttype value %i", ttype); abort(); } if (ttype & TERRNO) str_errno = tst_strerrno(errno); if (ttype & TTERRNO) str_errno = tst_strerrno(TEST_ERRNO); ret = snprintf(str, size, "%s:%i: ", file, lineno); str += ret; size -= ret; if (tst_color_enabled(STDERR_FILENO)) ret = snprintf(str, size, "%s%s: %s", tst_ttype2color(ttype), res, ANSI_COLOR_RESET); else ret = snprintf(str, size, "%s: ", res); str += ret; size -= ret; ssize = size - 2; ret = vsnprintf(str, size, fmt, va); str += MIN(ret, ssize); size -= MIN(ret, ssize); if (ret >= ssize) { tst_res_(file, lineno, TWARN, "Next message is too long and truncated:"); } else if (str_errno) { ssize = size - 2; ret = snprintf(str, size, ": %s", str_errno); str += MIN(ret, ssize); size -= MIN(ret, ssize); if (ret >= ssize) tst_res_(file, lineno, TWARN, "Next message is too long and truncated:"); } snprintf(str, size, "\n"); fputs(buf, stderr); }