1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  24  *
  25  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  */
  28 
  29 #ifndef _SYS_SENDFILE_H
  30 #define _SYS_SENDFILE_H
  31 
  32 #include <sys/feature_tests.h>
  33 
  34 #ifdef  __cplusplus
  35 extern "C" {
  36 #endif
  37 
  38 #include <sys/types.h>
  39 #include <sys/uio.h>
  40 
  41 /*
  42  * Structure used by sendfilev()
  43  */
  44 typedef struct sendfilevec {
  45         int             sfv_fd;
  46         uint_t          sfv_flag;
  47         off_t           sfv_off;
  48         size_t          sfv_len;
  49 } sendfilevec_t;
  50 
  51 #define SFV_NOWAIT      1
  52 
  53 #if     defined(_LARGEFILE64_SOURCE)
  54 /*
  55  * For 32-bit apps accessing largefile offsets
  56  * using sendfilev64.
  57  */
  58 typedef struct sendfilevec64 {
  59         int             sfv_fd;
  60         uint_t          sfv_flag;
  61         off64_t         sfv_off;
  62         size_t          sfv_len;
  63 } sendfilevec64_t;
  64 #endif /* _LARGEFILE64_SOURCE */
  65 
  66 #if     defined(_SYSCALL32)
  67 /*
  68  * For 32-bit app on a 64-bit kernel to copyin the data.
  69  */
  70 typedef struct ksendfilevec32 {
  71         int             sfv_fd;
  72         uint_t          sfv_flag;
  73         off32_t         sfv_off;
  74         size32_t        sfv_len;
  75 } ksendfilevec32_t;
  76 
  77 /*
  78  * For 32-bit app on a 64-bit kernel in largefile environment
  79  * (sendfilev64) to copyin data. Use pack(4) on amd64 kernel
  80  * to make sizeof(ksendfilevec64_t) == sizeof(sendfilevec64_t).
  81  */
  82 
  83 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
  84 #pragma pack(4)
  85 #endif
  86 
  87 typedef struct ksendfilevec64 {
  88         int             sfv_fd;
  89         uint_t          sfv_flag;
  90         off64_t         sfv_off;
  91         size32_t        sfv_len;
  92 } ksendfilevec64_t;
  93 
  94 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
  95 #pragma pack()
  96 #endif
  97 
  98 #endif /* _SYSCALL32 */
  99 
 100 
 101 /* The sfv_fd can be a file descriptor or self proc */
 102 #define SFV_FD_SELF     (-2)
 103 
 104 /* System call subcodes */
 105 #define SENDFILEV       0
 106 #define SENDFILEV64     1
 107 
 108 #ifndef _KERNEL
 109 /* large file compilation environment setup */
 110 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
 111 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 112 #pragma redefine_extname        sendfilev       sendfilev64
 113 #pragma redefine_extname        sendfile        sendfile64
 114 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 115 #define sendfilev                       sendfilev64
 116 #define sendfile                        sendfile64
 117 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 118 #endif  /* !_LP64 && _FILE_OFFSET_BITS == 64 */
 119 
 120 /* In the LP64 compilation environment, the APIs are already large file */
 121 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
 122 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 123 #pragma redefine_extname        sendfilev64     sendfilev
 124 #pragma redefine_extname        sendfile64      sendfile
 125 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 126 #define sendfilev64                     sendfilev
 127 #define sendfile64                      sendfile
 128 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 129 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
 130 
 131 extern ssize_t sendfilev(int, const struct sendfilevec *, int, size_t *);
 132 extern ssize_t sendfile(int, int, off_t *, size_t);
 133 /* Transitional largefile interface */
 134 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 135             !defined(__PRAGMA_REDEFINE_EXTNAME))
 136 extern ssize_t sendfilev64(int, const struct sendfilevec64 *, int, size_t *);
 137 extern ssize_t sendfile64(int, int, off64_t *, size_t);
 138 #endif
 139 #endif  /* _KERNEL */
 140 
 141 #ifdef  __cplusplus
 142 }
 143 #endif
 144 
 145 #endif  /* _SYS_SENDFILE_H */