Annotation of src/lib/libc/stdio/fwrite.c, Revision 1.16
1.16 ! christos 1: /* $NetBSD: fwrite.c,v 1.15 2003/08/07 16:43:26 agc Exp $ */
1.5 jtc 2:
1.1 cgd 3: /*-
1.5 jtc 4: * Copyright (c) 1990, 1993
5: * The Regents of the University of California. All rights reserved.
1.1 cgd 6: *
7: * This code is derived from software contributed to Berkeley by
8: * Chris Torek.
9: *
10: * Redistribution and use in source and binary forms, with or without
11: * modification, are permitted provided that the following conditions
12: * are met:
13: * 1. Redistributions of source code must retain the above copyright
14: * notice, this list of conditions and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
1.15 agc 18: * 3. Neither the name of the University nor the names of its contributors
1.1 cgd 19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: */
34:
1.6 christos 35: #include <sys/cdefs.h>
1.1 cgd 36: #if defined(LIBC_SCCS) && !defined(lint)
1.5 jtc 37: #if 0
38: static char sccsid[] = "@(#)fwrite.c 8.1 (Berkeley) 6/4/93";
1.6 christos 39: #else
1.16 ! christos 40: __RCSID("$NetBSD: fwrite.c,v 1.15 2003/08/07 16:43:26 agc Exp $");
1.5 jtc 41: #endif
1.1 cgd 42: #endif /* LIBC_SCCS and not lint */
43:
1.9 lukem 44: #include <assert.h>
45: #include <errno.h>
1.1 cgd 46: #include <stdio.h>
1.14 thorpej 47: #include "reentrant.h"
1.1 cgd 48: #include "local.h"
49: #include "fvwrite.h"
50:
51: /*
52: * Write `count' objects (each size `size') from memory to the given file.
53: * Return the number of whole objects written.
54: */
1.4 jtc 55: size_t
1.1 cgd 56: fwrite(buf, size, count, fp)
57: const void *buf;
58: size_t size, count;
59: FILE *fp;
60: {
61: size_t n;
62: struct __suio uio;
63: struct __siov iov;
1.9 lukem 64:
1.13 lukem 65: _DIAGASSERT(fp != NULL);
66: /*
67: * SUSv2 requires a return value of 0 for a count or a size of 0.
68: */
69: if ((n = count * size) == 0)
70: return (0);
1.9 lukem 71: _DIAGASSERT(buf != NULL);
1.1 cgd 72:
1.16 ! christos 73: iov.iov_base = __UNCONST(buf);
1.13 lukem 74: uio.uio_resid = iov.iov_len = n;
1.1 cgd 75: uio.uio_iov = &iov;
76: uio.uio_iovcnt = 1;
77:
78: /*
79: * The usual case is success (__sfvwrite returns 0);
80: * skip the divide if this happens, since divides are
81: * generally slow and since this occurs whenever size==0.
82: */
1.7 jtc 83: FLOCKFILE(fp);
84: if (__sfvwrite(fp, &uio) != 0)
85: count = ((n - uio.uio_resid) / size);
86: FUNLOCKFILE(fp);
87: return (count);
1.1 cgd 88: }
CVSweb <webmaster@jp.NetBSD.org>