• R
    implement SO_TIMESTAMP[NS] fallback for kernels without time64 versions · ae388bec
    Rich Felker 提交于
    the definitions of SO_TIMESTAMP* changed on 32-bit archs in commit
    38143339 to the new versions that
    provide 64-bit versions of timeval/timespec structure in control
    message payload. socket options, being state attached to the socket
    rather than function calls, are not trivial to implement as fallbacks
    on ENOSYS, and support for them was initially omitted on the
    assumption that the ioctl-based polling alternatives (SIOCGSTAMP*)
    could be used instead by applications if setsockopt fails.
    
    unfortunately, it turns out that SO_TIMESTAMP is sufficiently old and
    widely supported that a number of applications assume it's available
    and treat errors as fatal.
    
    this patch introduces emulation of SO_TIMESTAMP[NS] on pre-time64
    kernels by falling back to setting the "_OLD" (time32) versions of the
    options if the time64 ones are not recognized, and performing
    translation of the SCM_TIMESTAMP[NS] control messages in recvmsg.
    since recvmsg does not know whether its caller is legacy time32 code
    or time64, it performs translation for any SCM_TIMESTAMP[NS]_OLD
    control messages it sees, leaving the original time32 timestamp as-is
    (it can't be rewritten in-place anyway, and memmove would be mildly
    expensive) and appending the converted time64 control message at the
    end of the buffer. legacy time32 callers will see the converted one as
    a spurious control message of unknown type; time64 callers running on
    pre-time64 kernels will see the original one as a spurious control
    message of unknown type. a time64 caller running on a kernel with
    native time64 support will only see the time64 version of the control
    message.
    
    emulation of SO_TIMESTAMPING is not included at this time since (1)
    applications which use it seem to be prepared for the possibility that
    it's not present or working, and (2) it can also be used in sendmsg
    control messages, in a manner that looks complex to emulate
    completely, and costly even when running on a time64-supporting
    kernel.
    
    corresponding changes in recvmmsg are not made at this time; they will
    be done separately.
    ae388bec
getsockopt.c 1.1 KB