usr/src/lib/brand/lx/lx_brand/common/fcntl.c
author kucharsk
Tue, 15 May 2007 07:40:20 -0700
changeset 4240 f99fb5ec78a4
parent 2712 f74a135872bc
child 4733 1966c7fad027
permissions -rw-r--r--
6556585 lx brand emulation library incorrectly translates F_SETOWN
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     1
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     2
 * CDDL HEADER START
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     3
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     7
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    11
 * and limitations under the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    12
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    18
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    19
 * CDDL HEADER END
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    20
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    21
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    22
/*
4240
f99fb5ec78a4 6556585 lx brand emulation library incorrectly translates F_SETOWN
kucharsk
parents: 2712
diff changeset
    23
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    24
 * Use is subject to license terms.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    25
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    26
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    27
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    28
#pragma ident	"%Z%%M%	%I%	%E% SMI"
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    29
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    30
#include <sys/types.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    31
#include <sys/filio.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    32
#include <unistd.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    33
#include <fcntl.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    34
#include <stropts.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    35
#include <libintl.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    36
#include <errno.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    37
#include <string.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    38
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    39
#include <sys/lx_fcntl.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    40
#include <sys/lx_debug.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    41
#include <sys/lx_misc.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    42
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    43
static int lx_fcntl_com(int fd, int cmd, ulong_t arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    44
static void ltos_flock(struct lx_flock *l, struct flock *s);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    45
static void stol_flock(struct flock *s, struct lx_flock *l);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    46
static void ltos_flock64(struct lx_flock64 *l, struct flock64 *s);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    47
static void stol_flock64(struct flock64 *s, struct lx_flock64 *l);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    48
static short ltos_type(short l_type);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    49
static short stol_type(short l_type);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    50
static int lx_fcntl_getfl(int fd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    51
static int lx_fcntl_setfl(int fd, ulong_t arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    52
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    53
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    54
lx_dup2(uintptr_t p1, uintptr_t p2)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    55
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    56
	int oldfd = (int)p1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    57
	int newfd = (int)p2;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    58
	int rc;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    59
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    60
	rc = fcntl(oldfd, F_DUP2FD, newfd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    61
	return ((rc == -1) ? -errno : rc);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    62
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    63
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    64
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    65
lx_fcntl(uintptr_t p1, uintptr_t p2, uintptr_t p3)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    66
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    67
	int		fd = (int)p1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    68
	int		cmd = (int)p2;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    69
	ulong_t		arg = (ulong_t)p3;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    70
	struct lx_flock lxflk;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    71
	struct flock	fl;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    72
	int		lk = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    73
	int		rc;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    74
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    75
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    76
	 * The 64-bit fcntl commands must go through fcntl64().
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    77
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    78
	if (cmd == LX_F_GETLK64 || cmd == LX_F_SETLK64 ||
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    79
	    cmd == LX_F_SETLKW64)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    80
		return (-EINVAL);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    81
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    82
	if (cmd == LX_F_SETSIG || cmd == LX_F_GETSIG || cmd == LX_F_SETLEASE ||
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    83
	    cmd == LX_F_GETLEASE) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    84
		lx_unsupported(gettext("%s(): unsupported command: %d"),
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    85
		    "fcntl", cmd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    86
		return (-ENOTSUP);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    87
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    88
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    89
	if (cmd == LX_F_GETLK || cmd == LX_F_SETLK ||
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    90
	    cmd == LX_F_SETLKW) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    91
		if (uucopy((void *)p3, (void *)&lxflk,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    92
		    sizeof (struct lx_flock)) != 0)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    93
			return (-errno);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    94
		lk = 1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    95
		ltos_flock(&lxflk, &fl);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    96
		arg = (ulong_t)&fl;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    97
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    98
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    99
	rc = lx_fcntl_com(fd, cmd, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   100
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   101
	if (lk)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   102
		stol_flock(&fl, (struct lx_flock *)p3);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   103
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   104
	return (rc);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   105
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   106
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   107
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   108
lx_fcntl64(uintptr_t p1, uintptr_t p2, uintptr_t p3)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   109
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   110
	int		fd = (int)p1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   111
	int		cmd = (int)p2;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   112
	struct lx_flock lxflk;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   113
	struct lx_flock64 lxflk64;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   114
	struct flock	fl;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   115
	struct flock64	fl64;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   116
	int		rc;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   117
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   118
	if (cmd == LX_F_SETSIG || cmd == LX_F_GETSIG || cmd == LX_F_SETLEASE ||
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   119
	    cmd == LX_F_GETLEASE) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   120
		lx_unsupported(gettext("%s(): unsupported command: %d"),
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   121
		    "fcntl64", cmd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   122
		return (-ENOTSUP);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   123
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   124
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   125
	if (cmd == LX_F_GETLK || cmd == LX_F_SETLK || cmd == LX_F_SETLKW) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   126
		if (uucopy((void *)p3, (void *)&lxflk,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   127
		    sizeof (struct lx_flock)) != 0)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   128
			return (-errno);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   129
		ltos_flock(&lxflk, &fl);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   130
		rc = lx_fcntl_com(fd, cmd, (ulong_t)&fl);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   131
		stol_flock(&fl, (struct lx_flock *)p3);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   132
	} else if (cmd == LX_F_GETLK64 || cmd == LX_F_SETLKW64 || \
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   133
	    cmd == LX_F_SETLK64) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   134
		if (uucopy((void *)p3, (void *)&lxflk64,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   135
		    sizeof (struct lx_flock64)) != 0)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   136
			return (-errno);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   137
		ltos_flock64(&lxflk64, &fl64);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   138
		rc = lx_fcntl_com(fd, cmd, (ulong_t)&fl64);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   139
		stol_flock64(&fl64, (struct lx_flock64 *)p3);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   140
	} else {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   141
		rc = lx_fcntl_com(fd, cmd, (ulong_t)p3);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   142
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   143
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   144
	return (rc);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   145
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   146
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   147
static int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   148
lx_fcntl_com(int fd, int cmd, ulong_t arg)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   149
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   150
	int		rc = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   151
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   152
	switch (cmd) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   153
	case LX_F_DUPFD:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   154
		rc = fcntl(fd, F_DUPFD, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   155
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   156
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   157
	case LX_F_GETFD:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   158
		rc = fcntl(fd, F_GETFD, 0);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   159
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   160
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   161
	case LX_F_SETFD:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   162
		rc = fcntl(fd, F_SETFD, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   163
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   164
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   165
	case LX_F_GETFL:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   166
		rc = lx_fcntl_getfl(fd);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   167
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   168
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   169
	case LX_F_SETFL:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   170
		rc = lx_fcntl_setfl(fd, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   171
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   172
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   173
	case LX_F_GETLK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   174
		rc = fcntl(fd, F_GETLK, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   175
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   176
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   177
	case LX_F_SETLK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   178
		rc = fcntl(fd, F_SETLK, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   179
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   180
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   181
	case LX_F_SETLKW:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   182
		rc = fcntl(fd, F_SETLKW, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   183
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   184
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   185
	case LX_F_GETLK64:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   186
		rc = fcntl(fd, F_GETLK64, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   187
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   188
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   189
	case LX_F_SETLK64:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   190
		rc = fcntl(fd, F_SETLK64, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   191
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   192
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   193
	case LX_F_SETLKW64:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   194
		rc = fcntl(fd, F_SETLKW64, arg);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   195
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   196
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   197
	case LX_F_SETOWN:
4240
f99fb5ec78a4 6556585 lx brand emulation library incorrectly translates F_SETOWN
kucharsk
parents: 2712
diff changeset
   198
		rc = fcntl(fd, F_SETOWN, arg);
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   199
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   200
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   201
	case LX_F_GETOWN:
4240
f99fb5ec78a4 6556585 lx brand emulation library incorrectly translates F_SETOWN
kucharsk
parents: 2712
diff changeset
   202
		rc = fcntl(fd, F_GETOWN, arg);
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   203
		break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   204
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   205
	default:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   206
		return (-EINVAL);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   207
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   208
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   209
	return ((rc == -1) ? -errno : rc);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   210
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   211
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   212
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   213
#define	LTOS_FLOCK(l, s)						\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   214
{									\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   215
	s->l_type = ltos_type(l->l_type);				\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   216
	s->l_whence = l->l_whence;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   217
	s->l_start = l->l_start;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   218
	s->l_len = l->l_len;						\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   219
	s->l_sysid = 0;			/* not defined in linux */	\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   220
	s->l_pid = (pid_t)l->l_pid;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   221
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   222
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   223
#define	STOL_FLOCK(s, l)						\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   224
{									\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   225
	l->l_type = stol_type(s->l_type);				\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   226
	l->l_whence = s->l_whence;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   227
	l->l_start = s->l_start;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   228
	l->l_len = s->l_len;						\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   229
	l->l_pid = (int)s->l_pid;					\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   230
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   231
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   232
static void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   233
ltos_flock(struct lx_flock *l, struct flock *s)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   234
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   235
	LTOS_FLOCK(l, s)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   236
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   237
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   238
static void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   239
stol_flock(struct flock *s, struct lx_flock *l)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   240
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   241
	STOL_FLOCK(s, l)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   242
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   243
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   244
static void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   245
ltos_flock64(struct lx_flock64 *l, struct flock64 *s)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   246
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   247
	LTOS_FLOCK(l, s)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   248
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   249
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   250
static void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   251
stol_flock64(struct flock64 *s, struct lx_flock64 *l)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   252
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   253
	STOL_FLOCK(s, l)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   254
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   255
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   256
static short
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   257
ltos_type(short l_type)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   258
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   259
	switch (l_type) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   260
	case LX_F_RDLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   261
		return (F_RDLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   262
	case LX_F_WRLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   263
		return (F_WRLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   264
	case LX_F_UNLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   265
		return (F_UNLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   266
	default:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   267
		return (-1);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   268
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   269
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   270
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   271
static short
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   272
stol_type(short l_type)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   273
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   274
	switch (l_type) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   275
	case F_RDLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   276
		return (LX_F_RDLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   277
	case F_WRLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   278
		return (LX_F_WRLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   279
	case F_UNLCK:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   280
		return (LX_F_UNLCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   281
	default:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   282
		/* can't ever happen */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   283
		return (0);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   284
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   285
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   286
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   287
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   288
lx_fcntl_getfl(int fd)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   289
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   290
	int retval;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   291
	int rc;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   292
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   293
	retval = fcntl(fd, F_GETFL, 0);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   294
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   295
	if ((retval & O_ACCMODE) == O_RDONLY)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   296
		rc = LX_O_RDONLY;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   297
	else if ((retval & O_ACCMODE) == O_WRONLY)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   298
		rc = LX_O_WRONLY;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   299
	else
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   300
		rc = LX_O_RDWR;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   301
	/* O_NDELAY != O_NONBLOCK, so we need to check for both */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   302
	if (retval & O_NDELAY)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   303
		rc |= LX_O_NDELAY;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   304
	if (retval & O_NONBLOCK)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   305
		rc |= LX_O_NONBLOCK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   306
	if (retval & O_APPEND)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   307
		rc |= LX_O_APPEND;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   308
	if (retval & O_SYNC)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   309
		rc |= LX_O_SYNC;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   310
	if (retval & O_LARGEFILE)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   311
		rc |= LX_O_LARGEFILE;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   312
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   313
	return (rc);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   314
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   315
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   316
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   317
lx_fcntl_setfl(int fd, ulong_t arg)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   318
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   319
	int new_arg;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   320
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   321
	new_arg = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   322
	/* LX_O_NDELAY == LX_O_NONBLOCK, so we only check for one */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   323
	if (arg & LX_O_NDELAY)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   324
		new_arg |= O_NONBLOCK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   325
	if (arg & LX_O_APPEND)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   326
		new_arg |= O_APPEND;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   327
	if (arg & LX_O_SYNC)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   328
		new_arg |= O_SYNC;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   329
	if (arg & LX_O_LARGEFILE)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   330
		new_arg |= O_LARGEFILE;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   331
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   332
	return ((fcntl(fd, F_SETFL, new_arg) == 0) ? 0 : -errno);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   333
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   334
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   335
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   336
 * flock() applies or removes an advisory lock on the file
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   337
 * associated with the file descriptor fd.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   338
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   339
 * Stolen verbatim from usr/src/ucblib/libucb/port/sys/flock.c
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   340
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   341
 * operation is: LX_LOCK_SH, LX_LOCK_EX, LX_LOCK_UN, LX_LOCK_NB
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   342
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   343
int
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   344
lx_flock(uintptr_t p1, uintptr_t p2)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   345
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   346
	int			fd = (int)p1;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   347
	int			operation = (int)p2;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   348
	struct flock		fl;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   349
	int			cmd;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   350
	int			ret;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   351
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   352
	/* In non-blocking lock, use F_SETLK for cmd, F_SETLKW otherwise */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   353
	if (operation & LX_LOCK_NB) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   354
		cmd = F_SETLK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   355
		operation &= ~LX_LOCK_NB; /* turn off this bit */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   356
	} else
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   357
		cmd = F_SETLKW;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   358
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   359
	switch (operation) {
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   360
		case LX_LOCK_UN:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   361
			fl.l_type = F_UNLCK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   362
			break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   363
		case LX_LOCK_SH:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   364
			fl.l_type = F_RDLCK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   365
			break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   366
		case LX_LOCK_EX:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   367
			fl.l_type = F_WRLCK;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   368
			break;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   369
		default:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   370
			return (-EINVAL);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   371
	}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   372
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   373
	fl.l_whence = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   374
	fl.l_start = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   375
	fl.l_len = 0;
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   376
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   377
	ret = fcntl(fd, cmd, &fl);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   378
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   379
	if (ret == -1 && errno == EACCES)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   380
		return (-EWOULDBLOCK);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   381
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   382
	return ((ret == -1) ? -errno : ret);
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   383
}