d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2000, 2001, 2004, 2007, 2011-2014, 2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence */
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
26696386938e70e93d7dde509d7bc45ead5870b7Mark Andrews/* $Id$ */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence#include <config.h>
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence#include <errno.h>
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence#include <unistd.h>
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence#include <isc/stdio.h>
32babe43eb479d2ae8736f9985a84d1b9d95a33aScott Mann#include <isc/stat.h>
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt#include <isc/util.h>
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence#include "errno2result.h"
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_open(const char *filename, const char *mode, FILE **fp) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence FILE *f;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence f = fopen(filename, mode);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (f == NULL)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (isc__errno2result(errno));
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence *fp = f;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (ISC_R_SUCCESS);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_close(FILE *f) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence int r;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence r = fclose(f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (r == 0)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (ISC_R_SUCCESS);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence else
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (isc__errno2result(errno));
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Huntisc_stdio_seek(FILE *f, off_t offset, int whence) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence int r;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#ifdef HAVE_FSEEKO
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt r = fseeko(f, offset, whence);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#else
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews r = fseek(f, offset, whence);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#endif
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (r == 0)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (ISC_R_SUCCESS);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence else
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (isc__errno2result(errno));
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Huntisc_result_t
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Huntisc_stdio_tell(FILE *f, off_t *offsetp) {
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt off_t r;
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt REQUIRE(offsetp != NULL);
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#ifdef HAVE_FTELLO
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt r = ftello(f);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#else
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews r = ftell(f);
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews#endif
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt if (r >= 0) {
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt *offsetp = r;
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt return (ISC_R_SUCCESS);
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt } else
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt return (isc__errno2result(errno));
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt}
31707708c585c53b61ca1edb2e224e6bb1b985a5Evan Hunt
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_read(void *ptr, size_t size, size_t nmemb, FILE *f, size_t *nret) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence isc_result_t result = ISC_R_SUCCESS;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence size_t r;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence clearerr(f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence r = fread(ptr, size, nmemb, f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (r != nmemb) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (feof(f))
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence result = ISC_R_EOF;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence else
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence result = isc__errno2result(errno);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence }
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (nret != NULL)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence *nret = r;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (result);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_write(const void *ptr, size_t size, size_t nmemb, FILE *f,
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence size_t *nret)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence{
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence isc_result_t result = ISC_R_SUCCESS;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence size_t r;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence clearerr(f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence r = fwrite(ptr, size, nmemb, f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (r != nmemb)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence result = isc__errno2result(errno);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (nret != NULL)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence *nret = r;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (result);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_flush(FILE *f) {
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence int r;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence r = fflush(f);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence if (r == 0)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (ISC_R_SUCCESS);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence else
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (isc__errno2result(errno));
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt/*
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt * OpenBSD has deprecated ENOTSUP in favor of EOPNOTSUPP.
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt */
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt#if defined(EOPNOTSUPP) && !defined(ENOTSUP)
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt#define ENOTSUP EOPNOTSUPP
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt#endif
e5bf06eedc08179fb93a09799915139370d08055Evan Hunt
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_result_t
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrenceisc_stdio_sync(FILE *f) {
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews struct stat buf;
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence int r;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews if (fstat(fileno(f), &buf) != 0)
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews return (isc__errno2result(errno));
b9e0ed731aea37f0d19af2ca032cbb37c264a9a5Tinderbox User
9ddf371552b3554a22632996acc41ef9917a30f4Mark Andrews /*
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews * Only call fsync() on regular files.
9ddf371552b3554a22632996acc41ef9917a30f4Mark Andrews */
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews if ((buf.st_mode & S_IFMT) != S_IFREG)
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews return (ISC_R_SUCCESS);
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews r = fsync(fileno(f));
2f1c460beaa1e372255e7a1b8aad8996f011816dMark Andrews if (r == 0)
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (ISC_R_SUCCESS);
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence else
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence return (isc__errno2result(errno));
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence}
d8e34837cd6c88c42b3ecdb9107a43ecf8252e79David Lawrence