tests: fix license on several tests
[gnulib.git] / tests / test-flock.c
1 /* Test of flock() function.
2    Copyright (C) 2008-2009 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 #include <config.h>
18
19 #include <sys/file.h>
20
21 #include "signature.h"
22 SIGNATURE_CHECK (flock, int, (int, int));
23
24 #include <fcntl.h>
25 #include <unistd.h>
26 #include <errno.h>
27
28 #include "macros.h"
29
30 static void
31 test_shared (const char *file, int fd)
32 {
33   /* Should be able to acquire several shared locks on a file, through
34    * different file table entries.
35    */
36   int fd2, r;
37
38   ASSERT (flock (fd, LOCK_SH) == 0);
39
40   fd2 = open (file, O_RDWR, 0644);
41   ASSERT (fd2 >= 0);
42
43   r = flock (fd2, LOCK_SH | LOCK_NB);
44   ASSERT (r == 0);              /* Was able to acquire a second shared lock. */
45
46   ASSERT (flock (fd, LOCK_UN) == 0);
47   ASSERT (close (fd2) == 0);
48 }
49
50 static void
51 test_exclusive (const char *file, int fd)
52 {
53   /* Should not be able to acquire more than one exclusive lock on a file. */
54   int fd2, r;
55
56   ASSERT (flock (fd, LOCK_EX) == 0);
57
58   fd2 = open (file, O_RDWR, 0644);
59   ASSERT (fd2 >= 0);
60
61   r = flock (fd2, LOCK_SH | LOCK_NB);
62   ASSERT (r == -1);             /* Was unable to acquire a second exclusive lock. */
63
64   ASSERT (flock (fd, LOCK_UN) == 0);
65   ASSERT (close (fd2) == 0);
66 }
67
68 int
69 main (int argc, char *argv[])
70 {
71   int fd;
72   const char *file = "test-flock.txt";
73
74   /* Open a non-empty file for testing. */
75   fd = open (file, O_RDWR | O_CREAT | O_TRUNC, 0644);
76   ASSERT (fd >= 0);
77   ASSERT (write (fd, "hello", 5) == 5);
78
79   /* Some impossible operation codes which should never be accepted. */
80   ASSERT (flock (fd, LOCK_SH | LOCK_EX) == -1);
81   ASSERT (errno == EINVAL);
82   ASSERT (flock (fd, LOCK_SH | LOCK_UN) == -1);
83   ASSERT (errno == EINVAL);
84   ASSERT (flock (fd, LOCK_EX | LOCK_UN) == -1);
85   ASSERT (errno == EINVAL);
86   ASSERT (flock (fd, 0) == -1);
87   ASSERT (errno == EINVAL);
88
89   test_shared (file, fd);
90   test_exclusive (file, fd);
91
92   /* Close and remove the test file. */
93   ASSERT (close (fd) == 0);
94   ASSERT (unlink (file) == 0);
95
96   return 0;
97 }