Whamcloud - gitweb
4c97e6371f39a53488241df30d78a0289f1c82e1
[fs/lustre-release.git] / lustre / tests / flocks_test.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see [sun.com URL with a
20  * copy of GPLv2].
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  */
36
37 #include <errno.h>
38 #include <fcntl.h>
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <unistd.h>
43
44 #include <sys/file.h>
45
46 void usage(void)
47 {
48         fprintf(stderr, "usage: ./flocks_test on|off -c|-f|-l /path/to/file\n");
49         exit(EXIT_FAILURE);
50 }
51
52 int main(int argc, char *argv[])
53 {
54         int fd;
55         int mount_with_flock = 0;
56         int error = 0;
57
58         if (argc != 4)
59                 usage();
60         
61         if (!strncmp(argv[1], "on", 3)) {
62                 mount_with_flock = 1;
63         } else if (!strncmp(argv[1], "off", 4)) {
64                 mount_with_flock = 0;
65         } else {
66                 usage();
67         }
68
69         if ((fd = open(argv[3], O_RDWR)) < 0) {
70                 fprintf(stderr, "Couldn't open file: %s\n", argv[2]);
71                 exit(EXIT_FAILURE);
72         }
73
74         if (!strncmp(argv[2], "-c", 3)) {
75                 struct flock fl;
76
77                 fl.l_type = F_RDLCK;
78                 fl.l_whence = SEEK_SET;
79                 fl.l_start = 0;
80                 fl.l_len = 1;
81
82                 error = fcntl(fd, F_SETLK, &fl);
83         } else if (!strncmp(argv[2], "-l", 3)) {
84                 error = lockf(fd, F_LOCK, 1);
85         } else if (!strncmp(argv[2], "-f", 3)) {
86                 error = flock(fd, LOCK_EX);
87         } else {
88                 usage();
89         }
90
91         if (mount_with_flock)
92                 return((error == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
93         else
94                 return((error == 0) ? EXIT_FAILURE : EXIT_SUCCESS);
95 }