libsa: cstyle cleanup for open/close/read/write sources

This commit is contained in:
Toomas Soome 2018-06-14 08:58:10 +00:00
parent 19668eb2bf
commit f03b083204
4 changed files with 178 additions and 175 deletions

View File

@ -68,31 +68,31 @@ __FBSDID("$FreeBSD$");
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) {
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 ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
errno = EBADF;
return (-1);
}
if (f->f_rabuf != NULL) {
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);
}

View File

@ -72,87 +72,87 @@ struct open_file files[SOPEN_MAX];
static int
o_gethandle(void)
{
int fd;
int fd;
for (fd = 0; fd < SOPEN_MAX; fd++)
if (files[fd].f_flags == 0)
return(fd);
return(-1);
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;
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);
}
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;
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 err;
}
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 == (struct devsw *)0))
goto err;
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;
/* 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;
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;
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);
}

View File

@ -69,59 +69,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(4);
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);
}
if (f->f_flags & F_RAW) {
twiddle(4);
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);
}
/* 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);
}
/*
* 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;
}
/* 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);
}
/* will filling the readahead buffer again not help? */
if (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);
}
}

View File

@ -67,10 +67,7 @@ __FBSDID("$FreeBSD$");
#include "stand.h"
ssize_t
write(fd, dest, bcount)
int fd;
const void *dest;
size_t bcount;
write(int fd, const void *dest, size_t bcount)
{
struct open_file *f = &files[fd];
size_t resid;
@ -82,8 +79,8 @@ write(fd, dest, bcount)
if (f->f_flags & F_RAW) {
twiddle(4);
errno = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE,
btodb(f->f_offset), bcount, __DECONST(void *, dest),
&resid);
btodb(f->f_offset), bcount, __DECONST(void *, dest),
&resid);
if (errno)
return (-1);
f->f_offset += resid;