Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_UIO_H
      2 #define __LINUX_UIO_H
      3 
      4 #include <linux/compiler.h>
      5 #include <linux/types.h>
      6 
      7 /*
      8  *	Berkeley style UIO structures	-	Alan Cox 1994.
      9  *
     10  *		This program is free software; you can redistribute it and/or
     11  *		modify it under the terms of the GNU General Public License
     12  *		as published by the Free Software Foundation; either version
     13  *		2 of the License, or (at your option) any later version.
     14  */
     15 
     16 
     17 /* A word of warning: Our uio structure will clash with the C library one (which is now obsolete). Remove the C
     18    library one from sys/uio.h if you have a very old library set */
     19 
     20 struct iovec
     21 {
     22 	void __user *iov_base;	/* BSD uses caddr_t (1003.1g requires void *) */
     23 	__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
     24 };
     25 
     26 #ifdef __KERNEL__
     27 
     28 struct kvec {
     29 	void *iov_base; /* and that should *never* hold a userland pointer */
     30 	size_t iov_len;
     31 };
     32 
     33 #endif
     34 
     35 /*
     36  *	UIO_MAXIOV shall be at least 16 1003.1g (5.4.1.1)
     37  */
     38 
     39 #define UIO_FASTIOV	8
     40 #define UIO_MAXIOV	1024
     41 #if 0
     42 #define UIO_MAXIOV	16	/* Maximum iovec's in one operation
     43 				   16 matches BSD */
     44                                 /* Beg pardon: BSD has 1024 --ANK */
     45 #endif
     46 
     47 /*
     48  * Total number of bytes covered by an iovec.
     49  *
     50  * NOTE that it is not safe to use this function until all the iovec's
     51  * segment lengths have been validated.  Because the individual lengths can
     52  * overflow a size_t when added together.
     53  */
     54 static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs)
     55 {
     56 	unsigned long seg;
     57 	size_t ret = 0;
     58 
     59 	for (seg = 0; seg < nr_segs; seg++)
     60 		ret += iov[seg].iov_len;
     61 	return ret;
     62 }
     63 
     64 unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to);
     65 
     66 #endif
     67