X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-flock.c;h=96baa27314451f6530bffdf7701b93d9f6798394;hb=eb9e60e319faa80e5d0b8a196970191aec1cdcd7;hp=7dcb94f054a8f4c7bb98f6f16a03730bb07429ef;hpb=b2e2010c7c902235b5efb5bd3c6529f61b093aa4;p=gnulib.git diff --git a/tests/test-flock.c b/tests/test-flock.c index 7dcb94f05..96baa2731 100644 --- a/tests/test-flock.c +++ b/tests/test-flock.c @@ -1,5 +1,5 @@ /* Test of flock() function. - Copyright (C) 2008-2010 Free Software Foundation, Inc. + Copyright (C) 2008-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,9 +58,31 @@ test_exclusive (const char *file, int fd) fd2 = open (file, O_RDWR, 0644); ASSERT (fd2 >= 0); - r = flock (fd2, LOCK_SH | LOCK_NB); + r = flock (fd2, LOCK_EX | LOCK_NB); ASSERT (r == -1); /* Was unable to acquire a second exclusive lock. */ +#if 0 + /* The Linux manual page of flock(2) says: + "A process may only hold one type of lock (shared or exclusive) on a + file. Subsequent flock() calls on an already locked file will convert + an existing lock to the new lock mode." + So, the call below should convert the exclusive lock for fd to a shared + and thus succeeds. The fact that it doesn't but instead fails is + apparently a bug. */ + /* The Solaris manual page of flock(2) says: + "More than one process may hold a shared lock for a file at any given + time, but multiple exclusive, or both shared and exclusive, locks may + not exist simultaneously on a file. ... + Requesting a lock on an object that is already locked normally causes + the caller to block until the lock may be acquired. If LOCK_NB is + included in operation, then this will not happen; instead, the call + will fail and the error EWOULDBLOCK will be returned." + So, the call below should fail and set errno to EWOULDBLOCK. The fact + that it succeeds is apparently a bug. */ + r = flock (fd2, LOCK_SH | LOCK_NB); + ASSERT (r == -1); +#endif + ASSERT (flock (fd, LOCK_UN) == 0); ASSERT (close (fd2) == 0); } @@ -76,7 +98,9 @@ main (int argc, char *argv[]) ASSERT (fd >= 0); ASSERT (write (fd, "hello", 5) == 5); - /* Some impossible operation codes which should never be accepted. */ +#if defined __linux__ + /* Invalid operation codes are rejected by the Linux implementation and by + the gnulib replacement, but not by the MacOS X implementation. */ ASSERT (flock (fd, LOCK_SH | LOCK_EX) == -1); ASSERT (errno == EINVAL); ASSERT (flock (fd, LOCK_SH | LOCK_UN) == -1); @@ -85,6 +109,7 @@ main (int argc, char *argv[]) ASSERT (errno == EINVAL); ASSERT (flock (fd, 0) == -1); ASSERT (errno == EINVAL); +#endif test_shared (file, fd); test_exclusive (file, fd);