---
name: "bson_reserve_buffer"
section: "3"
platform: "linux"
package: "libbson-doc"
version: "1.30.4-1+deb13u3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/bson_reserve_buffer"
---

# bson\_reserve\_buffer(3)

## SYNOPSIS

```
uint8_t *
bson_reserve_buffer (bson_t *bson, uint32_t total_size);
```

## PARAMETERS

- •

  **bson**: An initialized *bson\_t*.

- •

  **total\_size**: The length in bytes of the new buffer.

## DESCRIPTION

Grow the internal buffer of **bson** to **total\_size** and set the document length to **total\_size**. Useful for eliminating copies when reading BSON bytes from a stream.

First, initialize **bson** with *bson\_init()* or *bson\_new()*, then call this function. After it returns, the length of **bson** is set to **total\_size** but its contents are uninitialized memory: you must fill the contents with a BSON document of the correct length before any other operations.

The document must be freed with *bson\_destroy()*.

Note that, in this usage, the BSON header and footer bytes will not be verified or used by Libbson. The **bson\_t** document length and buffer size limit are both set to **total\_size** regardless of the value encoded in the document header.

## RETURNS

A pointer to the internal buffer, which is at least **total\_size** bytes, or NULL if the space could not be allocated.

## EXAMPLE

Use **bson\_reserve\_buffer** to write a function that takes a *bson\_t* pointer and reads a file into it directly:

```
#include <stdio.h>
#include <bson/bson.h>
bool
read_into (bson_t *bson, FILE *fp)
{
   uint8_t *buffer;
   long size;
   if (fseek (fp, 0L, SEEK_END) < 0) {
      perror ("Couldn't get file size");
      return 1;
   }
   size = ftell (fp);
   if (size == EOF) {
      perror ("Couldn't get file size");
      return 1;
   }
   if (size > INT32_MAX) {
      fprintf (stderr, "File too large\n");
      return 1;
   }
   /* reserve buffer space - bson is temporarily invalid */
   buffer = bson_reserve_buffer (bson, (uint32_t) size);
   if (!buffer) {
      fprintf (stderr, "Couldn't reserve %ld bytes", size);
      return false;
   }
   /* read file directly into the buffer */
   rewind (fp);
   if (fread ((void *) buffer, 1, (size_t) size, fp) < (size_t) size) {
      perror ("Couldn't read file");
      return false;
   }
   return true;
}
int
main ()
{
   FILE *fp;
   char *json;
   /* stack-allocated, initialized bson_t */
   bson_t bson = BSON_INITIALIZER;
   if (!(fp = fopen ("document.bson", "rb"))) {
      perror ("Couldn't read file");
      return 1;
   }
   read_into (&bson, fp);
   fclose (fp);
   json = bson_as_canonical_extended_json (&bson, NULL);
   printf ("%s\n", json);
   bson_free (json);
   bson_destroy (&bson);
   return 0;
}
```

## AUTHOR

MongoDB, Inc

## COPYRIGHT

2009-present, MongoDB, Inc.
