Skip site navigation (1)Skip section navigation (2)
Date:      19 Feb 2000 03:49:55 -0000
From:      kenji.rikitake@acm.org
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/16816: vop_stdpoll() in /sys/kern/vfs_default.c does not handle POLLIN/POLLOUT flags
Message-ID:  <20000219034955.75315.qmail@k2r.org>

next in thread | raw e-mail | index | archive | help

>Number:         16816
>Category:       kern
>Synopsis:       vop_stdpoll() in /sys/kern/vfs_default.c does not handle POLLIN/POLLOUT
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 18 19:50:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Kenji Rikitake
>Release:        FreeBSD 3.4-RELEASE i386
>Organization:
K2 Research
>Environment:

	FreeBSD 3.4-RELEASE

>Description:

	When monitoring stdin using poll() with event POLLIN,
	it works when stdin is redirected to a pipe,
	but it does not when stdin is redirected to a local system file (vfs).
	I think this behavior is weird because POLLIN seems to work for
	all the other devices/socket/pipe/file-systems buf vfs.

>How-To-Repeat:

cc -o poll-sample poll-sample.c
echo "127.0.0.1" > foo
cat ./foo | ./poll-sample
	retval = 1, revents=17
./poll-sample < ~/.foo
	retval = 0, revents=0 (after waiting 10 seconds)

when using POLLRDNORM for the value of x[0].events, the file redirection
works as:
	retval = 1, revents=64
	
/* poll-sample.c */
#include <stdio.h>
#include <poll.h>
#include <sys/types.h>

main()
{
        struct pollfd x[1];
        int i;

        x[0].fd = 0;
        x[0].events = POLLIN;

        i = poll(x, 1, 10000);
        printf("retval = %d, revents=%d\n", i, x[0].revents);
}
/* end of poll-sample.c */	

>Fix:

	This hasn't been tested yet, but I think changing the implementation
	of vop_stdpoll() in /sys/kern/vfs_default.c will solve this
	inconsistent behavior, by applying the following patch.
	
--- /sys/kern/vfs_default.c     Wed Jan 20 23:48:49 1999
+++ vfs_default.c       Sat Feb 19 12:44:43 2000
@@ -285,7 +285,8 @@
        } */ *ap;
 {
        if ((ap->a_events & ~POLLSTANDARD) == 0)
-               return (ap->a_events & (POLLRDNORM|POLLWRNORM));
+               return (ap->a_events & 
+                      (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
        return (vn_pollrecord(ap->a_vp, ap->a_p, ap->a_events));
 }

	I would also like FreeBSD Development Team to clarify the difference
	of semantics between POLLIN and POLLRDNORM, or POLLOUT and POLLWRNORM,
	and put the definition clearly on poll(2).


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000219034955.75315.qmail>