mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Arnd Bergmann <arnd@arndb.de> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			16 lines
		
	
	
	
		
			545 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			16 lines
		
	
	
	
		
			545 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 | 
						|
#ifndef __ASM_SH_SOCKIOS_H
 | 
						|
#define __ASM_SH_SOCKIOS_H
 | 
						|
 | 
						|
/* Socket-level I/O control calls. */
 | 
						|
#define FIOGETOWN	_IOR('f', 123, int)
 | 
						|
#define FIOSETOWN 	_IOW('f', 124, int)
 | 
						|
 | 
						|
#define SIOCATMARK	_IOR('s', 7, int)
 | 
						|
#define SIOCSPGRP	_IOW('s', 8, pid_t)
 | 
						|
#define SIOCGPGRP	_IOR('s', 9, pid_t)
 | 
						|
 | 
						|
#define SIOCGSTAMP_OLD	_IOR('s', 100, struct timeval) /* Get stamp (timeval) */
 | 
						|
#define SIOCGSTAMPNS_OLD _IOR('s', 101, struct timespec) /* Get stamp (timespec) */
 | 
						|
 | 
						|
#endif /* __ASM_SH_SOCKIOS_H */
 |