1 #include <sys/socket.h>
8 hidden
void __convert_scm_timestamps(struct msghdr
*, socklen_t
);
10 void __convert_scm_timestamps(struct msghdr
*msg
, socklen_t csize
)
12 if (SCM_TIMESTAMP
== SCM_TIMESTAMP_OLD
) return;
13 if (!msg
->msg_control
|| !msg
->msg_controllen
) return;
15 struct cmsghdr
*cmsg
, *last
=0;
20 for (cmsg
=CMSG_FIRSTHDR(msg
); cmsg
; cmsg
=CMSG_NXTHDR(msg
, cmsg
)) {
21 if (cmsg
->cmsg_level
==SOL_SOCKET
) switch (cmsg
->cmsg_type
) {
22 case SCM_TIMESTAMP_OLD
:
26 case SCM_TIMESTAMPNS_OLD
:
27 type
= SCM_TIMESTAMPNS
;
29 memcpy(&tmp
, CMSG_DATA(cmsg
), sizeof tmp
);
31 memcpy(&tmp
, CMSG_DATA(cmsg
) + sizeof tmp
, sizeof tmp
);
37 if (!last
|| !type
) return;
38 if (CMSG_SPACE(sizeof tvts
) > csize
-msg
->msg_controllen
) {
39 msg
->msg_flags
|= MSG_CTRUNC
;
42 msg
->msg_controllen
+= CMSG_SPACE(sizeof tvts
);
43 cmsg
= CMSG_NXTHDR(msg
, last
);
44 cmsg
->cmsg_level
= SOL_SOCKET
;
45 cmsg
->cmsg_type
= type
;
46 cmsg
->cmsg_len
= CMSG_LEN(sizeof tvts
);
47 memcpy(CMSG_DATA(cmsg
), &tvts
, sizeof tvts
);
50 ssize_t
recvmsg(int fd
, struct msghdr
*msg
, int flags
)
53 socklen_t orig_controllen
= msg
->msg_controllen
;
54 #if LONG_MAX > INT_MAX
55 struct msghdr h
, *orig
= msg
;
58 h
.__pad1
= h
.__pad2
= 0;
62 r
= socketcall_cp(recvmsg
, fd
, msg
, flags
, 0, 0, 0);
63 if (r
>= 0) __convert_scm_timestamps(msg
, orig_controllen
);
64 #if LONG_MAX > INT_MAX