summaryrefslogtreecommitdiffstats
path: root/lib/libstand/close.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libstand/close.c')
-rw-r--r--lib/libstand/close.c50
1 files changed, 26 insertions, 24 deletions
diff --git a/lib/libstand/close.c b/lib/libstand/close.c
index aca6a65..bf81094 100644
--- a/lib/libstand/close.c
+++ b/lib/libstand/close.c
@@ -1,3 +1,4 @@
+/* $FreeBSD$ */
/* $NetBSD: close.c,v 1.7 1997/01/22 00:38:09 cgd Exp $ */
/*-
@@ -67,30 +68,31 @@
#include "stand.h"
int
-close(fd)
- int fd;
+close(int fd)
{
- register struct open_file *f = &files[fd];
- int err1 = 0, err2 = 0;
+ struct open_file *f = &files[fd];
+ int err1 = 0, err2 = 0;
- if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
- errno = EBADF;
- return (-1);
- }
- if (!(f->f_flags & F_RAW) && f->f_ops)
- err1 = (f->f_ops->fo_close)(f);
- if (!(f->f_flags & F_NODEV) && f->f_dev)
- err2 = (f->f_dev->dv_close)(f);
- if (f->f_devdata != NULL)
- devclose(f);
- f->f_flags = 0;
- if (err1) {
- errno = err1;
- return (-1);
- }
- if (err2) {
- errno = err2;
- return (-1);
- }
- return (0);
+ if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
+ errno = EBADF;
+ return (-1);
+ }
+ if (f->f_rabuf != NULL)
+ free(f->f_rabuf);
+ if (!(f->f_flags & F_RAW) && f->f_ops)
+ err1 = (f->f_ops->fo_close)(f);
+ if (!(f->f_flags & F_NODEV) && f->f_dev)
+ err2 = (f->f_dev->dv_close)(f);
+ if (f->f_devdata != NULL)
+ devclose(f);
+ f->f_flags = 0;
+ if (err1) {
+ errno = err1;
+ return (-1);
+ }
+ if (err2) {
+ errno = err2;
+ return (-1);
+ }
+ return (0);
}
OpenPOWER on IntegriCloud