Don't return bogus clock id
phc_open() can open any device and return clkid even if the device is not phc for example /dev/kvm and so on. As a result, phc2sys keeps running with reading bogus clock as below: # phc2sys -s /dev/kvm -O 0 -q -m phc2sys[687019.699]: failed to read clock: Invalid argument phc2sys[687020.699]: failed to read clock: Invalid argument phc2sys[687021.699]: failed to read clock: Invalid argument phc2sys[687022.699]: failed to read clock: Invalid argument ... This patch fixes that problem. Signed-off-by: Ken ICHIKAWA <ichikawa.ken@jp.fujitsu.com>
This commit is contained in:
		
							parent
							
								
									74e703727e
								
							
						
					
					
						commit
						67c925f459
					
				
							
								
								
									
										16
									
								
								phc.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								phc.c
									
									
									
									
									
								
							@ -36,11 +36,25 @@
 | 
				
			|||||||
#define BITS_PER_LONG	(sizeof(long)*8)
 | 
					#define BITS_PER_LONG	(sizeof(long)*8)
 | 
				
			||||||
#define MAX_PPB_32	32767999	/* 2^31 - 1 / 65.536 */
 | 
					#define MAX_PPB_32	32767999	/* 2^31 - 1 / 65.536 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int phc_get_caps(clockid_t clkid, struct ptp_clock_caps *caps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clockid_t phc_open(char *phc)
 | 
					clockid_t phc_open(char *phc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						clockid_t clkid;
 | 
				
			||||||
 | 
						struct ptp_clock_caps caps;
 | 
				
			||||||
	int fd = open(phc, O_RDWR);
 | 
						int fd = open(phc, O_RDWR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return fd < 0 ? CLOCK_INVALID : FD_TO_CLOCKID(fd);
 | 
						if (fd < 0)
 | 
				
			||||||
 | 
							return CLOCK_INVALID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clkid = FD_TO_CLOCKID(fd);
 | 
				
			||||||
 | 
						/* check if clkid is valid */
 | 
				
			||||||
 | 
						if (phc_get_caps(clkid, &caps)) {
 | 
				
			||||||
 | 
							close(fd);
 | 
				
			||||||
 | 
							return CLOCK_INVALID;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return clkid;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void phc_close(clockid_t clkid)
 | 
					void phc_close(clockid_t clkid)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user