]>
Commit | Line | Data |
---|---|---|
b1322259 | 1 | /* |
fecb3aae | 2 | * Copyright 2005-2022 The OpenSSL Project Authors. All Rights Reserved. |
b1322259 | 3 | * |
09abbca1 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
b1322259 RS |
5 | * this file except in compliance with the License. You can obtain a copy |
6 | * in the file LICENSE in the source distribution or at | |
7 | * https://www.openssl.org/source/license.html | |
8 | */ | |
9 | ||
d5f9166b | 10 | #include "internal/e_os.h" |
0e97f1e1 | 11 | #include "internal/sockets.h" |
28a0841b RL |
12 | |
13 | /* BEGIN BIO_ADDRINFO/BIO_ADDR stuff. */ | |
14 | ||
15 | #ifndef OPENSSL_NO_SOCK | |
16 | /* | |
17 | * Throughout this file and b_addr.c, the existence of the macro | |
18 | * AI_PASSIVE is used to detect the availability of struct addrinfo, | |
19 | * getnameinfo() and getaddrinfo(). If that macro doesn't exist, | |
20 | * we use our own implementation instead. | |
21 | */ | |
22 | ||
23 | /* | |
24 | * It's imperative that these macros get defined before openssl/bio.h gets | |
25 | * included. Otherwise, the AI_PASSIVE hack will not work properly. | |
26 | * For clarity, we check for internal/cryptlib.h since it's a common header | |
27 | * that also includes bio.h. | |
28 | */ | |
ae4186b0 | 29 | # ifdef OSSL_INTERNAL_CRYPTLIB_H |
706457b7 | 30 | # error internal/cryptlib.h included before bio_local.h |
28a0841b | 31 | # endif |
ae4186b0 | 32 | # ifdef OPENSSL_BIO_H |
706457b7 | 33 | # error openssl/bio.h included before bio_local.h |
28a0841b RL |
34 | # endif |
35 | ||
28a0841b | 36 | # ifdef AI_PASSIVE |
fcd9c8c0 RL |
37 | |
38 | /* | |
39 | * There's a bug in VMS C header file netdb.h, where struct addrinfo | |
40 | * always is the P32 variant, but the functions that handle that structure, | |
41 | * such as getaddrinfo() and freeaddrinfo() adapt to the initial pointer | |
42 | * size. The easiest workaround is to force struct addrinfo to be the | |
43 | * 64-bit variant when compiling in P64 mode. | |
44 | */ | |
45 | # if defined(OPENSSL_SYS_VMS) && __INITIAL_POINTER_SIZE == 64 | |
46 | # define addrinfo __addrinfo64 | |
47 | # endif | |
48 | ||
28a0841b RL |
49 | # define bio_addrinfo_st addrinfo |
50 | # define bai_family ai_family | |
51 | # define bai_socktype ai_socktype | |
52 | # define bai_protocol ai_protocol | |
53 | # define bai_addrlen ai_addrlen | |
54 | # define bai_addr ai_addr | |
55 | # define bai_next ai_next | |
56 | # else | |
57 | struct bio_addrinfo_st { | |
58 | int bai_family; | |
59 | int bai_socktype; | |
60 | int bai_protocol; | |
61 | size_t bai_addrlen; | |
62 | struct sockaddr *bai_addr; | |
63 | struct bio_addrinfo_st *bai_next; | |
64 | }; | |
65 | # endif | |
66 | ||
67 | union bio_addr_st { | |
68 | struct sockaddr sa; | |
836bb089 | 69 | # if OPENSSL_USE_IPV6 |
29620124 | 70 | struct sockaddr_in6 s_in6; |
28a0841b | 71 | # endif |
29620124 | 72 | struct sockaddr_in s_in; |
081f3484 | 73 | # ifndef OPENSSL_NO_UNIX_SOCK |
29620124 | 74 | struct sockaddr_un s_un; |
28a0841b RL |
75 | # endif |
76 | }; | |
77 | #endif | |
78 | ||
79 | /* END BIO_ADDRINFO/BIO_ADDR stuff. */ | |
80 | ||
81 | #include "internal/cryptlib.h" | |
176db6dc | 82 | #include "internal/bio.h" |
a935791d | 83 | #include "internal/refcount.h" |
a146ae55 MC |
84 | |
85 | typedef struct bio_f_buffer_ctx_struct { | |
86 | /*- | |
87 | * Buffers are setup like this: | |
88 | * | |
89 | * <---------------------- size -----------------------> | |
90 | * +---------------------------------------------------+ | |
91 | * | consumed | remaining | free space | | |
92 | * +---------------------------------------------------+ | |
93 | * <-- off --><------- len -------> | |
94 | */ | |
95 | /*- BIO *bio; *//* | |
96 | * this is now in the BIO struct | |
97 | */ | |
98 | int ibuf_size; /* how big is the input buffer */ | |
99 | int obuf_size; /* how big is the output buffer */ | |
100 | char *ibuf; /* the char array */ | |
101 | int ibuf_len; /* how many bytes are in it */ | |
102 | int ibuf_off; /* write/read offset */ | |
103 | char *obuf; /* the char array */ | |
104 | int obuf_len; /* how many bytes are in it */ | |
105 | int obuf_off; /* write/read offset */ | |
106 | } BIO_F_BUFFER_CTX; | |
107 | ||
108 | struct bio_st { | |
b0ee1de9 | 109 | OSSL_LIB_CTX *libctx; |
a146ae55 MC |
110 | const BIO_METHOD *method; |
111 | /* bio, mode, argp, argi, argl, ret */ | |
0800318a | 112 | #ifndef OPENSSL_NO_DEPRECATED_3_0 |
d07aee2c | 113 | BIO_callback_fn callback; |
0800318a | 114 | #endif |
d07aee2c | 115 | BIO_callback_fn_ex callback_ex; |
a146ae55 MC |
116 | char *cb_arg; /* first argument for the callback */ |
117 | int init; | |
118 | int shutdown; | |
119 | int flags; /* extra storage */ | |
120 | int retry_reason; | |
121 | int num; | |
122 | void *ptr; | |
123 | struct bio_st *next_bio; /* used by filter BIOs */ | |
124 | struct bio_st *prev_bio; /* used by filter BIOs */ | |
2f545ae4 | 125 | CRYPTO_REF_COUNT references; |
a146ae55 MC |
126 | uint64_t num_read; |
127 | uint64_t num_write; | |
128 | CRYPTO_EX_DATA ex_data; | |
129 | CRYPTO_RWLOCK *lock; | |
130 | }; | |
ea1b02db | 131 | |
28a0841b | 132 | #ifndef OPENSSL_NO_SOCK |
424d5db2 RL |
133 | # ifdef OPENSSL_SYS_VMS |
134 | typedef unsigned int socklen_t; | |
135 | # endif | |
136 | ||
ff234405 MC |
137 | extern CRYPTO_RWLOCK *bio_lookup_lock; |
138 | ||
28a0841b RL |
139 | int BIO_ADDR_make(BIO_ADDR *ap, const struct sockaddr *sa); |
140 | const struct sockaddr *BIO_ADDR_sockaddr(const BIO_ADDR *ap); | |
141 | struct sockaddr *BIO_ADDR_sockaddr_noconst(BIO_ADDR *ap); | |
142 | socklen_t BIO_ADDR_sockaddr_size(const BIO_ADDR *ap); | |
143 | socklen_t BIO_ADDRINFO_sockaddr_size(const BIO_ADDRINFO *bai); | |
144 | const struct sockaddr *BIO_ADDRINFO_sockaddr(const BIO_ADDRINFO *bai); | |
664e096c HL |
145 | |
146 | # if defined(OPENSSL_SYS_WINDOWS) && defined(WSAID_WSARECVMSG) | |
147 | # define BIO_HAVE_WSAMSG | |
148 | extern LPFN_WSARECVMSG bio_WSARecvMsg; | |
149 | extern LPFN_WSASENDMSG bio_WSASendMsg; | |
150 | # endif | |
28a0841b RL |
151 | #endif |
152 | ||
44cb4f5b MC |
153 | extern CRYPTO_RWLOCK *bio_type_lock; |
154 | ||
ff234405 MC |
155 | void bio_sock_cleanup_int(void); |
156 | ||
b1132792 | 157 | #if BIO_FLAGS_UPLINK_INTERNAL==0 |
ea1b02db | 158 | /* Shortcut UPLINK calls on most platforms... */ |
0f113f3e MC |
159 | # define UP_stdin stdin |
160 | # define UP_stdout stdout | |
161 | # define UP_stderr stderr | |
162 | # define UP_fprintf fprintf | |
163 | # define UP_fgets fgets | |
164 | # define UP_fread fread | |
165 | # define UP_fwrite fwrite | |
166 | # undef UP_fsetmod | |
167 | # define UP_feof feof | |
168 | # define UP_fclose fclose | |
ea1b02db | 169 | |
0f113f3e MC |
170 | # define UP_fopen fopen |
171 | # define UP_fseek fseek | |
172 | # define UP_ftell ftell | |
173 | # define UP_fflush fflush | |
174 | # define UP_ferror ferror | |
175 | # ifdef _WIN32 | |
176 | # define UP_fileno _fileno | |
177 | # define UP_open _open | |
178 | # define UP_read _read | |
179 | # define UP_write _write | |
180 | # define UP_lseek _lseek | |
181 | # define UP_close _close | |
182 | # else | |
183 | # define UP_fileno fileno | |
184 | # define UP_open open | |
185 | # define UP_read read | |
186 | # define UP_write write | |
187 | # define UP_lseek lseek | |
188 | # define UP_close close | |
189 | # endif | |
28a0841b | 190 | |
eed15a83 | 191 | #endif |
28a0841b | 192 |