| =pod |
| |
| =head1 NAME |
| |
| BIO_read_ex, BIO_write_ex, BIO_read, BIO_write, |
| BIO_gets, BIO_get_line, BIO_puts |
| - BIO I/O functions |
| |
| =head1 SYNOPSIS |
| |
| #include <openssl/bio.h> |
| |
| int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); |
| int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); |
| |
| int BIO_read(BIO *b, void *data, int dlen); |
| int BIO_gets(BIO *b, char *buf, int size); |
| int BIO_get_line(BIO *b, char *buf, int size); |
| int BIO_write(BIO *b, const void *data, int dlen); |
| int BIO_puts(BIO *b, const char *buf); |
| |
| =head1 DESCRIPTION |
| |
| BIO_read_ex() attempts to read I<dlen> bytes from BIO I<b> and places the data |
| in I<data>. If any bytes were successfully read then the number of bytes read is |
| stored in I<*readbytes>. |
| |
| BIO_write_ex() attempts to write I<dlen> bytes from I<data> to BIO I<b>. |
| If successful then the number of bytes written is stored in I<*written> |
| unless I<written> is NULL. |
| |
| BIO_read() attempts to read I<len> bytes from BIO I<b> and places |
| the data in I<buf>. |
| |
| BIO_gets() performs the BIOs "gets" operation and places the data |
| in I<buf>. Usually this operation will attempt to read a line of data |
| from the BIO of maximum length I<size-1>. There are exceptions to this, |
| however; for example, BIO_gets() on a digest BIO will calculate and |
| return the digest and other BIOs may not support BIO_gets() at all. |
| The returned string is always NUL-terminated and the '\n' is preserved |
| if present in the input data. |
| On binary input there may be NUL characters within the string; |
| in this case the return value (if nonnegative) may give an incorrect length. |
| |
| BIO_get_line() attempts to read from BIO <b> a line of data up to the next '\n' |
| or the maximum length I<size-1> is reached and places the data in I<buf>. |
| The returned string is always NUL-terminated and the '\n' is preserved |
| if present in the input data. |
| On binary input there may be NUL characters within the string; |
| in this case the return value (if nonnegative) gives the actual length read. |
| For implementing this, unfortunately the data needs to be read byte-by-byte. |
| |
| BIO_write() attempts to write I<len> bytes from I<buf> to BIO I<b>. |
| |
| BIO_puts() attempts to write a NUL-terminated string I<buf> to BIO I<b>. |
| |
| =head1 RETURN VALUES |
| |
| BIO_read_ex() returns 1 if data was successfully read, and 0 otherwise. |
| |
| BIO_write_ex() returns 1 if no error was encountered writing data, 0 otherwise. |
| Requesting to write 0 bytes is not considered an error. |
| |
| BIO_write() returns -2 if the "write" operation is not implemented by the BIO |
| or -1 on other errors. |
| Otherwise it returns the number of bytes written. |
| This may be 0 if the BIO I<b> is NULL or I<dlen <= 0>. |
| |
| BIO_gets() returns -2 if the "gets" operation is not implemented by the BIO |
| or -1 on other errors. |
| Otherwise it typically returns the amount of data read, |
| but depending on the implementation it may return only the length up to |
| the first NUL character contained in the data read. |
| In any case the trailing NUL that is added after the data read |
| is not included in the length returned. |
| |
| All other functions return either the amount of data successfully read or |
| written (if the return value is positive) or that no data was successfully |
| read or written if the result is 0 or -1. If the return value is -2 then |
| the operation is not implemented in the specific BIO type. |
| |
| =head1 NOTES |
| |
| A 0 or -1 return is not necessarily an indication of an error. In |
| particular when the source/sink is nonblocking or of a certain type |
| it may merely be an indication that no data is currently available and that |
| the application should retry the operation later. |
| |
| One technique sometimes used with blocking sockets is to use a system call |
| (such as select(), poll() or equivalent) to determine when data is available |
| and then call read() to read the data. The equivalent with BIOs (that is call |
| select() on the underlying I/O structure and then call BIO_read() to |
| read the data) should B<not> be used because a single call to BIO_read() |
| can cause several reads (and writes in the case of SSL BIOs) on the underlying |
| I/O structure and may block as a result. Instead select() (or equivalent) |
| should be combined with non blocking I/O so successive reads will request |
| a retry instead of blocking. |
| |
| See L<BIO_should_retry(3)> for details of how to |
| determine the cause of a retry and other I/O issues. |
| |
| If the "gets" method is not supported by a BIO then BIO_get_line() can be used. |
| It is also possible to make BIO_gets() usable even if the "gets" method is not |
| supported by adding a buffering BIO L<BIO_f_buffer(3)> to the chain. |
| |
| =head1 SEE ALSO |
| |
| L<BIO_should_retry(3)> |
| |
| =head1 HISTORY |
| |
| BIO_gets() on 1.1.0 and older when called on BIO_fd() based BIO did not |
| keep the '\n' at the end of the line in the buffer. |
| |
| BIO_get_line() was added in OpenSSL 3.0. |
| |
| BIO_write_ex() returns 1 if the size of the data to write is 0 and the |
| I<written> parameter of the function can be NULL since OpenSSL 3.0. |
| |
| =head1 COPYRIGHT |
| |
| Copyright 2000-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 |
| L<https://www.openssl.org/source/license.html>. |
| |
| =cut |