17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 237c478bd9Sstevel@tonic-gate * Copyright 1989 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate /* Copyright (c) 1984 AT&T */ 287c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate #include <fcntl.h> 337c478bd9Sstevel@tonic-gate #include <unistd.h> 347c478bd9Sstevel@tonic-gate #include <errno.h> 357c478bd9Sstevel@tonic-gate #include <sys/syscall.h> 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate /* 387c478bd9Sstevel@tonic-gate * convert lockf() into fcntl() for SystemV compatibility 397c478bd9Sstevel@tonic-gate */ 407c478bd9Sstevel@tonic-gate 417c478bd9Sstevel@tonic-gate /* New SVR4 values */ 427c478bd9Sstevel@tonic-gate #define SV_GETLK 5 437c478bd9Sstevel@tonic-gate #define SV_SETLK 6 447c478bd9Sstevel@tonic-gate #define SV_SETLKW 7 457c478bd9Sstevel@tonic-gate 46*5d54f3d8Smuffin int 47*5d54f3d8Smuffin lockf(int fildes, int function, long size) 487c478bd9Sstevel@tonic-gate { 497c478bd9Sstevel@tonic-gate struct flock ld; 50*5d54f3d8Smuffin int cmd; 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate cmd = SV_SETLK; /* assume non-blocking operation */ 537c478bd9Sstevel@tonic-gate ld.l_type = F_WRLCK; /* lockf() only deals with exclusive locks */ 547c478bd9Sstevel@tonic-gate ld.l_whence = 1; /* lock always starts at current position */ 557c478bd9Sstevel@tonic-gate if (size < 0) { 567c478bd9Sstevel@tonic-gate ld.l_start = size; 577c478bd9Sstevel@tonic-gate ld.l_len = -size; 587c478bd9Sstevel@tonic-gate } else { 597c478bd9Sstevel@tonic-gate ld.l_start = 0L; 607c478bd9Sstevel@tonic-gate ld.l_len = size; 617c478bd9Sstevel@tonic-gate } 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate switch (function) { 647c478bd9Sstevel@tonic-gate case F_TEST: 657c478bd9Sstevel@tonic-gate if (_syscall(SYS_fcntl, fildes, SV_GETLK, &ld) != -1) { 667c478bd9Sstevel@tonic-gate if (ld.l_type == F_UNLCK) { 677c478bd9Sstevel@tonic-gate ld.l_pid = ld.l_xxx; 687c478bd9Sstevel@tonic-gate /* l_pid is the last field in the 697c478bd9Sstevel@tonic-gate SVr3 flock structure */ 707c478bd9Sstevel@tonic-gate return (0); 717c478bd9Sstevel@tonic-gate } else 727c478bd9Sstevel@tonic-gate errno = EACCES; /* EAGAIN ?? */ 737c478bd9Sstevel@tonic-gate } 747c478bd9Sstevel@tonic-gate return (-1); 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate default: 777c478bd9Sstevel@tonic-gate errno = EINVAL; 787c478bd9Sstevel@tonic-gate return (-1); 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate /* the rest fall thru to the fcntl() at the end */ 817c478bd9Sstevel@tonic-gate case F_ULOCK: 827c478bd9Sstevel@tonic-gate ld.l_type = F_UNLCK; 837c478bd9Sstevel@tonic-gate break; 847c478bd9Sstevel@tonic-gate 857c478bd9Sstevel@tonic-gate case F_LOCK: 867c478bd9Sstevel@tonic-gate cmd = SV_SETLKW; /* block, if not available */ 877c478bd9Sstevel@tonic-gate break; 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate case F_TLOCK: 907c478bd9Sstevel@tonic-gate break; 917c478bd9Sstevel@tonic-gate } 927c478bd9Sstevel@tonic-gate if (_syscall(SYS_fcntl, fildes, cmd, &ld) == -1) { 937c478bd9Sstevel@tonic-gate switch (errno) { 947c478bd9Sstevel@tonic-gate /* this hack is purported to be for /usr/group compatibility */ 957c478bd9Sstevel@tonic-gate case ENOLCK: 967c478bd9Sstevel@tonic-gate errno = EDEADLK; 977c478bd9Sstevel@tonic-gate } 987c478bd9Sstevel@tonic-gate return(-1); 997c478bd9Sstevel@tonic-gate } else { 1007c478bd9Sstevel@tonic-gate ld.l_pid = ld.l_xxx; /* l_pid is the last field in the 1017c478bd9Sstevel@tonic-gate SVr3 flock structure */ 1027c478bd9Sstevel@tonic-gate return(0); 1037c478bd9Sstevel@tonic-gate } 1047c478bd9Sstevel@tonic-gate } 105