- const char *file = NULL;
- int line;
- const char *func = NULL;
- const char *data = NULL;
- int flags;
- unsigned long err = ERR_peek_last_error();
-
- if (separator == NULL)
- separator = "";
- if (err == 0)
- put_error(ERR_LIB_CMP, NULL, 0, "", 0);
-
- do {
- size_t available_len, data_len;
- const char *curr = txt, *next = txt;
- char *tmp;
-
- ERR_peek_last_error_all(&file, &line, &func, &data, &flags);
- if ((flags & ERR_TXT_STRING) == 0) {
- data = "";
- separator = "";
- }
- data_len = strlen(data);
-
- /* workaround for limit of ERR_print_errors_cb() */
- if (data_len >= MAX_DATA_LEN
- || strlen(separator) >= (size_t)(MAX_DATA_LEN - data_len))
- available_len = 0;
- else
- available_len = MAX_DATA_LEN - data_len - strlen(separator) - 1;
- /* MAX_DATA_LEN > available_len >= 0 */
-
- if (separator[0] == '\0') {
- const size_t len_next = strlen(next);
-
- if (len_next <= available_len) {
- next += len_next;
- curr = NULL; /* no need to split */
- }
- else {
- next += available_len;
- curr = next; /* will split at this point */
- }
- } else {
- while (*next != '\0' && (size_t)(next - txt) <= available_len) {
- curr = next;
- next = strstr(curr, separator);
- if (next != NULL)
- next += strlen(separator);
- else
- next = curr + strlen(curr);
- }
- if ((size_t)(next - txt) <= available_len)
- curr = NULL; /* the above loop implies *next == '\0' */
- }
- if (curr != NULL) {
- /* split error msg at curr since error data would get too long */
- if (curr != txt) {
- tmp = OPENSSL_strndup(txt, curr - txt);
- if (tmp == NULL)
- return;
- ERR_add_error_data(2, separator, tmp);
- OPENSSL_free(tmp);
- }
- put_error(ERR_LIB_CMP, func, err, file, line);
- txt = curr;
- } else {
- ERR_add_error_data(2, separator, txt);
- txt = next; /* finished */
- }
- } while (*txt != '\0');
+ const char *level_string =
+ level == OSSL_CMP_LOG_EMERG ? "EMERG" :
+ level == OSSL_CMP_LOG_ALERT ? "ALERT" :
+ level == OSSL_CMP_LOG_CRIT ? "CRIT" :
+ level == OSSL_CMP_LOG_ERR ? "error" :
+ level == OSSL_CMP_LOG_WARNING ? "warning" :
+ level == OSSL_CMP_LOG_NOTICE ? "NOTE" :
+ level == OSSL_CMP_LOG_INFO ? "info" :
+ level == OSSL_CMP_LOG_DEBUG ? "DEBUG" : "(unknown level)";
+
+#ifndef NDEBUG
+ if (BIO_printf(bio, "%s:%s:%d:", improve_location_name(component, "CMP"),
+ file, line) < 0)
+ return 0;
+#endif
+ return BIO_printf(bio, OSSL_CMP_LOG_PREFIX"%s: %s\n",
+ level_string, msg) >= 0;