8 #include <sys/ioc_net.h>
9 #include <sys/socket.h>
10 #include <sys/types.h>
15 static ssize_t
_uds_recvmsg_conn(int sock
, struct msghdr
*msg
, int flags
);
16 static ssize_t
_uds_recvmsg_dgram(int sock
, struct msghdr
*msg
, int flags
);
18 ssize_t
recvmsg(int sock
, struct msghdr
*msg
, int flags
)
28 r
= ioctl(sock
, NWIOGUDSSOTYPE
, &uds_sotype
);
29 if (r
!= -1 || (errno
!= ENOTTY
&& errno
!= EBADIOCTL
)) {
34 if (uds_sotype
== SOCK_DGRAM
) {
35 return _uds_recvmsg_dgram(sock
, msg
, flags
);
37 return _uds_recvmsg_conn(sock
, msg
, flags
);
42 fprintf(stderr
, "recvmsg: not implemented for fd %d\n", sock
);
49 static ssize_t
_uds_recvmsg_conn(int sock
, struct msghdr
*msg
, int flags
)
55 fprintf(stderr
, "recvmsg(uds): flags not implemented\n");
61 r
= readv(sock
, msg
->msg_iov
, msg
->msg_iovlen
);
63 if (r
>= 0 && msg
->msg_name
&& msg
->msg_namelen
> 0) {
64 getpeername(sock
, msg
->msg_name
, &msg
->msg_namelen
);
67 /* get control data */
68 if (r
>= 0 && msg
->msg_control
&& msg
->msg_controllen
> 0) {
69 struct msg_control msg_ctrl
;
71 memset(&msg_ctrl
, '\0', sizeof(struct msg_control
));
72 msg_ctrl
.msg_controllen
= msg
->msg_controllen
;
73 rc
= ioctl(sock
, NWIOGUDSCTRL
, &msg_ctrl
);
78 if (msg_ctrl
.msg_controllen
<= msg
->msg_controllen
) {
79 memcpy(msg
->msg_control
, msg_ctrl
.msg_control
,
80 msg_ctrl
.msg_controllen
);
81 msg
->msg_controllen
= msg_ctrl
.msg_controllen
;
90 static ssize_t
_uds_recvmsg_dgram(int sock
, struct msghdr
*msg
, int flags
)
96 fprintf(stderr
, "recvmsg(uds): flags not implemented\n");
102 r
= readv(sock
, msg
->msg_iov
, msg
->msg_iovlen
);
104 if (r
>= 0 && msg
->msg_name
&&
105 msg
->msg_namelen
>= sizeof(struct sockaddr_un
))
107 rc
= ioctl(sock
, NWIOGUDSFADDR
, msg
->msg_name
);
111 msg
->msg_namelen
= sizeof(struct sockaddr_un
);
114 /* get control data */
115 if (r
>= 0 && msg
->msg_control
&& msg
->msg_controllen
> 0) {
116 struct msg_control msg_ctrl
;
118 memset(&msg_ctrl
, '\0', sizeof(struct msg_control
));
119 msg_ctrl
.msg_controllen
= msg
->msg_controllen
;
120 rc
= ioctl(sock
, NWIOGUDSCTRL
, &msg_ctrl
);
125 if (msg_ctrl
.msg_controllen
<= msg
->msg_controllen
) {
126 memcpy(msg
->msg_control
, msg_ctrl
.msg_control
,
127 msg_ctrl
.msg_controllen
);
128 msg
->msg_controllen
= msg_ctrl
.msg_controllen
;