xref: /illumos-gate/usr/src/uts/common/sys/sendfile.h (revision ba3594ba)
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 /*
23*ba3594baSGarrett D'Amore  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
24*ba3594baSGarrett D'Amore  *
257c478bd9Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
267c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
277c478bd9Sstevel@tonic-gate  */
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #ifndef	_SYS_SENDFILE_H
307c478bd9Sstevel@tonic-gate #define	_SYS_SENDFILE_H
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <sys/feature_tests.h>
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
357c478bd9Sstevel@tonic-gate extern "C" {
367c478bd9Sstevel@tonic-gate #endif
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate #include <sys/types.h>
397c478bd9Sstevel@tonic-gate #include <sys/uio.h>
407c478bd9Sstevel@tonic-gate 
417c478bd9Sstevel@tonic-gate /*
427c478bd9Sstevel@tonic-gate  * Structure used by sendfilev()
437c478bd9Sstevel@tonic-gate  */
447c478bd9Sstevel@tonic-gate typedef struct sendfilevec {
457c478bd9Sstevel@tonic-gate 	int		sfv_fd;
467c478bd9Sstevel@tonic-gate 	uint_t		sfv_flag;
477c478bd9Sstevel@tonic-gate 	off_t		sfv_off;
487c478bd9Sstevel@tonic-gate 	size_t		sfv_len;
497c478bd9Sstevel@tonic-gate } sendfilevec_t;
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate #define	SFV_NOWAIT	1
527c478bd9Sstevel@tonic-gate 
537c478bd9Sstevel@tonic-gate #if	defined(_LARGEFILE64_SOURCE)
547c478bd9Sstevel@tonic-gate /*
557c478bd9Sstevel@tonic-gate  * For 32-bit apps accessing largefile offsets
567c478bd9Sstevel@tonic-gate  * using sendfilev64.
577c478bd9Sstevel@tonic-gate  */
587c478bd9Sstevel@tonic-gate typedef struct sendfilevec64 {
597c478bd9Sstevel@tonic-gate 	int		sfv_fd;
607c478bd9Sstevel@tonic-gate 	uint_t		sfv_flag;
617c478bd9Sstevel@tonic-gate 	off64_t		sfv_off;
627c478bd9Sstevel@tonic-gate 	size_t		sfv_len;
637c478bd9Sstevel@tonic-gate } sendfilevec64_t;
647c478bd9Sstevel@tonic-gate #endif /* _LARGEFILE64_SOURCE */
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate #if	defined(_SYSCALL32)
677c478bd9Sstevel@tonic-gate /*
687c478bd9Sstevel@tonic-gate  * For 32-bit app on a 64-bit kernel to copyin the data.
697c478bd9Sstevel@tonic-gate  */
707c478bd9Sstevel@tonic-gate typedef struct ksendfilevec32 {
717c478bd9Sstevel@tonic-gate 	int		sfv_fd;
727c478bd9Sstevel@tonic-gate 	uint_t		sfv_flag;
737c478bd9Sstevel@tonic-gate 	off32_t		sfv_off;
747c478bd9Sstevel@tonic-gate 	size32_t	sfv_len;
757c478bd9Sstevel@tonic-gate } ksendfilevec32_t;
767c478bd9Sstevel@tonic-gate 
777c478bd9Sstevel@tonic-gate /*
787c478bd9Sstevel@tonic-gate  * For 32-bit app on a 64-bit kernel in largefile environment
797c478bd9Sstevel@tonic-gate  * (sendfilev64) to copyin data. Use pack(4) on amd64 kernel
807c478bd9Sstevel@tonic-gate  * to make sizeof(ksendfilevec64_t) == sizeof(sendfilevec64_t).
817c478bd9Sstevel@tonic-gate  */
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
847c478bd9Sstevel@tonic-gate #pragma pack(4)
857c478bd9Sstevel@tonic-gate #endif
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate typedef struct ksendfilevec64 {
887c478bd9Sstevel@tonic-gate 	int		sfv_fd;
897c478bd9Sstevel@tonic-gate 	uint_t		sfv_flag;
907c478bd9Sstevel@tonic-gate 	off64_t		sfv_off;
917c478bd9Sstevel@tonic-gate 	size32_t	sfv_len;
927c478bd9Sstevel@tonic-gate } ksendfilevec64_t;
937c478bd9Sstevel@tonic-gate 
947c478bd9Sstevel@tonic-gate #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
957c478bd9Sstevel@tonic-gate #pragma pack()
967c478bd9Sstevel@tonic-gate #endif
977c478bd9Sstevel@tonic-gate 
987c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 
1017c478bd9Sstevel@tonic-gate /* The sfv_fd can be a file descriptor or self proc */
1027c478bd9Sstevel@tonic-gate #define	SFV_FD_SELF	(-2)
1037c478bd9Sstevel@tonic-gate 
1047c478bd9Sstevel@tonic-gate /* System call subcodes */
1057c478bd9Sstevel@tonic-gate #define	SENDFILEV	0
1067c478bd9Sstevel@tonic-gate #define	SENDFILEV64	1
1077c478bd9Sstevel@tonic-gate 
1087c478bd9Sstevel@tonic-gate #ifndef	_KERNEL
1097c478bd9Sstevel@tonic-gate /* large file compilation environment setup */
1107c478bd9Sstevel@tonic-gate #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
1117c478bd9Sstevel@tonic-gate #ifdef	__PRAGMA_REDEFINE_EXTNAME
1127c478bd9Sstevel@tonic-gate #pragma	redefine_extname	sendfilev	sendfilev64
1137c478bd9Sstevel@tonic-gate #pragma	redefine_extname	sendfile	sendfile64
1147c478bd9Sstevel@tonic-gate #else	/* __PRAGMA_REDEFINE_EXTNAME */
1157c478bd9Sstevel@tonic-gate #define	sendfilev			sendfilev64
1167c478bd9Sstevel@tonic-gate #define	sendfile			sendfile64
1177c478bd9Sstevel@tonic-gate #endif	/* __PRAGMA_REDEFINE_EXTNAME */
1187c478bd9Sstevel@tonic-gate #endif	/* !_LP64 && _FILE_OFFSET_BITS == 64 */
1197c478bd9Sstevel@tonic-gate 
1207c478bd9Sstevel@tonic-gate /* In the LP64 compilation environment, the APIs are already large file */
1217c478bd9Sstevel@tonic-gate #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
1227c478bd9Sstevel@tonic-gate #ifdef	__PRAGMA_REDEFINE_EXTNAME
1237c478bd9Sstevel@tonic-gate #pragma redefine_extname	sendfilev64	sendfilev
1247c478bd9Sstevel@tonic-gate #pragma redefine_extname	sendfile64	sendfile
1257c478bd9Sstevel@tonic-gate #else	/* __PRAGMA_REDEFINE_EXTNAME */
1267c478bd9Sstevel@tonic-gate #define	sendfilev64			sendfilev
1277c478bd9Sstevel@tonic-gate #define	sendfile64			sendfile
1287c478bd9Sstevel@tonic-gate #endif	/* __PRAGMA_REDEFINE_EXTNAME */
1297c478bd9Sstevel@tonic-gate #endif	/* _LP64 && _LARGEFILE64_SOURCE */
1307c478bd9Sstevel@tonic-gate 
1317c478bd9Sstevel@tonic-gate extern ssize_t sendfilev(int, const struct sendfilevec *, int, size_t *);
1327c478bd9Sstevel@tonic-gate extern ssize_t sendfile(int, int, off_t *, size_t);
1337c478bd9Sstevel@tonic-gate /* Transitional largefile interface */
1347c478bd9Sstevel@tonic-gate #if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
1357c478bd9Sstevel@tonic-gate 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
1367c478bd9Sstevel@tonic-gate extern ssize_t sendfilev64(int, const struct sendfilevec64 *, int, size_t *);
1377c478bd9Sstevel@tonic-gate extern ssize_t sendfile64(int, int, off64_t *, size_t);
1387c478bd9Sstevel@tonic-gate #endif
1397c478bd9Sstevel@tonic-gate #endif	/* _KERNEL */
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
1427c478bd9Sstevel@tonic-gate }
1437c478bd9Sstevel@tonic-gate #endif
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate #endif	/* _SYS_SENDFILE_H */
146