Skip to content
  • Arnd Bergmann's avatar
    net: socket: implement 64-bit timestamps · 0768e170
    Arnd Bergmann authored
    
    
    The 'timeval' and 'timespec' data structures used for socket timestamps
    are going to be redefined in user space based on 64-bit time_t in future
    versions of the C library to deal with the y2038 overflow problem,
    which breaks the ABI definition.
    
    Unlike many modern ioctl commands, SIOCGSTAMP and SIOCGSTAMPNS do not
    use the _IOR() macro to encode the size of the transferred data, so it
    remains ambiguous whether the application uses the old or new layout.
    
    The best workaround I could find is rather ugly: we redefine the command
    code based on the size of the respective data structure with a ternary
    operator. This lets it get evaluated as late as possible, hopefully after
    that structure is visible to the caller. We cannot use an #ifdef here,
    because inux/sockios.h might have been included before any libc header
    that could determine the size of time_t.
    
    The ioctl implementation now interprets the new command codes as always
    referring to the 64-bit structure on all architectures, while the old
    architecture specific command code still refers to the old architecture
    specific layout. The new command number is only used when they are
    actually different.
    
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0768e170