xref: /titanic_51/usr/src/lib/libc/port/gen/flock.c (revision 7a5aac98bc37534537d4896efd4efd30627d221e)
1*7a5aac98SJerry Jelinek /*
2*7a5aac98SJerry Jelinek  * This file and its contents are supplied under the terms of the
3*7a5aac98SJerry Jelinek  * Common Development and Distribution License ("CDDL"), version 1.0.
4*7a5aac98SJerry Jelinek  * You may only use this file in accordance with the terms of version
5*7a5aac98SJerry Jelinek  * 1.0 of the CDDL.
6*7a5aac98SJerry Jelinek  *
7*7a5aac98SJerry Jelinek  * A full copy of the text of the CDDL should have accompanied this
8*7a5aac98SJerry Jelinek  * source.  A copy of the CDDL is also available via the Internet at
9*7a5aac98SJerry Jelinek  * http://www.illumos.org/license/CDDL.
10*7a5aac98SJerry Jelinek  */
11*7a5aac98SJerry Jelinek 
12*7a5aac98SJerry Jelinek /*
13*7a5aac98SJerry Jelinek  * Copyright 2015 Joyent, Inc.
14*7a5aac98SJerry Jelinek  */
15*7a5aac98SJerry Jelinek 
16*7a5aac98SJerry Jelinek #include <sys/feature_tests.h>
17*7a5aac98SJerry Jelinek 
18*7a5aac98SJerry Jelinek #include "lint.h"
19*7a5aac98SJerry Jelinek #include <sys/types.h>
20*7a5aac98SJerry Jelinek #include <sys/file.h>
21*7a5aac98SJerry Jelinek #include <unistd.h>
22*7a5aac98SJerry Jelinek #include <errno.h>
23*7a5aac98SJerry Jelinek #include <fcntl.h>
24*7a5aac98SJerry Jelinek 
25*7a5aac98SJerry Jelinek int
26*7a5aac98SJerry Jelinek flock(int fildes, int operation)
27*7a5aac98SJerry Jelinek {
28*7a5aac98SJerry Jelinek 	struct flock64 l;
29*7a5aac98SJerry Jelinek 	int op;
30*7a5aac98SJerry Jelinek 	int rv;
31*7a5aac98SJerry Jelinek 
32*7a5aac98SJerry Jelinek 	l.l_whence = SEEK_SET;
33*7a5aac98SJerry Jelinek 	l.l_start = 0;
34*7a5aac98SJerry Jelinek 	l.l_len = 0;
35*7a5aac98SJerry Jelinek 	l.l_sysid = 0;
36*7a5aac98SJerry Jelinek 	l.l_pid = 0;
37*7a5aac98SJerry Jelinek 
38*7a5aac98SJerry Jelinek 	switch (operation & ~LOCK_NB) {
39*7a5aac98SJerry Jelinek 	case LOCK_UN:
40*7a5aac98SJerry Jelinek 		if (operation & LOCK_NB) {
41*7a5aac98SJerry Jelinek 			errno = EINVAL;
42*7a5aac98SJerry Jelinek 			return (-1);
43*7a5aac98SJerry Jelinek 		}
44*7a5aac98SJerry Jelinek 		l.l_type = F_UNLCK;
45*7a5aac98SJerry Jelinek 		rv = fcntl(fildes, F_FLOCK, &l);
46*7a5aac98SJerry Jelinek 		break;
47*7a5aac98SJerry Jelinek 	case LOCK_EX:
48*7a5aac98SJerry Jelinek 	case LOCK_SH:
49*7a5aac98SJerry Jelinek 		l.l_type = ((operation & ~LOCK_NB) == LOCK_EX) ?
50*7a5aac98SJerry Jelinek 		    F_WRLCK : F_RDLCK;
51*7a5aac98SJerry Jelinek 		op = (operation & LOCK_NB) ? F_FLOCK : F_FLOCKW;
52*7a5aac98SJerry Jelinek 		rv = fcntl(fildes, op, &l);
53*7a5aac98SJerry Jelinek 		break;
54*7a5aac98SJerry Jelinek 	default:
55*7a5aac98SJerry Jelinek 		errno = EINVAL;
56*7a5aac98SJerry Jelinek 		return (-1);
57*7a5aac98SJerry Jelinek 	}
58*7a5aac98SJerry Jelinek 
59*7a5aac98SJerry Jelinek 	return (rv);
60*7a5aac98SJerry Jelinek }
61