2014-01-31 12:01:01 +01:00
# include "defs.h"
# include <sys/ioctl.h>
# include <linux/ptp_clock.h>
2014-04-25 23:30:54 +00:00
# include "xlat/ptp_flags_options.h"
2014-01-31 12:01:01 +01:00
ioctl: assume that all ioctl commands have unsigned int type
In linux, ioctl command number has a 32-bit unsigned integer type:
fs/ioctl.c:SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
If the kernel completely ignores other bits on 64-bit architectures,
why should strace care?
Let's follow the kernel and treat it as unsigned int.
* defs.h (struct_ioctlent): Change "code" type to "unsigned int".
(ioctl_decode, ioctl_lookup, block_ioctl, loop_ioctl, mtd_ioctl,
ubi_ioctl, ptp_ioctl, scsi_ioctl, sock_ioctl, term_ioctl, rtc_ioctl,
v4l2_ioctl): Likewise.
* ioctl.c (ioctl_decode, ioctl_lookup, compare, ioctl_next_match):
Likewise.
* block.c (block_ioctl): Likewise.
* loop.c (loop_ioctl): Likewise.
* mtd.c (mtd_ioctl, ubi_ioctl): Likewise.
* ptp.c (ptp_ioctl): Likewise.
* scsi.c (scsi_ioctl): Likewise.
* sock.c (sock_ioctl): Likewise.
* term.c (term_ioctl): Likewise.
* time.c (rtc_ioctl): Likewise.
* v4l2.c (v4l2_ioctl): Likewise.
* ioctlsort.c (struct ioctlent, compare, main): Likewise.
2015-01-19 18:44:21 +00:00
int
ptp_ioctl ( struct tcb * tcp , const unsigned int code , long arg )
2014-01-31 12:01:01 +01:00
{
if ( ! verbose ( tcp ) )
return 0 ;
switch ( code ) {
case PTP_CLOCK_GETCAPS : /* decode on exit */
{
struct ptp_clock_caps caps ;
if ( entering ( tcp ) | | syserror ( tcp ) | |
umove ( tcp , arg , & caps ) < 0 )
return 0 ;
tprintf ( " , {max_adj=%d, n_alarm=%d, n_ext_ts=%d, n_per_out=%d, pps=%d} " ,
caps . max_adj , caps . n_alarm , caps . n_ext_ts ,
caps . n_per_out , caps . pps ) ;
return 1 ;
}
case PTP_EXTTS_REQUEST : /* decode on enter */
{
struct ptp_extts_request extts ;
if ( exiting ( tcp ) )
return 1 ;
if ( umove ( tcp , arg , & extts ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return 0 ;
}
tprintf ( " , {index=%d, flags= " , extts . index ) ;
printflags ( ptp_flags_options , extts . flags , " PTP_??? " ) ;
tprints ( " } " ) ;
return 1 ;
}
case PTP_PEROUT_REQUEST : /* decode on enter */
{
struct ptp_perout_request perout ;
if ( exiting ( tcp ) )
return 1 ;
if ( umove ( tcp , arg , & perout ) < 0 ) {
tprintf ( " , %#lx " , arg ) ;
return 0 ;
}
tprintf ( " , {start={% " PRId64 " , % " PRIu32 " } "
" , period={% " PRId64 " , % " PRIu32 " } "
" , index=%d, flags= " ,
( int64_t ) perout . start . sec , perout . start . nsec ,
( int64_t ) perout . period . sec , perout . period . nsec ,
perout . index ) ;
printflags ( ptp_flags_options , perout . flags , " PTP_??? " ) ;
tprints ( " } " ) ;
return 1 ;
}
case PTP_ENABLE_PPS : /* decode on enter */
if ( entering ( tcp ) )
tprintf ( " , %ld " , arg ) ;
return 1 ;
case PTP_SYS_OFFSET : /* decode on exit */
{
struct ptp_sys_offset sysoff ;
unsigned int i ;
if ( entering ( tcp ) | | umove ( tcp , arg , & sysoff ) < 0 )
return 0 ;
tprintf ( " , {n_samples=%u, ts={ " , sysoff . n_samples ) ;
if ( syserror ( tcp ) ) {
tprints ( " ...}} " ) ;
return 1 ;
}
if ( sysoff . n_samples > PTP_MAX_SAMPLES )
sysoff . n_samples = PTP_MAX_SAMPLES ;
tprintf ( " {% " PRId64 " , % " PRIu32 " } " ,
( int64_t ) sysoff . ts [ 0 ] . sec , sysoff . ts [ 0 ] . nsec ) ;
for ( i = 1 ; i < 2 * sysoff . n_samples + 1 ; + + i )
tprintf ( " , {% " PRId64 " , % " PRIu32 " } " ,
( int64_t ) sysoff . ts [ i ] . sec , sysoff . ts [ i ] . nsec ) ;
tprints ( " }} " ) ;
return 1 ;
}
default : /* decode on exit */
return 0 ;
}
}