1*c9945492SAndroid Build Coastguard Worker #include <sys/socket.h>
2*c9945492SAndroid Build Coastguard Worker #include <limits.h>
3*c9945492SAndroid Build Coastguard Worker #include <string.h>
4*c9945492SAndroid Build Coastguard Worker #include <errno.h>
5*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
6*c9945492SAndroid Build Coastguard Worker
sendmsg(int fd,const struct msghdr * msg,int flags)7*c9945492SAndroid Build Coastguard Worker ssize_t sendmsg(int fd, const struct msghdr *msg, int flags)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker #if LONG_MAX > INT_MAX
10*c9945492SAndroid Build Coastguard Worker struct msghdr h;
11*c9945492SAndroid Build Coastguard Worker /* Kernels before 2.6.38 set SCM_MAX_FD to 255, allocate enough
12*c9945492SAndroid Build Coastguard Worker * space to support an SCM_RIGHTS ancillary message with 255 fds.
13*c9945492SAndroid Build Coastguard Worker * Kernels since 2.6.38 set SCM_MAX_FD to 253. */
14*c9945492SAndroid Build Coastguard Worker struct cmsghdr chbuf[CMSG_SPACE(255*sizeof(int))/sizeof(struct cmsghdr)+1], *c;
15*c9945492SAndroid Build Coastguard Worker if (msg) {
16*c9945492SAndroid Build Coastguard Worker h = *msg;
17*c9945492SAndroid Build Coastguard Worker h.__pad1 = h.__pad2 = 0;
18*c9945492SAndroid Build Coastguard Worker msg = &h;
19*c9945492SAndroid Build Coastguard Worker if (h.msg_controllen) {
20*c9945492SAndroid Build Coastguard Worker if (h.msg_controllen > sizeof chbuf) {
21*c9945492SAndroid Build Coastguard Worker errno = ENOMEM;
22*c9945492SAndroid Build Coastguard Worker return -1;
23*c9945492SAndroid Build Coastguard Worker }
24*c9945492SAndroid Build Coastguard Worker memcpy(chbuf, h.msg_control, h.msg_controllen);
25*c9945492SAndroid Build Coastguard Worker h.msg_control = chbuf;
26*c9945492SAndroid Build Coastguard Worker for (c=CMSG_FIRSTHDR(&h); c; c=CMSG_NXTHDR(&h,c))
27*c9945492SAndroid Build Coastguard Worker c->__pad1 = 0;
28*c9945492SAndroid Build Coastguard Worker }
29*c9945492SAndroid Build Coastguard Worker }
30*c9945492SAndroid Build Coastguard Worker #endif
31*c9945492SAndroid Build Coastguard Worker return socketcall_cp(sendmsg, fd, msg, flags, 0, 0, 0);
32*c9945492SAndroid Build Coastguard Worker }
33