summaryrefslogtreecommitdiffstats
path: root/crypto/bio/bio_cb.c
blob: 8e4f79ea3cd7a854839280466d7b8fd612a0801a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#define OPENSSL_SUPPRESS_DEPRECATED

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "bio_local.h"
#include "internal/cryptlib.h"
#include <openssl/err.h>

long BIO_debug_callback_ex(BIO *bio, int cmd, const char *argp, size_t len,
                           int argi, long argl, int ret, size_t *processed)
{
    BIO *b;
    char buf[256];
    char *p;
    int left;
    size_t l = 0;
    BIO_MMSG_CB_ARGS *args;
    long ret_ = ret;

    if (processed != NULL)
        l = *processed;

    left = BIO_snprintf(buf, sizeof(buf), "BIO[%p]: ", (void *)bio);

    /* Ignore errors and continue printing the other information. */
    if (left < 0)
        left = 0;
    p = buf + left;
    left = sizeof(buf) - left;

    switch (cmd) {
    case BIO_CB_FREE:
        BIO_snprintf(p, left, "Free - %s\n", bio->method->name);
        break;
    case BIO_CB_READ:
        if (bio->method->type & BIO_TYPE_DESCRIPTOR)
            BIO_snprintf(p, left, "read(%d,%zu) - %s fd=%d\n",
                         bio->num, len,
                         bio->method->name, bio->num);
        else
            BIO_snprintf(p, left, "read(%d,%zu) - %s\n",
                    bio->num, len, bio->method->name);
        break;
    case BIO_CB_WRITE:
        if (bio->method->type & BIO_TYPE_DESCRIPTOR)
            BIO_snprintf(p, left, "write(%d,%zu) - %s fd=%d\n",
                         bio->num, len,
                         bio->method->name, bio->num);
        else
            BIO_snprintf(p, left, "write(%d,%zu) - %s\n",
                         bio->num, len, bio->method->name);
        break;
    case BIO_CB_PUTS:
        BIO_snprintf(p, left, "puts() - %s\n", bio->method->name);
        break;
    case BIO_CB_GETS:
        BIO_snprintf(p, left, "gets(%zu) - %s\n", len,
                     bio->method->name);
        break;
    case BIO_CB_CTRL:
        BIO_snprintf(p, left, "ctrl(%d) - %s\n", argi,
                     bio->method->name);
        break;
    case BIO_CB_RECVMMSG:
        args = (BIO_MMSG_CB_ARGS *)argp;
        BIO_snprintf(p, left, "recvmmsg(%zu) - %s",
                     args->num_msg, bio->method->name);
        break;
    case BIO_CB_SENDMMSG:
        args = (BIO_MMSG_CB_ARGS *)argp;
        BIO_snprintf(p, left, "sendmmsg(%zu) - %s",
                     args->num_msg, bio->method->name);
        break;
    case BIO_CB_RETURN | BIO_CB_READ:
        BIO_snprintf(p, left, "read return %d processed: %zu\n", ret, l);
        break;
    case BIO_CB_RETURN | BIO_CB_WRITE:
        BIO_snprintf(p, left, "write return %d processed: %zu\n", ret, l);
        break;
    case BIO_CB_RETURN | BIO_CB_GETS:
        BIO_snprintf(p, left, "gets return %d processed: %zu\n", ret, l);
        break;
    case BIO_CB_RETURN | BIO_CB_PUTS:
        BIO_snprintf(p, left, "puts return %d processed: %zu\n", ret, l);
        break;
    case BIO_CB_RETURN | BIO_CB_CTRL:
        BIO_snprintf(p, left, "ctrl return %d\n", ret);
        break;
    case BIO_CB_RETURN | BIO_CB_RECVMMSG:
        BIO_snprintf(p, left, "recvmmsg processed: %zu\n", len);
        ret_ = (long)len;
        break;
    case BIO_CB_RETURN | BIO_CB_SENDMMSG:
        BIO_snprintf(p, left, "sendmmsg processed: %zu\n", len);
        ret_ = (long)len;
        break;
    default:
        BIO_snprintf(p, left, "bio callback - unknown type (%d)\n", cmd);
        break;
    }

    b = (BIO *)bio->cb_arg;
    if (b != NULL)
        BIO_write(b, buf, strlen(buf));
#if !defined(OPENSSL_NO_STDIO)
    else
        fputs(buf, stderr);
#endif
    return ret_;
}

#ifndef OPENSSL_NO_DEPRECATED_3_0
long BIO_debug_callback(BIO *bio, int cmd, const char *argp,
                        int argi, long argl, long ret)
{
    size_t processed = 0;

    if (ret > 0)
        processed = (size_t)ret;
    BIO_debug_callback_ex(bio, cmd, argp, (size_t)argi,
                          argi, argl, ret > 0 ? 1 : (int)ret, &processed);
    return ret;
}
#endif