diff --git a/lib/so_beread.c b/lib/so_beread.c new file mode 100644 index 00000000..9b0f119a --- /dev/null +++ b/lib/so_beread.c @@ -0,0 +1,47 @@ + +/* + * sonata. + * + * Protocol-level PostgreSQL client library. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +int so_beread_startup(sobestartup_t *su, uint8_t *data, uint32_t size) +{ + uint32_t pos_size = size; + uint8_t *pos = data; + int rc; + uint32_t version; + rc = so_stream_read32(&version, &pos, &pos_size); + if (so_unlikely(rc == -1)) + return -1; + switch (version) { + /* StartupMessage */ + case 196608: + su->is_cancel = 0; + break; + /* CancelRequest */ + case 80877102: { + su->is_cancel = 1; + rc = so_stream_read32(&su->key_pid, &pos, &pos_size); + if (so_unlikely(rc == -1)) + rc = so_stream_read32(&su->key, &pos, &pos_size); + if (so_unlikely(rc == -1)) + return -1; + break; + } + default: + return -1; + } + return 0; +} diff --git a/lib/so_beread.h b/lib/so_beread.h new file mode 100644 index 00000000..e3e6f755 --- /dev/null +++ b/lib/so_beread.h @@ -0,0 +1,20 @@ +#ifndef SO_BEREAD_H_ +#define SO_BEREAD_H_ + +/* + * sonata. + * + * Protocol-level PostgreSQL client library. +*/ + +typedef struct sobestartup_t sobestartup_t; + +struct sobestartup_t { + int is_cancel; + uint32_t key; + uint32_t key_pid; +}; + +int so_beread_startup(sobestartup_t*, uint8_t*, uint32_t); + +#endif