1*d7847a8dSBrooks Davis /* $NetBSD: lockf.c,v 1.3 2008/04/28 20:22:59 martin Exp $ */ 2*d7847a8dSBrooks Davis /*- 3*d7847a8dSBrooks Davis * SPDX-License-Identifier: BSD-2-Clause 4*d7847a8dSBrooks Davis * 5*d7847a8dSBrooks Davis * Copyright (c) 1997 The NetBSD Foundation, Inc. 6*d7847a8dSBrooks Davis * All rights reserved. 7*d7847a8dSBrooks Davis * 8*d7847a8dSBrooks Davis * This code is derived from software contributed to The NetBSD Foundation 9*d7847a8dSBrooks Davis * by Klaus Klein. 10*d7847a8dSBrooks Davis * 11*d7847a8dSBrooks Davis * Redistribution and use in source and binary forms, with or without 12*d7847a8dSBrooks Davis * modification, are permitted provided that the following conditions 13*d7847a8dSBrooks Davis * are met: 14*d7847a8dSBrooks Davis * 1. Redistributions of source code must retain the above copyright 15*d7847a8dSBrooks Davis * notice, this list of conditions and the following disclaimer. 16*d7847a8dSBrooks Davis * 2. Redistributions in binary form must reproduce the above copyright 17*d7847a8dSBrooks Davis * notice, this list of conditions and the following disclaimer in the 18*d7847a8dSBrooks Davis * documentation and/or other materials provided with the distribution. 19*d7847a8dSBrooks Davis * 20*d7847a8dSBrooks Davis * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21*d7847a8dSBrooks Davis * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22*d7847a8dSBrooks Davis * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23*d7847a8dSBrooks Davis * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24*d7847a8dSBrooks Davis * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25*d7847a8dSBrooks Davis * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26*d7847a8dSBrooks Davis * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*d7847a8dSBrooks Davis * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*d7847a8dSBrooks Davis * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29*d7847a8dSBrooks Davis * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30*d7847a8dSBrooks Davis * POSSIBILITY OF SUCH DAMAGE. 31*d7847a8dSBrooks Davis */ 32*d7847a8dSBrooks Davis 33*d7847a8dSBrooks Davis #include "namespace.h" 34*d7847a8dSBrooks Davis #include <errno.h> 35*d7847a8dSBrooks Davis #include <fcntl.h> 36*d7847a8dSBrooks Davis #include <unistd.h> 37*d7847a8dSBrooks Davis #include "un-namespace.h" 38*d7847a8dSBrooks Davis #include "libc_private.h" 39*d7847a8dSBrooks Davis 40*d7847a8dSBrooks Davis int 41*d7847a8dSBrooks Davis lockf(int filedes, int function, off_t size) 42*d7847a8dSBrooks Davis { 43*d7847a8dSBrooks Davis struct flock fl; 44*d7847a8dSBrooks Davis int cmd; 45*d7847a8dSBrooks Davis 46*d7847a8dSBrooks Davis fl.l_start = 0; 47*d7847a8dSBrooks Davis fl.l_len = size; 48*d7847a8dSBrooks Davis fl.l_whence = SEEK_CUR; 49*d7847a8dSBrooks Davis 50*d7847a8dSBrooks Davis switch (function) { 51*d7847a8dSBrooks Davis case F_ULOCK: 52*d7847a8dSBrooks Davis cmd = F_SETLK; 53*d7847a8dSBrooks Davis fl.l_type = F_UNLCK; 54*d7847a8dSBrooks Davis break; 55*d7847a8dSBrooks Davis case F_LOCK: 56*d7847a8dSBrooks Davis cmd = F_SETLKW; 57*d7847a8dSBrooks Davis fl.l_type = F_WRLCK; 58*d7847a8dSBrooks Davis break; 59*d7847a8dSBrooks Davis case F_TLOCK: 60*d7847a8dSBrooks Davis cmd = F_SETLK; 61*d7847a8dSBrooks Davis fl.l_type = F_WRLCK; 62*d7847a8dSBrooks Davis break; 63*d7847a8dSBrooks Davis case F_TEST: 64*d7847a8dSBrooks Davis fl.l_type = F_WRLCK; 65*d7847a8dSBrooks Davis if (((int (*)(int, int, ...)) 66*d7847a8dSBrooks Davis *(__libc_interposing_slot(INTERPOS_fcntl))) 67*d7847a8dSBrooks Davis (filedes, F_GETLK, &fl) == -1) 68*d7847a8dSBrooks Davis return (-1); 69*d7847a8dSBrooks Davis if (fl.l_type == F_UNLCK || (fl.l_sysid == 0 && 70*d7847a8dSBrooks Davis fl.l_pid == getpid())) 71*d7847a8dSBrooks Davis return (0); 72*d7847a8dSBrooks Davis errno = EAGAIN; 73*d7847a8dSBrooks Davis return (-1); 74*d7847a8dSBrooks Davis /* NOTREACHED */ 75*d7847a8dSBrooks Davis default: 76*d7847a8dSBrooks Davis errno = EINVAL; 77*d7847a8dSBrooks Davis return (-1); 78*d7847a8dSBrooks Davis /* NOTREACHED */ 79*d7847a8dSBrooks Davis } 80*d7847a8dSBrooks Davis 81*d7847a8dSBrooks Davis return (((int (*)(int, int, ...)) 82*d7847a8dSBrooks Davis *(__libc_interposing_slot(INTERPOS_fcntl)))(filedes, cmd, &fl)); 83*d7847a8dSBrooks Davis } 84