xref: /aosp_15_r20/external/musl/src/misc/lockf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
2*c9945492SAndroid Build Coastguard Worker #include <fcntl.h>
3*c9945492SAndroid Build Coastguard Worker #include <errno.h>
4*c9945492SAndroid Build Coastguard Worker 
lockf(int fd,int op,off_t size)5*c9945492SAndroid Build Coastguard Worker int lockf(int fd, int op, off_t size)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	struct flock l = {
8*c9945492SAndroid Build Coastguard Worker 		.l_type = F_WRLCK,
9*c9945492SAndroid Build Coastguard Worker 		.l_whence = SEEK_CUR,
10*c9945492SAndroid Build Coastguard Worker 		.l_len = size,
11*c9945492SAndroid Build Coastguard Worker 	};
12*c9945492SAndroid Build Coastguard Worker 	switch (op) {
13*c9945492SAndroid Build Coastguard Worker 	case F_TEST:
14*c9945492SAndroid Build Coastguard Worker 		l.l_type = F_RDLCK;
15*c9945492SAndroid Build Coastguard Worker 		if (fcntl(fd, F_GETLK, &l) < 0)
16*c9945492SAndroid Build Coastguard Worker 			return -1;
17*c9945492SAndroid Build Coastguard Worker 		if (l.l_type == F_UNLCK || l.l_pid == getpid())
18*c9945492SAndroid Build Coastguard Worker 			return 0;
19*c9945492SAndroid Build Coastguard Worker 		errno = EACCES;
20*c9945492SAndroid Build Coastguard Worker 		return -1;
21*c9945492SAndroid Build Coastguard Worker 	case F_ULOCK:
22*c9945492SAndroid Build Coastguard Worker 		l.l_type = F_UNLCK;
23*c9945492SAndroid Build Coastguard Worker 	case F_TLOCK:
24*c9945492SAndroid Build Coastguard Worker 		return fcntl(fd, F_SETLK, &l);
25*c9945492SAndroid Build Coastguard Worker 	case F_LOCK:
26*c9945492SAndroid Build Coastguard Worker 		return fcntl(fd, F_SETLKW, &l);
27*c9945492SAndroid Build Coastguard Worker 	}
28*c9945492SAndroid Build Coastguard Worker 	errno = EINVAL;
29*c9945492SAndroid Build Coastguard Worker 	return -1;
30*c9945492SAndroid Build Coastguard Worker }
31