1290001Sglebius/*
2290001Sglebius * Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
3290001Sglebius * Copyright (C) 2000, 2001  Internet Software Consortium.
4290001Sglebius *
5290001Sglebius * Permission to use, copy, modify, and/or distribute this software for any
6290001Sglebius * purpose with or without fee is hereby granted, provided that the above
7290001Sglebius * copyright notice and this permission notice appear in all copies.
8290001Sglebius *
9290001Sglebius * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10290001Sglebius * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11290001Sglebius * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12290001Sglebius * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13290001Sglebius * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14290001Sglebius * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15290001Sglebius * PERFORMANCE OF THIS SOFTWARE.
16290001Sglebius */
17290001Sglebius
18290001Sglebius/* $Id: stdio.c,v 1.6 2007/06/19 23:47:19 tbox Exp $ */
19290001Sglebius
20290001Sglebius#include <config.h>
21290001Sglebius
22290001Sglebius#include <io.h>
23290001Sglebius#include <errno.h>
24290001Sglebius
25290001Sglebius#include <isc/stdio.h>
26290001Sglebius
27290001Sglebius#include "errno2result.h"
28290001Sglebius
29290001Sglebiusisc_result_t
30290001Sglebiusisc_stdio_open(const char *filename, const char *mode, FILE **fp) {
31290001Sglebius	FILE *f;
32290001Sglebius
33290001Sglebius	f = fopen(filename, mode);
34290001Sglebius	if (f == NULL)
35290001Sglebius		return (isc__errno2result(errno));
36290001Sglebius	*fp = f;
37290001Sglebius	return (ISC_R_SUCCESS);
38290001Sglebius}
39290001Sglebius
40290001Sglebiusisc_result_t
41290001Sglebiusisc_stdio_close(FILE *f) {
42290001Sglebius	int r;
43290001Sglebius
44290001Sglebius	r = fclose(f);
45290001Sglebius	if (r == 0)
46290001Sglebius		return (ISC_R_SUCCESS);
47290001Sglebius	else
48290001Sglebius		return (isc__errno2result(errno));
49290001Sglebius}
50290001Sglebius
51290001Sglebiusisc_result_t
52290001Sglebiusisc_stdio_seek(FILE *f, long offset, int whence) {
53290001Sglebius	int r;
54290001Sglebius
55290001Sglebius	r = fseek(f, offset, whence);
56290001Sglebius	if (r == 0)
57290001Sglebius		return (ISC_R_SUCCESS);
58290001Sglebius	else
59290001Sglebius		return (isc__errno2result(errno));
60290001Sglebius}
61290001Sglebius
62290001Sglebiusisc_result_t
63290001Sglebiusisc_stdio_read(void *ptr, size_t size, size_t nmemb, FILE *f, size_t *nret) {
64290001Sglebius	isc_result_t result = ISC_R_SUCCESS;
65290001Sglebius	size_t r;
66290001Sglebius
67290001Sglebius	clearerr(f);
68290001Sglebius	r = fread(ptr, size, nmemb, f);
69290001Sglebius	if (r != nmemb) {
70290001Sglebius		if (feof(f))
71290001Sglebius			result = ISC_R_EOF;
72290001Sglebius		else
73290001Sglebius			result = isc__errno2result(errno);
74290001Sglebius	}
75290001Sglebius	if (nret != NULL)
76290001Sglebius		*nret = r;
77290001Sglebius	return (result);
78290001Sglebius}
79290001Sglebius
80290001Sglebiusisc_result_t
81290001Sglebiusisc_stdio_write(const void *ptr, size_t size, size_t nmemb, FILE *f,
82290001Sglebius	       size_t *nret)
83290001Sglebius{
84290001Sglebius	isc_result_t result = ISC_R_SUCCESS;
85290001Sglebius	size_t r;
86290001Sglebius
87290001Sglebius	clearerr(f);
88290001Sglebius	r = fwrite(ptr, size, nmemb, f);
89290001Sglebius	if (r != nmemb)
90290001Sglebius		result = isc__errno2result(errno);
91290001Sglebius	if (nret != NULL)
92290001Sglebius		*nret = r;
93290001Sglebius	return (result);
94290001Sglebius}
95290001Sglebius
96290001Sglebiusisc_result_t
97290001Sglebiusisc_stdio_flush(FILE *f) {
98290001Sglebius	int r;
99290001Sglebius
100290001Sglebius	r = fflush(f);
101290001Sglebius	if (r == 0)
102290001Sglebius		return (ISC_R_SUCCESS);
103290001Sglebius	else
104290001Sglebius		return (isc__errno2result(errno));
105290001Sglebius}
106290001Sglebius
107290001Sglebiusisc_result_t
108290001Sglebiusisc_stdio_sync(FILE *f) {
109290001Sglebius	int r;
110290001Sglebius
111290001Sglebius	r = _commit(_fileno(f));
112290001Sglebius	if (r == 0)
113290001Sglebius		return (ISC_R_SUCCESS);
114290001Sglebius	else
115290001Sglebius		return (isc__errno2result(errno));
116290001Sglebius}
117290001Sglebius
118