BIO_S_FILE(3ossl)
Okay bestie, so this is the OpenSSL manual page for BIO_S_FILE(3ossl). It's literally the FILE bio, aka the stdio FILE structure but make it BIO. Source/sink energy. We love to see it. π
π NAME π
BIO_s_file, BIO_new_file, BIO_new_fp, BIO_set_fp, BIO_get_fp, BIO_read_filename, BIO_write_filename, BIO_append_filename, BIO_rw_filename β FILE bio. That's the whole squad, no cap. π
β¨ SYNOPSIS β¨
#include <openssl/bio.h>
const BIO_METHOD *BIO_s_file(void);
BIO *BIO_new_file(const char *filename, const char *mode);
BIO *BIO_new_fp(FILE *stream, int flags);
BIO_set_fp(BIO *b, FILE *fp, int flags);
BIO_get_fp(BIO *b, FILE **fpp);
int BIO_read_filename(BIO *b, char *name);
int BIO_write_filename(BIO *b, char *name);
int BIO_append_filename(BIO *b, char *name);
int BIO_rw_filename(BIO *b, char *name);
π DESCRIPTION π
So BIO_s_file() returns the BIO file method. As the name implies (and it's giving exactly what it needs to give), it's a wrapper round the stdio FILE structure and it's a source/sink BIO. Iconic. β¨
Calls to BIO_read_ex() and BIO_write_ex() read and write data to the underlying stream. BIO_gets() and BIO_puts() are also supported on file BIOs. Versatile queen. π
BIO_flush() on a file BIO calls the fflush() function on the wrapped stream.
BIO_reset() attempts to change the file pointer to the start of file using fseek(stream, 0, 0).
BIO_seek() sets the file pointer to position ofs from start of file using fseek(stream, ofs, 0).
BIO_eof() calls feof().
Setting the BIO_CLOSE flag calls fclose() on the stream when the BIO is freed. So like, it closes the door behind you. πͺ
BIO_new_file() creates a new file BIO with mode mode. The meaning of mode is the same as the stdio function fopen(). The BIO_CLOSE flag is set on the returned BIO.
BIO_new_fp() creates a file BIO wrapping stream. Flags can be: BIO_CLOSE, BIO_NOCLOSE (the close flag) and BIO_FP_TEXT (sets the underlying stream to text mode, default is binary: this only has any effect under Win32).
BIO_set_fp() sets the fp of a file BIO to fp. flags has the same meaning as in BIO_new_fp(). It's a macro, bestie.
BIO_get_fp() retrieves the fp of a file BIO. Also a macro. Sneaky but slay. π
BIO_seek() is a macro that sets the position pointer to offset bytes from the start of file. (Yes, it gets mentioned twice in this description β the original manpage said it, I'm just the messenger. π)
BIO_tell() returns the value of the position pointer.
BIO_read_filename(), BIO_write_filename(), BIO_append_filename() and BIO_rw_filename() set the file BIO b to use file name for reading, writing, append or read write respectively. Pick your vibe. π
π¦ NOTES π¦
When wrappingstdout,stdinorstderrthe underlying stream should not normally be closed so theBIO_NOCLOSEflag should be set. Like, don't close the main character's stream, okay? That's rude. π
Because the file BIO calls the underlying stdio functions, any quirks in stdio behaviour will be mirrored by the corresponding BIO. So if stdio is acting sus, the BIO is gonna match that energy. No cap. fr fr.
On Windows BIO_new_files reserves for the filename argument to be UTF-8 encoded. In other words if you have to make it work in multi-lingual environment, encode filenames in UTF-8. (Yes, the manpage literally says BIO_new_files with an "s" β I'm not fixing it, bestie. π)
πΈ RETURN VALUES πΈ
BIO_s_file()returns the file BIO method. Obviously. πBIO_new_file()andBIO_new_fp()return a file BIO orNULLif an error occurred. So if you getNULL, something went wrong and you should probably cry about it (or debug, same thing).BIO_set_fp()andBIO_get_fp()return1for success or<=0for failure (although the current implementation never return0). Noted, bestie.BIO_seek()returns0for success or negative values for failure. Yeah, it's quirky like that.BIO_tell()returns the current file position or negative values for failure.BIO_read_filename(),BIO_write_filename(),BIO_append_filename()andBIO_rw_filename()return1for success or<=0for failure. An error is also returned if the file does not exist. So like, no file, no slay. π«Ά
π EXAMPLES π
File BIO "hello world" β the classic:
BIO *bio_out;
bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);
BIO_printf(bio_out, "Hello World\n");
Alternative technique, because there's always another way to serve:
BIO *bio_out;
bio_out = BIO_new(BIO_s_file());
if (bio_out == NULL)
/* Error */
if (BIO_set_fp(bio_out, stdout, BIO_NOCLOSE) <= 0)
/* Error */
BIO_printf(bio_out, "Hello World\n");
Write to a file β moving on up:
BIO *out;
out = BIO_new_file("filename.txt", "w");
if (!out)
/* Error */
BIO_printf(out, "Hello World\n");
BIO_free(out);
Alternative technique for the file girlies:
BIO *out;
out = BIO_new(BIO_s_file());
if (out == NULL)
/* Error */
if (BIO_write_filename(out, "filename.txt") <= 0)
/* Error */
BIO_printf(out, "Hello World\n");
BIO_free(out);
π BUGS π
BIO_reset() and BIO_seek() are implemented using fseek() on the underlying stream. The return value for fseek() is 0 for success or -1 if an error occurred. This differs from other types of BIO which will typically return 1 for success and a non positive value if an error occurred. So yeah, it's not like the other BIOs. It's got its own thing going on. π€·ββοΈ
π SEE ALSO π
BIO_seek(3), BIO_tell(3), BIO_reset(3), BIO_flush(3), BIO_read_ex(3), BIO_write_ex(3), BIO_puts(3), BIO_gets(3), BIO_printf(3), BIO_set_close(3), BIO_get_close(3). Go read those too, bestie. Stay educated. πβ¨
π§ COPYRIGHT π§
Copyright 2000-2020 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>.
And that's the whole page, bestie. This was BIO_S_FILE(3ossl) from OpenSSL, version 3.5.0, dated 2026-09-25. Stay slay, keep your streams closed (or not, depending on the flag), and remember: stdio quirks are mirrored. Periodt. πβ¨π
π¦ where this page comes from
- opensuse-leap 16.0: openssl-3-doc 3.5.0-160000.11.1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms