Provided by: libbson-doc_1.15.0-1_all bug


       bson_reserve_buffer - bson_reserve_buffer()


          uint8_t *
          bson_reserve_buffer (bson_t *bson, uint32_t size);


       · bson: An initialized bson_t.

       · size: The length in bytes of the new buffer.


       Grow  the  internal buffer of bson to size and set the document length to 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 size but its contents are uninitialized memory: you
       must fill the contents with a BSON  document  of  the  correct  length  before  any  other

       The document must be freed with bson_destroy.


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


       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>

          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;

          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;


       MongoDB, Inc


       2017-present, MongoDB, Inc