PERFORCE change 163706 for review
Zhao Shuai
zhaoshuai at FreeBSD.org
Sun Jun 7 12:43:01 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163706
Change 163706 by zhaoshuai at zhaoshuai on 2009/06/07 12:42:12
add fifo_stat_f() and fifo_ioctl_f()
several coding style fix
Affected files ...
.. //depot/projects/soc2009/fifo/sys/fs/fifofs/fifo_vnops.c#10 edit
.. //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#11 edit
Differences ...
==== //depot/projects/soc2009/fifo/sys/fs/fifofs/fifo_vnops.c#10 (text+ko) ====
@@ -43,8 +43,10 @@
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
+#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
+#include <sys/proc.h>
#include <sys/pipe.h>
#include <fs/fifofs/fifo.h>
@@ -146,7 +148,8 @@
return (EINVAL);
if ((fip = vp->v_fifoinfo) == NULL) {
fip = malloc(sizeof(*fip), M_VNODE, M_WAITOK);
- if (( error = generic_pipe_create(td, &rpipe, &wpipe)) != 0) {
+ error = generic_pipe_create(td, &rpipe, &wpipe);
+ if (error) {
free(fip, M_VNODE);
return (error);
}
@@ -389,9 +392,8 @@
{
struct fifoinfo *fip = fp->f_data;
- struct pipe *rpipe = fip->fi_rpipe;
- return (generic_pipe_read(rpipe, uio, cred, flags, td));
+ return (generic_pipe_read(fip->fi_rpipe, uio, cred, flags, td));
}
static int
@@ -399,16 +401,22 @@
{
struct fifoinfo *fip = fp->f_data;
- struct pipe *wpipe = fip->fi_wpipe;
- return (generic_pipe_write(wpipe, uio, cred, flags, td));
+ return (generic_pipe_write(fip->fi_wpipe, uio, cred, flags, td));
}
static int
fifo_stat_f(struct file *fp, struct stat *sb, struct ucred *cred, struct thread *td)
{
+ struct fifoinfo *fip = fp->f_data;
+ int error;
- return (vnops.fo_stat(fp, sb, cred, td));
+ error = generic_pipe_stat(fip->fi_rpipe, sb, cred, td);
+ if (error)
+ return (error);
+ sb->st_uid = fp->f_cred->cr_uid;
+ sb->st_gid = fp->f_cred->cr_gid;
+ return (0);
}
static int
@@ -425,12 +433,52 @@
return (vnops.fo_close(fp, td));
}
+/*
+ * The implementation of ioctl() for named fifos is complicated by the fact
+ * that we permit O_RDWR fifo file descriptors, meaning that the actions of
+ * ioctls may have to be applied to both the underlying pipes rather than
+ * just one.
+ *
+ * Unlike sys_pipe.c, fifos do not implement the deprecated TIOCSPGRP and
+ * TIOCGPGRP ioctls. Earlier implementations of fifos did forward SIOCSPGRP
+ * and SIOCGPGRP ioctls, so we might need to re-add those here.
+ */
static int
fifo_ioctl_f(struct file *fp, u_long com, void *data, struct ucred *cred,
struct thread *td)
{
+ struct fifoinfo *fip = fp->f_data;
+ int error = ENOTTY;
+
+ switch (com) {
+ case FIONBIO:
+ case FIOASYNC:
+ case FIOSETOWN:
+ case FIOGETOWN:
+ if (fp->f_flag & FREAD) {
+ error = generic_pipe_ioctl(fip->fi_rpipe, com, data, cred, td);
+ if (error)
+ return (error);
+ }
+ if (fp->f_flag & FWRITE)
+ error = generic_pipe_ioctl(fip->fi_wpipe, com, data, cred, td);
+ return (error);
- return (0);
+ case FIONREAD:
+ /*
+ * FIONREAD will return 0 for non-readable descriptors, and
+ * the results of FIONREAD on the read socket for readable
+ * descriptors.
+ */
+ if (!(fp->f_flag & FREAD)) {
+ *(int *)data = 0;
+ return (0);
+ }
+ return (generic_pipe_ioctl(fip->fi_rpipe, com, data, cred, td));
+
+ default:
+ return (ENOTTY);
+ }
}
static int
==== //depot/projects/soc2009/fifo/sys/kern/sys_pipe.c#11 (text+ko) ====
@@ -54,15 +54,15 @@
static fo_close_t pipe_close;
static struct fileops pipeops = {
- .fo_read = pipe_read,
- .fo_write = pipe_write,
- .fo_truncate = pipe_truncate,
- .fo_ioctl = pipe_ioctl,
- .fo_poll = pipe_poll,
- .fo_kqfilter = pipe_kqfilter,
- .fo_stat = pipe_stat,
- .fo_close = pipe_close,
- .fo_flags = DFLAG_PASSABLE
+ .fo_read = pipe_read,
+ .fo_write = pipe_write,
+ .fo_truncate = pipe_truncate,
+ .fo_ioctl = pipe_ioctl,
+ .fo_poll = pipe_poll,
+ .fo_kqfilter = pipe_kqfilter,
+ .fo_stat = pipe_stat,
+ .fo_close = pipe_close,
+ .fo_flags = DFLAG_PASSABLE
};
/*
@@ -77,8 +77,9 @@
struct pipe *rpipe, *wpipe;
int fd, error;
- if ((error = generic_pipe_create(td, &rpipe, &wpipe)) != 0)
- return (error);
+ error = generic_pipe_create(td, &rpipe, &wpipe);
+ if (error)
+ return (error);
error = falloc(td, &rf, &fd);
if (error) {
@@ -186,7 +187,7 @@
int error;
error = generic_pipe_stat(pipe, ub, active_cred, td);
- if (error != 0)
+ if (error)
return (error);
ub->st_uid = fp->f_cred->cr_uid;
ub->st_gid = fp->f_cred->cr_gid;
More information about the p4-projects
mailing list