xref: /original-bsd/sys/stand/close.c (revision 37071c60)
1 /*-
2  * Copyright (c) 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * The Mach Operating System project at Carnegie-Mellon University.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)close.c	8.1 (Berkeley) 06/11/93
11  *
12  *
13  * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
14  * All Rights Reserved.
15  *
16  * Author: Alessandro Forin
17  *
18  * Permission to use, copy, modify and distribute this software and its
19  * documentation is hereby granted, provided that both the copyright
20  * notice and this permission notice appear in all copies of the
21  * software, derivative works or modified versions, and any portions
22  * thereof, and that both notices appear in supporting documentation.
23  *
24  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
25  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
26  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
27  *
28  * Carnegie Mellon requests users of this software to return to
29  *
30  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
31  *  School of Computer Science
32  *  Carnegie Mellon University
33  *  Pittsburgh PA 15213-3890
34  *
35  * any improvements or extensions that they make and grant Carnegie the
36  * rights to redistribute these changes.
37  */
38 
39 #include <stand/stand.h>
40 
41 close(fd)
42 	int fd;
43 {
44 	register struct open_file *f = &files[fd];
45 	int err1, err2;
46 
47 	if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
48 		errno = EBADF;
49 		return (-1);
50 	}
51 	if (!(f->f_flags & F_RAW))
52 		err1 = (f->f_ops->close)(f);
53 	err2 = (f->f_dev->dv_close)(f);
54 	f->f_flags = 0;
55 	if (err1) {
56 		errno = err1;
57 		return (-1);
58 	}
59 	if (err2) {
60 		errno = err2;
61 		return (-1);
62 	}
63 	return (0);
64 }
65