From owner-freebsd-bugs Wed Jul 12 9:50: 9 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 68DA837BAA9 for ; Wed, 12 Jul 2000 09:50:00 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id JAA67418; Wed, 12 Jul 2000 09:50:00 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from envy.vuurwerk.nl (envy.vuurwerk.nl [194.178.232.112]) by hub.freebsd.org (Postfix) with SMTP id 0513337B7F5 for ; Wed, 12 Jul 2000 09:46:13 -0700 (PDT) (envelope-from petervd@daemon.vuurwerk.nl) Received: (qmail 67794 invoked from network); 12 Jul 2000 16:46:01 -0000 Received: from kesteren.vuurwerk.nl (HELO daemon.vuurwerk.nl) (194.178.232.59) by envy.vuurwerk.nl with SMTP; 12 Jul 2000 16:46:01 -0000 Received: (nullmailer pid 96634 invoked by uid 11109); Wed, 12 Jul 2000 16:46:01 -0000 Message-Id: <963420361.560147.96633.nullmailer@daemon.vuurwerk.nl> Date: Wed, 12 Jul 2000 18:46:01 +0200 From: petervd@vuurwerk.nl Reply-To: petervd@vuurwerk.nl To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: gnu/19871: select bug on named pipes Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 19871 >Category: gnu >Synopsis: select on named pipes always returns 'available for reading' >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Jul 12 09:50:00 PDT 2000 >Closed-Date: >Last-Modified: >Originator: Peter van Dijk >Release: FreeBSD 4.0-STABLE i386 >Organization: Vuurwerk Internet, Haarlem, The Netherlands >Environment: Standard FreeBSD 4.0-STABLE kernel/world (last cvsup+new world/kernel around 3 months ago). >Description: When select()'ing on a named pipe for reading, it will *always* return immediately even if no data is waiting. *also* openening the pipe for writing will fix this behaviour. >How-To-Repeat: The following snippet of code is stolen from the qmail-1.03 sources and changed slightly to compile standalone: #include #include #include #include #include #define FN "temp-trynpbg1.fifo" void main() { int flagbug; struct timeval instant; fd_set rfds; flagbug = 0; if (mkfifo(FN,0600) != -1) { close(0); if (open(FN,O_RDONLY|O_NDELAY) == 0) { FD_ZERO(&rfds); FD_SET(0,&rfds); instant.tv_sec = instant.tv_usec = 0; if (select(1,&rfds,(fd_set *) 0,(fd_set *) 0,&instant) > 0) flagbug = 1; } unlink(FN); } _exit(!flagbug); } Compile with cc -o namedpipebug namedpipebug.c Run with './namedpipebug && echo buggy' Will echo 'buggy' on FreeBSD, and nothing on, for example, Linux. >Fix: The workaround is to also open the socket for writing, as can be seen in this piece of qmail-1.03 code (from trigger.c): static int fd = -1; #ifdef HASNAMEDPIPEBUG1 static int fdw = -1; #endif void trigger_set() { if (fd != -1) close(fd); #ifdef HASNAMEDPIPEBUG1 if (fdw != -1) close(fdw); #endif fd = open_read("lock/trigger"); #ifdef HASNAMEDPIPEBUG1 fdw = open_write("lock/trigger"); #endif } >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message