odyssey/lib/so_read.c

58 lines
1.2 KiB
C
Raw Normal View History

2016-11-09 12:42:29 +00:00
/*
* sonata.
*
* Protocol-level PostgreSQL client library.
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <so_macro.h>
2016-11-09 12:53:44 +00:00
#include <so_stream.h>
2016-11-09 12:42:29 +00:00
#include <so_header.h>
#include <so_read.h>
2016-11-09 13:08:10 +00:00
int so_read_startup(uint32_t *len, uint8_t **data, uint32_t *size)
{
if (*size < sizeof(uint32_t))
return sizeof(uint32_t) - *size;
/* len */
uint32_t pos_size = *size;
uint8_t *pos = *data;
so_stream_read32(len, &pos, &pos_size);
uint32_t len_to_read;
len_to_read = *len - *size;
if (len_to_read > 0)
return len_to_read;
/* advance data stream */
*data += *len;
*size -= *len;
/* set actual data size */
*len -= sizeof(uint32_t);
return 0;
}
2016-11-09 12:42:29 +00:00
int so_read(uint32_t *len, uint8_t **data, uint32_t *size)
{
if (*size < sizeof(soheader_t))
return sizeof(soheader_t) - *size;
uint32_t pos_size = *size - sizeof(uint8_t);
uint8_t *pos = *data + sizeof(uint8_t);
/* type */
2016-11-09 12:53:44 +00:00
so_stream_read32(len, &pos, &pos_size);
2016-11-09 12:42:29 +00:00
uint32_t len_to_read;
len_to_read = (*len + sizeof(uint8_t)) - *size;
if (len_to_read > 0)
return len_to_read;
/* advance data stream */
*data += sizeof(uint8_t) + *len;
*size -= sizeof(uint8_t) + *len;
2016-11-09 13:08:10 +00:00
/* set actual data size */
2016-11-09 12:42:29 +00:00
*len -= sizeof(uint32_t);
return 0;
}