diff options
Diffstat (limited to 'include/linux/socket.h')
| -rw-r--r-- | include/linux/socket.h | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h index ec538fc287a6..6e49a14365dc 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -47,16 +47,25 @@ struct linger { | |||
| 47 | struct msghdr { | 47 | struct msghdr { |
| 48 | void *msg_name; /* ptr to socket address structure */ | 48 | void *msg_name; /* ptr to socket address structure */ |
| 49 | int msg_namelen; /* size of socket address structure */ | 49 | int msg_namelen; /* size of socket address structure */ |
| 50 | struct iovec *msg_iov; /* scatter/gather array */ | 50 | struct iov_iter msg_iter; /* data */ |
| 51 | __kernel_size_t msg_iovlen; /* # elements in msg_iov */ | ||
| 52 | void *msg_control; /* ancillary data */ | 51 | void *msg_control; /* ancillary data */ |
| 53 | __kernel_size_t msg_controllen; /* ancillary data buffer length */ | 52 | __kernel_size_t msg_controllen; /* ancillary data buffer length */ |
| 54 | unsigned int msg_flags; /* flags on received message */ | 53 | unsigned int msg_flags; /* flags on received message */ |
| 55 | }; | 54 | }; |
| 55 | |||
| 56 | struct user_msghdr { | ||
| 57 | void __user *msg_name; /* ptr to socket address structure */ | ||
| 58 | int msg_namelen; /* size of socket address structure */ | ||
| 59 | struct iovec __user *msg_iov; /* scatter/gather array */ | ||
| 60 | __kernel_size_t msg_iovlen; /* # elements in msg_iov */ | ||
| 61 | void __user *msg_control; /* ancillary data */ | ||
| 62 | __kernel_size_t msg_controllen; /* ancillary data buffer length */ | ||
| 63 | unsigned int msg_flags; /* flags on received message */ | ||
| 64 | }; | ||
| 56 | 65 | ||
| 57 | /* For recvmmsg/sendmmsg */ | 66 | /* For recvmmsg/sendmmsg */ |
| 58 | struct mmsghdr { | 67 | struct mmsghdr { |
| 59 | struct msghdr msg_hdr; | 68 | struct user_msghdr msg_hdr; |
| 60 | unsigned int msg_len; | 69 | unsigned int msg_len; |
| 61 | }; | 70 | }; |
| 62 | 71 | ||
| @@ -94,6 +103,10 @@ struct cmsghdr { | |||
| 94 | (cmsg)->cmsg_len <= (unsigned long) \ | 103 | (cmsg)->cmsg_len <= (unsigned long) \ |
| 95 | ((mhdr)->msg_controllen - \ | 104 | ((mhdr)->msg_controllen - \ |
| 96 | ((char *)(cmsg) - (char *)(mhdr)->msg_control))) | 105 | ((char *)(cmsg) - (char *)(mhdr)->msg_control))) |
| 106 | #define for_each_cmsghdr(cmsg, msg) \ | ||
| 107 | for (cmsg = CMSG_FIRSTHDR(msg); \ | ||
| 108 | cmsg; \ | ||
| 109 | cmsg = CMSG_NXTHDR(msg, cmsg)) | ||
| 97 | 110 | ||
| 98 | /* | 111 | /* |
| 99 | * Get the next cmsg header | 112 | * Get the next cmsg header |
| @@ -256,7 +269,7 @@ struct ucred { | |||
| 256 | #define MSG_EOF MSG_FIN | 269 | #define MSG_EOF MSG_FIN |
| 257 | 270 | ||
| 258 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ | 271 | #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */ |
| 259 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file | 272 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exec for file |
| 260 | descriptor received through | 273 | descriptor received through |
| 261 | SCM_RIGHTS */ | 274 | SCM_RIGHTS */ |
| 262 | #if defined(CONFIG_COMPAT) | 275 | #if defined(CONFIG_COMPAT) |
| @@ -312,15 +325,14 @@ extern int csum_partial_copy_fromiovecend(unsigned char *kdata, | |||
| 312 | extern unsigned long iov_pages(const struct iovec *iov, int offset, | 325 | extern unsigned long iov_pages(const struct iovec *iov, int offset, |
| 313 | unsigned long nr_segs); | 326 | unsigned long nr_segs); |
| 314 | 327 | ||
| 315 | extern int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *address, int mode); | ||
| 316 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); | 328 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); |
| 317 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | 329 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); |
| 318 | 330 | ||
| 319 | struct timespec; | 331 | struct timespec; |
| 320 | 332 | ||
| 321 | /* The __sys_...msg variants allow MSG_CMSG_COMPAT */ | 333 | /* The __sys_...msg variants allow MSG_CMSG_COMPAT */ |
| 322 | extern long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); | 334 | extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned flags); |
| 323 | extern long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); | 335 | extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags); |
| 324 | extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | 336 | extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, |
| 325 | unsigned int flags, struct timespec *timeout); | 337 | unsigned int flags, struct timespec *timeout); |
| 326 | extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, | 338 | extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, |
