view io.c @ 794:d018af7c979c

slab: make struct mem_cache private Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sun, 15 Mar 2020 15:52:09 +0200
parents a8fee5d5997f
children be934c5f8a42
line wrap: on
line source

/*
 * Copyright (c) 2011-2017 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <jeffpc/io.h>
#include <jeffpc/error.h>

#include "io_common.h"

int xread(int fd, void *buf, size_t nbyte)
{
	return rw(fd, buf, nbyte, 0, false, true, NULL);
}

int xpread(int fd, void *buf, size_t nbyte, off_t off)
{
	return rw(fd, buf, nbyte, off, true, true, NULL);
}

int xwrite(int fd, const void *buf, size_t nbyte)
{
	return rw(fd, (void *) buf, nbyte, 0, false, false, NULL);
}

int xpwrite(int fd, const void *buf, size_t nbyte, off_t off)
{
	return rw(fd, (void *) buf, nbyte, off, true, false, NULL);
}

char *read_file_common(int dirfd, const char *fname, struct stat *sb)
{
	struct stat statbuf;
	char *out;
	int ret;
	int fd;

	fd = xopenat(dirfd, fname, O_RDONLY, 0);
	if (fd < 0) {
		out = ERR_PTR(fd);
		goto err;
	}

	ret = fstat(fd, &statbuf);
	if (ret == -1) {
		out = ERR_PTR(-errno);
		goto err_close;
	}

	out = malloc(statbuf.st_size + 1);
	if (!out) {
		out = ERR_PTR(-ENOMEM);
		goto err_close;
	}

	ret = xread(fd, out, statbuf.st_size);
	if (ret) {
		free(out);
		out = ERR_PTR(ret);
	} else {
		out[statbuf.st_size] = '\0';

		if (sb)
			*sb = statbuf;
	}

err_close:
	xclose(fd);

err:
	return out;
}

int write_file(const char *fname, const char *data, size_t len)
{
	int ret;
	int fd;

	fd = xopen(fname, O_WRONLY | O_CREAT | O_EXCL,
		   S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
	if (fd < 0)
		return fd;

	ret = xwrite(fd, data, len);

	xclose(fd);

	return ret;
}