summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2018-06-14 14:42:57 +0300
committerHans Rosenfeld <hans.rosenfeld@joyent.com>2018-07-09 18:33:58 +0200
commit692bf522ee0f2281edfe25261f83e5fe71fac37e (patch)
treef37ab31dddafb3d01abb8c1748d527935031b769
parente3c18722ae67aad9d682b8066dc32d5d9991489c (diff)
downloadillumos-joyent-692bf522ee0f2281edfe25261f83e5fe71fac37e.tar.gz
9604 loader: open/close/read/write cleanup
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com> Reviewed by: Yuri Pankov <yuripv@yuripv.net> Approved by: Robert Mustacchi <rm@joyent.com>
-rw-r--r--usr/src/boot/lib/libstand/close.c64
-rw-r--r--usr/src/boot/lib/libstand/open.c164
-rw-r--r--usr/src/boot/lib/libstand/read.c125
-rw-r--r--usr/src/boot/lib/libstand/write.c16
4 files changed, 185 insertions, 184 deletions
diff --git a/usr/src/boot/lib/libstand/close.c b/usr/src/boot/lib/libstand/close.c
index 939f025b8f..573cef4dbd 100644
--- a/usr/src/boot/lib/libstand/close.c
+++ b/usr/src/boot/lib/libstand/close.c
@@ -1,6 +1,6 @@
/* $NetBSD: close.c,v 1.7 1997/01/22 00:38:09 cgd Exp $ */
-/*-
+/*
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
*
@@ -15,7 +15,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -32,67 +32,65 @@
* SUCH DAMAGE.
*
* @(#)close.c 8.1 (Berkeley) 6/11/93
- *
+ *
*
* Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Author: Alessandro Forin
- *
+ *
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
- *
+ *
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
+ *
* Carnegie Mellon requests users of this software to return to
- *
+ *
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
- *
+ *
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include "stand.h"
int
close(int fd)
{
- 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_rabuf != NULL) {
+ if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
+ errno = EBADF;
+ return (-1);
+ }
free(f->f_rabuf);
f->f_rabuf = NULL;
- }
- 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 (!(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);
}
diff --git a/usr/src/boot/lib/libstand/open.c b/usr/src/boot/lib/libstand/open.c
index 0d90433800..5fd6c2a5fb 100644
--- a/usr/src/boot/lib/libstand/open.c
+++ b/usr/src/boot/lib/libstand/open.c
@@ -1,6 +1,6 @@
/* $NetBSD: open.c,v 1.16 1997/01/28 09:41:03 pk Exp $ */
-/*-
+/*
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
*
@@ -15,7 +15,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -32,36 +32,35 @@
* SUCH DAMAGE.
*
* @(#)open.c 8.1 (Berkeley) 6/11/93
- *
+ *
*
* Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Author: Alessandro Forin
- *
+ *
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
- *
+ *
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
+ *
* Carnegie Mellon requests users of this software to return to
- *
+ *
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
- *
+ *
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include "stand.h"
@@ -70,90 +69,89 @@ struct fs_ops *exclusive_file_system;
struct open_file files[SOPEN_MAX];
static int
-o_gethandle(void)
+o_gethandle(void)
{
- int fd;
-
- for (fd = 0; fd < SOPEN_MAX; fd++)
- if (files[fd].f_flags == 0)
- return(fd);
- return(-1);
+ int fd;
+
+ for (fd = 0; fd < SOPEN_MAX; fd++)
+ if (files[fd].f_flags == 0)
+ return (fd);
+ return (-1);
}
static void
o_rainit(struct open_file *f)
{
- f->f_rabuf = malloc(SOPEN_RASIZE);
- f->f_ralen = 0;
- f->f_raoffset = 0;
+ f->f_rabuf = malloc(SOPEN_RASIZE);
+ f->f_ralen = 0;
+ f->f_raoffset = 0;
}
int
open(const char *fname, int mode)
{
- struct fs_ops *fs;
- struct open_file *f;
- int fd, i, error, besterror;
- const char *file;
-
- if ((fd = o_gethandle()) == -1) {
- errno = EMFILE;
- return(-1);
- }
-
- f = &files[fd];
- f->f_flags = mode + 1;
- f->f_dev = (struct devsw *)0;
- f->f_ops = (struct fs_ops *)0;
- f->f_offset = 0;
- f->f_devdata = NULL;
- file = (char *)0;
-
- if (exclusive_file_system != NULL) {
- fs = exclusive_file_system;
- error = (fs->fo_open)(fname, f);
- if (error == 0)
- goto ok;
- goto fail;
- }
-
- error = devopen(f, fname, &file);
- if (error ||
- (((f->f_flags & F_NODEV) == 0) && f->f_dev == (struct devsw *)0))
- goto err;
-
- /* see if we opened a raw device; otherwise, 'file' is the file name. */
- if (file == (char *)0 || *file == '\0') {
- f->f_flags |= F_RAW;
- f->f_rabuf = NULL;
+ struct fs_ops *fs;
+ struct open_file *f;
+ int fd, i, error, besterror;
+ const char *file;
+
+ if ((fd = o_gethandle()) == -1) {
+ errno = EMFILE;
+ return (-1);
+ }
+
+ f = &files[fd];
+ f->f_flags = mode + 1;
+ f->f_dev = NULL;
+ f->f_ops = NULL;
+ f->f_offset = 0;
+ f->f_devdata = NULL;
+ file = NULL;
+
+ if (exclusive_file_system != NULL) {
+ fs = exclusive_file_system;
+ error = (fs->fo_open)(fname, f);
+ if (error == 0)
+ goto ok;
+ goto err;
+ }
+
+ error = devopen(f, fname, &file);
+ if (error ||
+ (((f->f_flags & F_NODEV) == 0) && f->f_dev == NULL))
+ goto err;
+
+ /* see if we opened a raw device; otherwise, 'file' is the file name. */
+ if (file == NULL || *file == '\0') {
+ f->f_flags |= F_RAW;
+ f->f_rabuf = NULL;
+ return (fd);
+ }
+
+ /* pass file name to the different filesystem open routines */
+ besterror = ENOENT;
+ for (i = 0; file_system[i] != NULL; i++) {
+ fs = file_system[i];
+ error = (fs->fo_open)(file, f);
+ if (error == 0)
+ goto ok;
+ if (error != EINVAL)
+ besterror = error;
+ }
+ error = besterror;
+
+ if ((f->f_flags & F_NODEV) == 0 && f->f_dev != NULL)
+ f->f_dev->dv_close(f);
+ if (error)
+ devclose(f);
+
+err:
+ f->f_flags = 0;
+ errno = error;
+ return (-1);
+
+ok:
+ f->f_ops = fs;
+ o_rainit(f);
return (fd);
- }
-
- /* pass file name to the different filesystem open routines */
- besterror = ENOENT;
- for (i = 0; file_system[i] != NULL; i++) {
- fs = file_system[i];
- error = (fs->fo_open)(file, f);
- if (error == 0)
- goto ok;
- if (error != EINVAL)
- besterror = error;
- }
- error = besterror;
-
- fail:
- if ((f->f_flags & F_NODEV) == 0 && f->f_dev != NULL)
- f->f_dev->dv_close(f);
- if (error)
- devclose(f);
-
- err:
- f->f_flags = 0;
- errno = error;
- return (-1);
-
- ok:
- f->f_ops = fs;
- o_rainit(f);
- return (fd);
}
diff --git a/usr/src/boot/lib/libstand/read.c b/usr/src/boot/lib/libstand/read.c
index aa1f74df60..41e94a4f8b 100644
--- a/usr/src/boot/lib/libstand/read.c
+++ b/usr/src/boot/lib/libstand/read.c
@@ -1,6 +1,6 @@
/* $NetBSD: read.c,v 1.8 1997/01/22 00:38:12 cgd Exp $ */
-/*-
+/*
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
*
@@ -15,7 +15,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -32,36 +32,35 @@
* SUCH DAMAGE.
*
* @(#)read.c 8.1 (Berkeley) 6/11/93
- *
+ *
*
* Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Author: Alessandro Forin
- *
+ *
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
- *
+ *
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
+ *
* Carnegie Mellon requests users of this software to return to
- *
+ *
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
- *
+ *
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include "stand.h"
@@ -69,59 +68,65 @@ __FBSDID("$FreeBSD$");
ssize_t
read(int fd, void *dest, size_t bcount)
{
- struct open_file *f = &files[fd];
- size_t resid;
+ struct open_file *f = &files[fd];
+ size_t resid;
- if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) {
- errno = EBADF;
- return (-1);
- }
- if (f->f_flags & F_RAW) {
- twiddle(8);
- errno = (f->f_dev->dv_strategy)(f->f_devdata, F_READ,
- btodb(f->f_offset), bcount, dest, &resid);
- if (errno)
- return (-1);
- f->f_offset += resid;
- return (resid);
- }
-
- /*
- * Optimise reads from regular files using a readahead buffer.
- * If the request can't be satisfied from the current buffer contents,
- * check to see if it should be bypassed, or refill the buffer and complete
- * the request.
- */
- resid = bcount;
- for (;;) {
- size_t ccount, cresid;
- /* how much can we supply? */
- ccount = imin(f->f_ralen, resid);
- if (ccount > 0) {
- bcopy(f->f_rabuf + f->f_raoffset, dest, ccount);
- f->f_raoffset += ccount;
- f->f_ralen -= ccount;
- resid -= ccount;
- if (resid == 0)
- return(bcount);
- dest = (char *)dest + ccount;
+ if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) {
+ errno = EBADF;
+ return (-1);
}
-
- /* will filling the readahead buffer again not help? */
- if (resid >= SOPEN_RASIZE) {
- /* bypass the rest of the request and leave the buffer empty */
- if ((errno = (f->f_ops->fo_read)(f, dest, resid, &cresid)))
- return (-1);
- return(bcount - cresid);
+ if (f->f_flags & F_RAW) {
+ twiddle(8);
+ errno = (f->f_dev->dv_strategy)(f->f_devdata, F_READ,
+ btodb(f->f_offset), bcount, dest, &resid);
+ if (errno)
+ return (-1);
+ f->f_offset += resid;
+ return (resid);
}
- /* fetch more data */
- if ((errno = (f->f_ops->fo_read)(f, f->f_rabuf, SOPEN_RASIZE, &cresid)))
- return (-1);
- f->f_raoffset = 0;
- f->f_ralen = SOPEN_RASIZE - cresid;
- /* no more data, return what we had */
- if (f->f_ralen == 0)
- return(bcount - resid);
- }
+ /*
+ * Optimise reads from regular files using a readahead buffer.
+ * If the request can't be satisfied from the current buffer contents,
+ * check to see if it should be bypassed, or refill the buffer and
+ * complete the request.
+ */
+ resid = bcount;
+ for (;;) {
+ size_t ccount, cresid;
+ /* how much can we supply? */
+ ccount = imin(f->f_ralen, resid);
+ if (ccount > 0) {
+ bcopy(f->f_rabuf + f->f_raoffset, dest, ccount);
+ f->f_raoffset += ccount;
+ f->f_ralen -= ccount;
+ resid -= ccount;
+ if (resid == 0)
+ return (bcount);
+ dest = (char *)dest + ccount;
+ }
+
+ /* will filling the readahead buffer again not help? */
+ if (f->f_rabuf == NULL || resid >= SOPEN_RASIZE) {
+ /*
+ * bypass the rest of the request and leave the
+ * buffer empty
+ */
+ errno = (f->f_ops->fo_read)(f, dest, resid, &cresid);
+ if (errno != 0)
+ return (-1);
+ return (bcount - cresid);
+ }
+
+ /* fetch more data */
+ errno = (f->f_ops->fo_read)(f, f->f_rabuf, SOPEN_RASIZE,
+ &cresid);
+ if (errno != 0)
+ return (-1);
+ f->f_raoffset = 0;
+ f->f_ralen = SOPEN_RASIZE - cresid;
+ /* no more data, return what we had */
+ if (f->f_ralen == 0)
+ return (bcount - resid);
+ }
}
diff --git a/usr/src/boot/lib/libstand/write.c b/usr/src/boot/lib/libstand/write.c
index 96fc5c3457..86bc162fe5 100644
--- a/usr/src/boot/lib/libstand/write.c
+++ b/usr/src/boot/lib/libstand/write.c
@@ -1,6 +1,6 @@
/* $NetBSD: write.c,v 1.7 1996/06/21 20:29:30 pk Exp $ */
-/*-
+/*
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
*
@@ -15,7 +15,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -32,30 +32,30 @@
* SUCH DAMAGE.
*
* @(#)write.c 8.1 (Berkeley) 6/11/93
- *
+ *
*
* Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Author: Alessandro Forin
- *
+ *
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
- *
+ *
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
+ *
* Carnegie Mellon requests users of this software to return to
- *
+ *
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
- *
+ *
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/