From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13177 invoked by alias); 18 Feb 2012 21:52:12 -0000 Received: (qmail 13168 invoked by uid 22791); 18 Feb 2012 21:52:11 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,TW_FC X-Spam-Check-By: sourceware.org Received: from qmta07.westchester.pa.mail.comcast.net (HELO qmta07.westchester.pa.mail.comcast.net) (76.96.62.64) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 18 Feb 2012 21:51:50 +0000 Received: from omta17.westchester.pa.mail.comcast.net ([76.96.62.89]) by qmta07.westchester.pa.mail.comcast.net with comcast id bZcn1i0021vXlb857ZrqAy; Sat, 18 Feb 2012 21:51:50 +0000 Received: from mail.daveroth.dyndns.org ([24.22.184.108]) by omta17.westchester.pa.mail.comcast.net with comcast id bZrp1i00L2LkTg83dZrqvn; Sat, 18 Feb 2012 21:51:50 +0000 Received: from [10.249.1.104] (tela64.daveroth.dyndns.org [10.249.1.104]) (authenticated bits=0) by mail.daveroth.dyndns.org (8.14.3/8.14.3/Debian-9.4) with ESMTP id q1ILpk9E023347 for ; Sat, 18 Feb 2012 13:51:46 -0800 Message-ID: <4F401D73.7010908@acm.org> Date: Sat, 18 Feb 2012 21:52:00 -0000 From: David Rothenberger User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 MIME-Version: 1.0 To: cygwin@cygwin.com Subject: Re: STC for libapr1 failure References: <20120214182452.GK25918@calimero.vinschen.de> <4F3AD58A.9040106@acm.org> <20120215153851.GQ25918@calimero.vinschen.de> <4F3C09D9.6000406@acm.org> <20120215204521.GB27454@calimero.vinschen.de> <4F3C208B.2060007@acm.org> <20120215212010.GA4183@calimero.vinschen.de> <4F3C2E35.3080308@acm.org> <20120216140932.GI19092@calimero.vinschen.de> <4F3D2748.8080205@acm.org> <20120216160458.GK19092@calimero.vinschen.de> In-Reply-To: <20120216160458.GK19092@calimero.vinschen.de> Content-Type: multipart/mixed; boundary="------------090003090902050204080406" X-IsSubscribed: yes Reply-To: cygwin@cygwin.com Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com X-SW-Source: 2012-02/txt/msg00551.txt.bz2 --------------090003090902050204080406 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 1234 On 2/16/2012 8:04 AM, Corinna Vinschen wrote: > On Feb 16 07:56, David Rothenberger wrote: >> On 2/16/2012 6:09 AM, Corinna Vinschen wrote: >>> I read the Linux man page again (http://linux.die.net/man/2/flock) >>> and I just hacked the following testcase, based on your flock STC. >> >> That sounds pretty close to what the APR test case is doing, as far as I >> understand. >> >>> The testcase is attached. I'm pretty curious what your test is actually >>> testing. >> >> I got to work at my real job all last night, so couldn't extract the STC >> from the APR test suite. But, here's the test in APR-ese in case you're >> interested. I'll remove the APRisms as soon as I can to get you another >> test case. I've extracted the test case, which is attached. I must humbly apologize. The test case was actually using fcntl() for file locking, not flock(). I got thrown off by the name of the test: "testflock". It seems APR prefers fcntl() for file locking if available. The attached test works fine for me on Linux, but fails on Cygwin starting with the 20120215 snapshot. -- David Rothenberger ---- daveroth@acm.org "So why don't you make like a tree, and get outta here." -- Biff in "Back to the Future" --------------090003090902050204080406 Content-Type: text/plain; name="stc-fcntl-forkexec.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="stc-fcntl-forkexec.c" Content-length: 3531 /*********************************************************************** * This is a STC to show a process can get an exclusive lock on a file using * fcntl, even though another process has an exclusive lock. * * A parent process uses fcntl to get an exclusive lock. It then * uses fork/exec to spawn a child of itself, which also tries to get an * exclusive lock on the file. * * If all works correctly, the child should not be able to get the * lock. However, the child is able to get the lock. * * This test was extracted from the APR test suite. * * Compile: gcc -Wall -o stc-fcntl-forkexec stc-fcntl-forkexec.c ***********************************************************************/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #define TESTFILE "testfile.lock" error_t lock_file (int fd, int cmd) { int rc; struct flock l = { 0 }; int fc; l.l_whence = SEEK_SET; /* lock from current point */ l.l_start = 0; /* begin lock at this offset */ l.l_len = 0; /* lock to end of file */ l.l_type = F_WRLCK; fc = cmd; /* keep trying if fcntl() gets interrupted (by a signal) */ while ((rc = fcntl(fd, fc, &l)) < 0 && errno == EINTR) continue; if (rc == -1) { /* on some Unix boxes (e.g., Tru64), we get EACCES instead * of EAGAIN; we don't want APR_STATUS_IS_EAGAIN() matching EACCES * since that breaks other things, so fix up the retcode here */ if (errno == EACCES) { return EAGAIN; } return errno; } return 0; } /* The child */ void tryread () { int fd; error_t status; fd = open (TESTFILE, O_WRONLY, 0666); if (fd < 0) { perror ("child open failed"); exit (2); } status = lock_file (fd, F_SETLK); if (status == 0) exit(0); if (status == EAGAIN) exit(1); exit(2); } int main (int argc, const char *const *argv) { int fd; const char *args[3]; pid_t pid; pid_t pstatus; int exit_int; if (argc > 1) { /* Called to run the child. */ tryread (); fprintf (stderr, "Should not get here!\n"); return 2; } /* Create the lock file. */ fd = open (TESTFILE, O_WRONLY|O_CREAT, 0666); if (fd < 0) { perror ("open failed"); return 1; } /* Lock the file. */ if (lock_file (fd, F_SETLKW) != 0) { perror ("lock"); return 1; } /* Spawn the child reader */ if ((pid = fork ()) < 0) { perror ("fork"); return 1; } else if (pid == 0) { /* child */ args[0] = program_invocation_name; args[1] = "child"; args[2] = NULL; execl (program_invocation_name, program_invocation_name, "child", NULL); fprintf (stderr, "execv failed\n"); _exit (2); } /* Wait for the child. */ do { pstatus = waitpid (pid, &exit_int, WUNTRACED); } while (pstatus < 0 && errno == EINTR); if (WIFEXITED (exit_int)) { exit_int = WEXITSTATUS (exit_int); if (exit_int == 0) printf ("FAILED: Child was able to get a lock when it shouldn't.\n"); else if (exit_int == 1) printf ("SUCCESS: Child was not able to get the lock.\n"); else fprintf (stderr, "Unexpected error from child: %d\n", exit_int); } else fprintf (stderr, "Child did not terminate normally.\n"); /* Close the file */ close (fd); /* Clean up. */ unlink (TESTFILE); return 0; } --------------090003090902050204080406 Content-Type: text/plain; charset=us-ascii Content-length: 218 -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple --------------090003090902050204080406--