sss_iobuf.c revision 18e4fe9d836e8f7bee52724374ffc0011172329f
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch#include <talloc.h>
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch#include "util/util.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "util/sss_iobuf.h"
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch/**
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch * @brief The iobuf structure that holds the data, its capacity and
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch * a pointer to the data.
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch *
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch * @see sss_iobuf_init_empty()
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch * @see sss_iobuf_init_readonly()
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschstruct sss_iobuf {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *data; /* Start of the data buffer */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t dp; /* Data pointer */
e9c433c5b8ef9a1b4246ebe10beb90fa01e05cafPhil Carmody size_t size; /* Current data buffer size */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t capacity; /* Maximum capacity */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch};
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Boschstruct sss_iobuf *sss_iobuf_init_empty(TALLOC_CTX *mem_ctx,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t size,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t capacity)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch struct sss_iobuf *iobuf;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *buf;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf = talloc_zero(mem_ctx, struct sss_iobuf);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch return NULL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch buf = talloc_zero_array(iobuf, uint8_t, size);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (buf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch talloc_free(iobuf);
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch return NULL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (capacity == 0) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch capacity = SIZE_MAX / 2;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->data = buf;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->size = size;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->capacity = capacity;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->dp = 0;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf;
f883bf3eff62f5d27df5ee9ee664edc38a77937fStephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschstruct sss_iobuf *sss_iobuf_init_readonly(TALLOC_CTX *mem_ctx,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch const uint8_t *data,
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch size_t size)
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch{
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch struct sss_iobuf *iobuf;
f883bf3eff62f5d27df5ee9ee664edc38a77937fStephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf = sss_iobuf_init_empty(mem_ctx, size, size);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return NULL;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (data != NULL) {
f883bf3eff62f5d27df5ee9ee664edc38a77937fStephan Bosch memcpy(iobuf->data, data, size);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
f883bf3eff62f5d27df5ee9ee664edc38a77937fStephan Boschsize_t sss_iobuf_get_len(struct sss_iobuf *iobuf)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return 0;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
f883bf3eff62f5d27df5ee9ee664edc38a77937fStephan Bosch return iobuf->dp;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschsize_t sss_iobuf_get_capacity(struct sss_iobuf *iobuf)
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return 0;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf->capacity;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschsize_t sss_iobuf_get_size(struct sss_iobuf *iobuf)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return 0;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf->size;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschuint8_t *sss_iobuf_get_data(struct sss_iobuf *iobuf)
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch return NULL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf->data;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch}
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschstatic size_t iobuf_get_len(struct sss_iobuf *iobuf)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch return 0;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return (iobuf->size - iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Boschstatic errno_t ensure_bytes(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t nbytes)
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t wantsize;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t newsize;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *newdata;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL) {
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch wantsize = iobuf->dp + nbytes;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (wantsize <= iobuf->size) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch /* Enough space already */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch /* Else, try to extend the iobuf */
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (wantsize > iobuf->capacity) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch /* We will never grow past capacity */
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ENOBUFS;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch /* Double the size until we add at least nbytes, but stop if we double past capacity */
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch for (newsize = iobuf->size;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch (newsize < wantsize) && (newsize < iobuf->capacity);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch newsize *= 2)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch ;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (newsize > iobuf->capacity) {
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch newsize = iobuf->capacity;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch newdata = talloc_realloc(iobuf, iobuf->data, uint8_t, newsize);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (newdata == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ENOMEM;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch iobuf->data = newdata;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->size = newsize;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boschstatic inline uint8_t *iobuf_ptr(struct sss_iobuf *iobuf)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return iobuf->data + iobuf->dp;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_read(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t len,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *_buf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t *_read)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t remaining;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL || _buf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch remaining = iobuf_get_len(iobuf);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (len > remaining) {
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch len = remaining;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
62aa68310d6f42467ca26880f678173bf1d26a83Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch safealign_memcpy(_buf, iobuf_ptr(iobuf), len, &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (_read != NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch *_read = len;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_read_len(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t len,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *_buf)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t read_bytes;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch errno_t ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch ret = sss_iobuf_read(iobuf, len, _buf, &read_bytes);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (ret != EOK) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (read_bytes != len) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ENOBUFS;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Boscherrno_t sss_iobuf_write_len(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *buf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t len)
17c29e3e2246972c3d988e05d91b9286398a624fStephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch errno_t ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL || buf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch ret = ensure_bytes(iobuf, len);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (ret != EOK) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch safealign_memcpy(iobuf_ptr(iobuf), buf, len, &iobuf->dp);
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_read_uint32(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint32_t *_val)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch SAFEALIGN_COPY_UINT32_CHECK(_val, iobuf_ptr(iobuf),
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch iobuf->capacity, &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_read_int32(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch int32_t *_val)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch SAFEALIGN_COPY_INT32_CHECK(_val, iobuf_ptr(iobuf),
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch iobuf->capacity, &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_write_uint32(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint32_t val)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch errno_t ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch ret = ensure_bytes(iobuf, sizeof(uint32_t));
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (ret != EOK) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch SAFEALIGN_SETMEM_UINT32(iobuf_ptr(iobuf), val, &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_write_int32(struct sss_iobuf *iobuf,
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch int32_t val)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch errno_t ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch ret = ensure_bytes(iobuf, sizeof(int32_t));
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (ret != EOK) {
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch return ret;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch SAFEALIGN_SETMEM_INT32(iobuf_ptr(iobuf), val, &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_read_stringz(struct sss_iobuf *iobuf,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch const char **_out)
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch uint8_t *end;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch size_t len;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (iobuf == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (_out == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch *_out = NULL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch end = memchr(iobuf_ptr(iobuf), '\0', sss_iobuf_get_size(iobuf));
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (end == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch len = end + 1 - iobuf_ptr(iobuf);
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch if (sss_iobuf_get_size(iobuf) < len) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch *_out = (const char *) iobuf_ptr(iobuf);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch iobuf->dp += len;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Boscherrno_t sss_iobuf_write_stringz(struct sss_iobuf *iobuf,
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch const char *str)
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch{
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch if (iobuf == NULL || str == NULL) {
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EINVAL;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch }
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch SAFEALIGN_MEMCPY_CHECK(iobuf_ptr(iobuf),
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch str, strlen(str)+1,
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch sss_iobuf_get_size(iobuf),
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch &iobuf->dp);
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch return EOK;
6ae6496c225238a2c55a8cd96744ad976c44a726Stephan Bosch}
66134fbce11778241ca9f8458ee2a0488a05bde0Stephan Bosch