#include "lib.h"
#include "map.h"

#include <unistd.h>

static ssize_t read_full_n(int fd, void *data, size_t size)
{
	ssize_t ret, all_ret = 0;

	while (size > 0) {
		ret = read(fd, data, size);
		if (ret <= 0)
			return ret;

		data = PTR_OFFSET(data, ret);
		all_ret += ret;
		size -= ret;
	}

	return all_ret;
}

void map_refresh(int fd, int onceonly __attr_unused__, const char **base,
		 unsigned long *len, unsigned long newlen,
		 const char *name, const char *mboxname __attr_unused__)
{
	ssize_t ret;
	void *p;

	if (newlen == 0) {
		/* the file is a broken zero-byte file */
		*len = 0;
		return;
	}

	*base = p = i_malloc(newlen);
	*len = newlen;

	ret = read_full_n(fd, p, newlen);
	if (ret < 0) {
		i_error("read_full_n(%s) failed: %m", name);
		ret = 0;
	}

	*len = ret;
}

void map_free(const char **base, unsigned long *len __attr_unused__)
{
	char *x = (char *) *base;

	i_free(x);
	*base = NULL;
}



syntax highlighted by Code2HTML, v. 0.9.1