1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#define OPENSSL_SUPPRESS_DEPRECATED 11e1051a39Sopenharmony_ci 12e1051a39Sopenharmony_ci#include <stdio.h> 13e1051a39Sopenharmony_ci#include <string.h> 14e1051a39Sopenharmony_ci#include <stdlib.h> 15e1051a39Sopenharmony_ci#include "bio_local.h" 16e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 17e1051a39Sopenharmony_ci#include <openssl/err.h> 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_cilong BIO_debug_callback_ex(BIO *bio, int cmd, const char *argp, size_t len, 20e1051a39Sopenharmony_ci int argi, long argl, int ret, size_t *processed) 21e1051a39Sopenharmony_ci{ 22e1051a39Sopenharmony_ci BIO *b; 23e1051a39Sopenharmony_ci char buf[256]; 24e1051a39Sopenharmony_ci char *p; 25e1051a39Sopenharmony_ci int left; 26e1051a39Sopenharmony_ci size_t l = 0; 27e1051a39Sopenharmony_ci 28e1051a39Sopenharmony_ci if (processed != NULL) 29e1051a39Sopenharmony_ci l = *processed; 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci left = BIO_snprintf(buf, sizeof(buf), "BIO[%p]: ", (void *)bio); 32e1051a39Sopenharmony_ci 33e1051a39Sopenharmony_ci /* Ignore errors and continue printing the other information. */ 34e1051a39Sopenharmony_ci if (left < 0) 35e1051a39Sopenharmony_ci left = 0; 36e1051a39Sopenharmony_ci p = buf + left; 37e1051a39Sopenharmony_ci left = sizeof(buf) - left; 38e1051a39Sopenharmony_ci 39e1051a39Sopenharmony_ci switch (cmd) { 40e1051a39Sopenharmony_ci case BIO_CB_FREE: 41e1051a39Sopenharmony_ci BIO_snprintf(p, left, "Free - %s\n", bio->method->name); 42e1051a39Sopenharmony_ci break; 43e1051a39Sopenharmony_ci case BIO_CB_READ: 44e1051a39Sopenharmony_ci if (bio->method->type & BIO_TYPE_DESCRIPTOR) 45e1051a39Sopenharmony_ci BIO_snprintf(p, left, "read(%d,%zu) - %s fd=%d\n", 46e1051a39Sopenharmony_ci bio->num, len, 47e1051a39Sopenharmony_ci bio->method->name, bio->num); 48e1051a39Sopenharmony_ci else 49e1051a39Sopenharmony_ci BIO_snprintf(p, left, "read(%d,%zu) - %s\n", 50e1051a39Sopenharmony_ci bio->num, len, bio->method->name); 51e1051a39Sopenharmony_ci break; 52e1051a39Sopenharmony_ci case BIO_CB_WRITE: 53e1051a39Sopenharmony_ci if (bio->method->type & BIO_TYPE_DESCRIPTOR) 54e1051a39Sopenharmony_ci BIO_snprintf(p, left, "write(%d,%zu) - %s fd=%d\n", 55e1051a39Sopenharmony_ci bio->num, len, 56e1051a39Sopenharmony_ci bio->method->name, bio->num); 57e1051a39Sopenharmony_ci else 58e1051a39Sopenharmony_ci BIO_snprintf(p, left, "write(%d,%zu) - %s\n", 59e1051a39Sopenharmony_ci bio->num, len, bio->method->name); 60e1051a39Sopenharmony_ci break; 61e1051a39Sopenharmony_ci case BIO_CB_PUTS: 62e1051a39Sopenharmony_ci BIO_snprintf(p, left, "puts() - %s\n", bio->method->name); 63e1051a39Sopenharmony_ci break; 64e1051a39Sopenharmony_ci case BIO_CB_GETS: 65e1051a39Sopenharmony_ci BIO_snprintf(p, left, "gets(%zu) - %s\n", len, 66e1051a39Sopenharmony_ci bio->method->name); 67e1051a39Sopenharmony_ci break; 68e1051a39Sopenharmony_ci case BIO_CB_CTRL: 69e1051a39Sopenharmony_ci BIO_snprintf(p, left, "ctrl(%d) - %s\n", argi, 70e1051a39Sopenharmony_ci bio->method->name); 71e1051a39Sopenharmony_ci break; 72e1051a39Sopenharmony_ci case BIO_CB_RETURN | BIO_CB_READ: 73e1051a39Sopenharmony_ci BIO_snprintf(p, left, "read return %d processed: %zu\n", ret, l); 74e1051a39Sopenharmony_ci break; 75e1051a39Sopenharmony_ci case BIO_CB_RETURN | BIO_CB_WRITE: 76e1051a39Sopenharmony_ci BIO_snprintf(p, left, "write return %d processed: %zu\n", ret, l); 77e1051a39Sopenharmony_ci break; 78e1051a39Sopenharmony_ci case BIO_CB_RETURN | BIO_CB_GETS: 79e1051a39Sopenharmony_ci BIO_snprintf(p, left, "gets return %d processed: %zu\n", ret, l); 80e1051a39Sopenharmony_ci break; 81e1051a39Sopenharmony_ci case BIO_CB_RETURN | BIO_CB_PUTS: 82e1051a39Sopenharmony_ci BIO_snprintf(p, left, "puts return %d processed: %zu\n", ret, l); 83e1051a39Sopenharmony_ci break; 84e1051a39Sopenharmony_ci case BIO_CB_RETURN | BIO_CB_CTRL: 85e1051a39Sopenharmony_ci BIO_snprintf(p, left, "ctrl return %d\n", ret); 86e1051a39Sopenharmony_ci break; 87e1051a39Sopenharmony_ci default: 88e1051a39Sopenharmony_ci BIO_snprintf(p, left, "bio callback - unknown type (%d)\n", cmd); 89e1051a39Sopenharmony_ci break; 90e1051a39Sopenharmony_ci } 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_ci b = (BIO *)bio->cb_arg; 93e1051a39Sopenharmony_ci if (b != NULL) 94e1051a39Sopenharmony_ci BIO_write(b, buf, strlen(buf)); 95e1051a39Sopenharmony_ci#if !defined(OPENSSL_NO_STDIO) 96e1051a39Sopenharmony_ci else 97e1051a39Sopenharmony_ci fputs(buf, stderr); 98e1051a39Sopenharmony_ci#endif 99e1051a39Sopenharmony_ci return ret; 100e1051a39Sopenharmony_ci} 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 103e1051a39Sopenharmony_cilong BIO_debug_callback(BIO *bio, int cmd, const char *argp, 104e1051a39Sopenharmony_ci int argi, long argl, long ret) 105e1051a39Sopenharmony_ci{ 106e1051a39Sopenharmony_ci size_t processed = 0; 107e1051a39Sopenharmony_ci 108e1051a39Sopenharmony_ci if (ret > 0) 109e1051a39Sopenharmony_ci processed = (size_t)ret; 110e1051a39Sopenharmony_ci BIO_debug_callback_ex(bio, cmd, argp, (size_t)argi, 111e1051a39Sopenharmony_ci argi, argl, ret > 0 ? 1 : (int)ret, &processed); 112e1051a39Sopenharmony_ci return ret; 113e1051a39Sopenharmony_ci} 114e1051a39Sopenharmony_ci#endif 115