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 */ 146