write.c revision 87111
1114117Simp/*	$NetBSD: write.c,v 1.7 1996/06/21 20:29:30 pk Exp $	*/
250476Speter
31592Srgrimes/*-
4156813Sru * Copyright (c) 1993
5156813Sru *	The Regents of the University of California.  All rights reserved.
653909Speter *
753909Speter * This code is derived from software contributed to Berkeley by
853909Speter * The Mach Operating System project at Carnegie-Mellon University.
953909Speter *
1053909Speter * Redistribution and use in source and binary forms, with or without
1153909Speter * modification, are permitted provided that the following conditions
12146286Sobrien * are met:
13124587Sru * 1. Redistributions of source code must retain the above copyright
1453909Speter *    notice, this list of conditions and the following disclaimer.
15137675Sbz * 2. Redistributions in binary form must reproduce the above copyright
1653909Speter *    notice, this list of conditions and the following disclaimer in the
17108574Sjmallett *    documentation and/or other materials provided with the distribution.
1853909Speter * 3. All advertising materials mentioning features or use of this software
1953909Speter *    must display the following acknowledgement:
20143026Strhodes *	This product includes software developed by the University of
2153909Speter *	California, Berkeley and its contributors.
22104385Smike * 4. Neither the name of the University nor the names of its contributors
2353909Speter *    may be used to endorse or promote products derived from this software
2453909Speter *    without specific prior written permission.
2553909Speter *
26143026Strhodes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27124587Sru * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2870922Sdougb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29124587Sru * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
3053909Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31101808Sdwmalone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32117675Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3353909Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34171173Smlaier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35137675Sbz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
361592Srgrimes * SUCH DAMAGE.
37156813Sru *
38137675Sbz *	@(#)write.c	8.1 (Berkeley) 6/11/93
39137675Sbz *
40137675Sbz *
41137675Sbz * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
42156813Sru * All Rights Reserved.
43171173Smlaier *
44126756Smlaier * Author: Alessandro Forin
45126756Smlaier *
46139106Sru * Permission to use, copy, modify and distribute this software and its
47124587Sru * documentation is hereby granted, provided that both the copyright
4853909Speter * notice and this permission notice appear in all copies of the
4953909Speter * software, derivative works or modified versions, and any portions
50156813Sru * thereof, and that both notices appear in supporting documentation.
51143107Sru *
52143026Strhodes * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
53143026Strhodes * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
54143026Strhodes * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
55156813Sru *
56124587Sru * Carnegie Mellon requests users of this software to return to
57124587Sru *
5838101Speter *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
5938101Speter *  School of Computer Science
601592Srgrimes *  Carnegie Mellon University
61 *  Pittsburgh PA 15213-3890
62 *
63 * any improvements or extensions that they make and grant Carnegie the
64 * rights to redistribute these changes.
65 */
66
67#include <sys/cdefs.h>
68__FBSDID("$FreeBSD: head/lib/libstand/write.c 87111 2001-11-30 05:54:30Z alfred $");
69
70#include <sys/param.h>
71#include "stand.h"
72
73ssize_t
74write(fd, dest, bcount)
75	int fd;
76	void *dest;
77	size_t bcount;
78{
79	register struct open_file *f = &files[fd];
80	size_t resid;
81
82	if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_WRITE)) {
83		errno = EBADF;
84		return (-1);
85	}
86	if (f->f_flags & F_RAW) {
87		twiddle();
88		errno = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE,
89			btodb(f->f_offset), bcount, dest, &resid);
90		if (errno)
91			return (-1);
92		f->f_offset += resid;
93		return (resid);
94	}
95	resid = bcount;
96	if ((errno = (f->f_ops->fo_write)(f, dest, bcount, &resid)))
97		return (-1);
98	return (bcount - resid);
99}
100