9 #include <sys/ioc_net.h>
10 #include <sys/socket.h>
11 #include <sys/types.h>
16 static ssize_t
_uds_sendmsg_conn(int sock
, const struct msghdr
*msg
,
18 static ssize_t
_uds_sendmsg_dgram(int sock
, const struct msghdr
*msg
,
21 ssize_t
sendmsg(int sock
, const struct msghdr
*msg
, int flags
)
31 r
= ioctl(sock
, NWIOGUDSSOTYPE
, &uds_sotype
);
32 if (r
!= -1 || (errno
!= ENOTTY
&& errno
!= EBADIOCTL
)) {
37 if (uds_sotype
== SOCK_DGRAM
) {
38 return _uds_sendmsg_dgram(sock
, msg
, flags
);
40 return _uds_sendmsg_conn(sock
, msg
, flags
);
46 fprintf(stderr
, "sendmsg: not implemented for fd %d\n", sock
);
53 static ssize_t
_uds_sendmsg_conn(int sock
, const struct msghdr
*msg
,
56 struct msg_control msg_ctrl
;
61 fprintf(stderr
, "sendmsg(uds): flags not implemented\n");
68 /* grab the control data */
69 memset(&msg_ctrl
, '\0', sizeof(struct msg_control
));
70 if (msg
->msg_controllen
> MSG_CONTROL_MAX
) {
73 } else if (msg
->msg_controllen
> 0) {
74 memcpy(&msg_ctrl
.msg_control
, msg
->msg_control
,
77 msg_ctrl
.msg_controllen
= msg
->msg_controllen
;
79 /* send the control data to PFS */
80 r
= ioctl(sock
, NWIOSUDSCTRL
, (void *) &msg_ctrl
);
85 /* Silently ignore destination, if given. */
87 return writev(sock
, msg
->msg_iov
, msg
->msg_iovlen
);
90 static ssize_t
_uds_sendmsg_dgram(int sock
, const struct msghdr
*msg
,
93 struct msg_control msg_ctrl
;
94 struct sockaddr_un
*dest_addr
;
99 fprintf(stderr
, "sendmsg(uds): flags not implemented\n");
106 dest_addr
= msg
->msg_name
;
107 if (dest_addr
== NULL
) {
112 /* set the target address */
113 r
= ioctl(sock
, NWIOSUDSTADDR
, (void *) dest_addr
);
118 /* grab the control data */
119 memset(&msg_ctrl
, '\0', sizeof(struct msg_control
));
120 if (msg
->msg_controllen
> MSG_CONTROL_MAX
) {
123 } else if (msg
->msg_controllen
> 0) {
124 memcpy(&msg_ctrl
.msg_control
, msg
->msg_control
,
125 msg
->msg_controllen
);
127 msg_ctrl
.msg_controllen
= msg
->msg_controllen
;
129 /* send the control data to PFS */
130 r
= ioctl(sock
, NWIOSUDSCTRL
, (void *) &msg_ctrl
);
136 return writev(sock
, msg
->msg_iov
, msg
->msg_iovlen
);