1#ifndef LOCK_DEV
2#define LOCK_DEV
3
4/*  Copyright 2005,2009 Alain Knaff.
5 *  This file is part of mtools.
6 *
7 *  Mtools is free software: you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation, either version 3 of the License, or
10 *  (at your option) any later version.
11 *
12 *  Mtools is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *
17 *  You should have received a copy of the GNU General Public License
18 *  along with Mtools.  If not, see <http://www.gnu.org/licenses/>.
19 *
20 * Create an advisory lock on the device to prevent concurrent writes.
21 * Uses either lockf, flock, or fcntl locking methods.  See the Makefile
22 * and the Configure files for how to specify the proper method.
23 */
24
25int lock_dev(int fd, int mode, struct device *dev)
26{
27#if (defined(HAVE_FLOCK) && defined (LOCK_EX) && defined(LOCK_NB))
28	/**/
29#else /* FLOCK */
30
31#if (defined(HAVE_LOCKF) && defined(F_TLOCK))
32	/**/
33#else /* LOCKF */
34
35#if (defined(F_SETLK) && defined(F_WRLCK))
36	struct flock flk;
37
38#endif /* FCNTL */
39#endif /* LOCKF */
40#endif /* FLOCK */
41
42	if(IS_NOLOCK(dev))
43		return 0;
44
45#if (defined(HAVE_FLOCK) && defined (LOCK_EX) && defined(LOCK_NB))
46	if (flock(fd, (mode ? LOCK_EX : LOCK_SH)|LOCK_NB) < 0)
47#else /* FLOCK */
48
49#if (defined(HAVE_LOCKF) && defined(F_TLOCK))
50	if (mode && lockf(fd, F_TLOCK, 0) < 0)
51#else /* LOCKF */
52
53#if (defined(F_SETLK) && defined(F_WRLCK))
54	flk.l_type = mode ? F_WRLCK : F_RDLCK;
55	flk.l_whence = 0;
56	flk.l_start = 0L;
57	flk.l_len = 0L;
58
59	if (fcntl(fd, F_SETLK, &flk) < 0)
60#endif /* FCNTL */
61#endif /* LOCKF */
62#endif /* FLOCK */
63	{
64		if(errno == EINVAL
65#ifdef  EOPNOTSUPP
66		   || errno ==  EOPNOTSUPP
67#endif
68		  )
69			return 0;
70		else
71			return 1;
72	}
73	return 0;
74}
75
76
77#endif
78