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