[BACK]Return to linux_fcntl.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / compat / linux / common

Annotation of src/sys/compat/linux/common/linux_fcntl.h, Revision 1.18

1.18    ! maxv        1: /*     $NetBSD: linux_fcntl.h,v 1.17 2015/03/01 13:19:39 njoly Exp $   */
1.2       erh         2:
                      3: /*-
1.4       fvdl        4:  * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
1.2       erh         5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
1.4       fvdl        8:  * by Frank van der Linden and Eric Haszlakiewicz.
1.2       erh         9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     20:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     21:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     22:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     23:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     24:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     25:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     26:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     27:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     28:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     29:  * POSSIBILITY OF SUCH DAMAGE.
1.1       fvdl       30:  */
                     31:
1.3       christos   32: #ifndef _LINUX_FCNTL_H
                     33: #define _LINUX_FCNTL_H
1.2       erh        34:
1.1       fvdl       35: /*
1.2       erh        36:  * The arguments in the flock structure have a different order from the
                     37:  * BSD structure.
1.1       fvdl       38:  */
                     39:
1.2       erh        40: /* read/write mode for open(2) */
                     41: #define        LINUX_O_RDONLY          0x0000
1.1       fvdl       42: #define LINUX_O_WRONLY         0x0001
                     43: #define LINUX_O_RDWR           0x0002
                     44: #define LINUX_O_ACCMODE                0x0003
                     45:
1.15      njoly      46: #define LINUX_AT_FDCWD                 -100
                     47: #define LINUX_AT_SYMLINK_NOFOLLOW      0x0100
                     48: #define LINUX_AT_REMOVEDIR             0x0200
                     49: #define LINUX_AT_SYMLINK_FOLLOW                0x0400
                     50: #define LINUX_AT_NO_AUTOMOUNT          0x0800
                     51: #define LINUX_AT_EMPTY_PATH            0x1000
                     52:
1.16      njoly      53: int linux_to_bsd_ioflags(int);
1.15      njoly      54: int linux_to_bsd_atflags(int);
                     55:
1.1       fvdl       56: struct linux_flock {
                     57:        short       l_type;
                     58:        short       l_whence;
                     59:        linux_off_t l_start;
                     60:        linux_off_t l_len;
                     61:        linux_pid_t l_pid;
                     62: };
                     63:
1.9       christos   64: struct linux_flock64 {
                     65:        short       l_type;
                     66:        short       l_whence;
                     67:        off_t       l_start;
                     68:        off_t       l_len;
                     69:        linux_pid_t l_pid;
                     70: };
1.12      dsl        71:
1.3       christos   72: #if defined(__i386__)
                     73: #include <compat/linux/arch/i386/linux_fcntl.h>
1.5       itohy      74: #elif defined(__m68k__)
                     75: #include <compat/linux/arch/m68k/linux_fcntl.h>
1.3       christos   76: #elif defined(__alpha__)
                     77: #include <compat/linux/arch/alpha/linux_fcntl.h>
1.6       manu       78: #elif defined(__powerpc__)
                     79: #include <compat/linux/arch/powerpc/linux_fcntl.h>
1.7       manu       80: #elif defined(__mips__)
                     81: #include <compat/linux/arch/mips/linux_fcntl.h>
1.8       bjh21      82: #elif defined(__arm__)
                     83: #include <compat/linux/arch/arm/linux_fcntl.h>
1.10      manu       84: #elif defined(__amd64__)
                     85: #include <compat/linux/arch/amd64/linux_fcntl.h>
1.3       christos   86: #else
                     87: #error Undefined linux_fcntl.h machine type.
                     88: #endif
                     89:
1.17      njoly      90: /* Linux specific fcntl(2) commands */
                     91: #define        LINUX_F_SPECIFIC_BASE   1024
                     92: #define        LINUX_F_SETLEASE        (LINUX_F_SPECIFIC_BASE + 0)
                     93: #define        LINUX_F_GETLEASE        (LINUX_F_SPECIFIC_BASE + 1)
                     94: #define        LINUX_F_NOTIFY          (LINUX_F_SPECIFIC_BASE + 2)
                     95: #define        LINUX_F_CANCELLK        (LINUX_F_SPECIFIC_BASE + 5)
                     96: #define        LINUX_F_DUPFD_CLOEXEC   (LINUX_F_SPECIFIC_BASE + 6)
                     97: #define        LINUX_F_SETPIPE_SZ      (LINUX_F_SPECIFIC_BASE + 7)
                     98: #define        LINUX_F_GETPIPE_SZ      (LINUX_F_SPECIFIC_BASE + 8)
                     99:
1.12      dsl       100: /*
                    101:  * We have to have 4 copies of the code that converts linux fcntl() file
                    102:  * locking to native form because there are 4 layouts for the structures.
                    103:  * To avoid replicating code, these defines are used.
                    104:  *
                    105:  * The next two functions take care of converting the flock
                    106:  * structure back and forth between Linux and NetBSD format.
                    107:  * The only difference in the structures is the order and size of
                    108:  * the fields, and the 'whence' value.
                    109:  */
                    110:
                    111: #define conv_linux_flock(LINUX, FLOCK) \
                    112: static void \
                    113: bsd_to_##LINUX##_##FLOCK(struct LINUX##_##FLOCK *lfp, const struct flock *bfp) \
                    114:        copy_flock(lfp, LINUX_F, bfp, F) \
                    115: \
                    116: static void \
                    117: LINUX##_to_bsd_##FLOCK(struct flock *bfp, const struct LINUX##_##FLOCK *lfp) \
                    118:        copy_flock(bfp, F, lfp, LINUX_F)
                    119:
                    120: #define copy_flock(dst, dst_f, src, src_f) { \
                    121:        dst->l_start = src->l_start; \
                    122:        dst->l_len = src->l_len; \
                    123:        dst->l_pid = src->l_pid; \
                    124:        dst->l_whence = src->l_whence; \
                    125:        switch (src->l_type) { \
                    126:        case src_f##_RDLCK: \
                    127:                dst->l_type = dst_f##_RDLCK; \
                    128:                break; \
                    129:        case src_f##_UNLCK: \
                    130:                dst->l_type = dst_f##_UNLCK; \
                    131:                break; \
                    132:        case src_f##_WRLCK: \
                    133:                dst->l_type = dst_f##_WRLCK; \
                    134:                break; \
1.18    ! maxv      135:        default: \
        !           136:                dst->l_type = -1; \
        !           137:                break; \
1.12      dsl       138:        } \
                    139:     }
                    140:
                    141: /*
                    142:  * These two defines do the work within the sys_fcntl() switch statement.
                    143:  */
                    144:
                    145: #define do_linux_getlk(fd, cmd, arg, LINUX, FLOCK) do { \
                    146:        struct LINUX##_##FLOCK lfl; \
                    147:        struct flock bfl; \
                    148:        int fl_error; \
                    149:        if ((fl_error = copyin(arg, &lfl, sizeof lfl))) \
                    150:                return fl_error; \
                    151:        LINUX##_to_bsd_##FLOCK(&bfl, &lfl); \
1.13      ad        152:        fl_error = do_fcntl_lock(fd, F_GETLK, &bfl); \
1.12      dsl       153:        if (fl_error) \
                    154:                return fl_error; \
                    155:        bsd_to_##LINUX##_##FLOCK(&lfl, &bfl); \
                    156:        return copyout(&lfl, arg, sizeof lfl); \
                    157:     } while (0)
                    158:
                    159: #define do_linux_setlk(fd, cmd, arg, LINUX, FLOCK, setlk) do { \
                    160:        struct LINUX##_##FLOCK lfl; \
                    161:        struct flock bfl; \
                    162:        int fl_error; \
                    163:        if ((fl_error = copyin(arg, &lfl, sizeof lfl))) \
                    164:                return fl_error; \
                    165:        LINUX##_to_bsd_##FLOCK(&bfl, &lfl); \
1.13      ad        166:        return do_fcntl_lock(fd, cmd == setlk ? F_SETLK : F_SETLKW, &bfl); \
1.12      dsl       167:     } while (0)
                    168:
                    169:
1.3       christos  170: #endif /* !_LINUX_FCNTL_H */

CVSweb <webmaster@jp.NetBSD.org>