2015-12-17 20:56:48 +03:00
/*
* Copyright ( c ) 2014 Stefan Sørensen < stefan . sorensen @ spectralink . com >
* Copyright ( c ) 2014 - 2015 Dmitry V . Levin < ldv @ altlinux . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2014-01-31 15:01:01 +04:00
# include "defs.h"
2015-07-07 12:47:18 +03:00
# include <linux/ioctl.h>
2014-01-31 15:01:01 +04:00
# include <linux/ptp_clock.h>
2014-04-26 03:30:54 +04:00
# include "xlat/ptp_flags_options.h"
2014-01-31 15:01:01 +04: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 21:44:21 +03:00
int
2015-07-07 12:47:18 +03:00
ptp_ioctl ( struct tcb * tcp , const unsigned int code , const long arg )
2014-01-31 15:01:01 +04:00
{
if ( ! verbose ( tcp ) )
2015-07-07 12:47:18 +03:00
return RVAL_DECODED ;
2014-01-31 15:01:01 +04:00
switch ( code ) {
2015-07-07 12:47:18 +03:00
case PTP_EXTTS_REQUEST : {
struct ptp_extts_request extts ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & extts ) )
break ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprintf ( " {index=%d, flags= " , extts . index ) ;
printflags ( ptp_flags_options , extts . flags , " PTP_??? " ) ;
tprints ( " } " ) ;
break ;
}
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
case PTP_PEROUT_REQUEST : {
struct ptp_perout_request perout ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & perout ) )
break ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
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 ( " } " ) ;
break ;
}
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
case PTP_ENABLE_PPS :
tprintf ( " , %ld " , arg ) ;
break ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
case PTP_SYS_OFFSET : {
struct ptp_sys_offset sysoff ;
if ( entering ( tcp ) ) {
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & sysoff ) )
break ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprintf ( " {n_samples=%u " , sysoff . n_samples ) ;
2014-01-31 15:01:01 +04:00
return 1 ;
2015-07-07 12:47:18 +03:00
} else {
unsigned int n_samples , i ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
if ( syserror ( tcp ) ) {
tprints ( " } " ) ;
break ;
}
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprints ( " , " ) ;
if ( umove ( tcp , arg , & sysoff ) < 0 ) {
tprints ( " ???} " ) ;
break ;
}
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
tprints ( " ts=[ " ) ;
n_samples = sysoff . n_samples > PTP_MAX_SAMPLES ?
PTP_MAX_SAMPLES : sysoff . n_samples ;
for ( i = 0 ; i < 2 * n_samples + 1 ; + + i ) {
if ( i > 0 )
tprints ( " , " ) ;
tprintf ( " {% " PRId64 " , % " PRIu32 " } " ,
( int64_t ) sysoff . ts [ i ] . sec ,
sysoff . ts [ i ] . nsec ) ;
2014-01-31 15:01:01 +04:00
}
if ( sysoff . n_samples > PTP_MAX_SAMPLES )
2015-07-07 12:47:18 +03:00
tprints ( " , ... " ) ;
tprints ( " ]} " ) ;
break ;
2014-01-31 15:01:01 +04:00
}
2015-07-07 12:47:18 +03:00
}
case PTP_CLOCK_GETCAPS : {
struct ptp_clock_caps caps ;
2014-01-31 15:01:01 +04:00
2015-07-07 12:47:18 +03:00
if ( entering ( tcp ) )
2014-01-31 15:01:01 +04:00
return 0 ;
2015-07-07 12:47:18 +03:00
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , arg , & caps ) )
break ;
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 ) ;
break ;
2014-01-31 15:01:01 +04:00
}
2015-07-07 12:47:18 +03:00
default :
return RVAL_DECODED ;
}
return RVAL_DECODED | 1 ;
2014-01-31 15:01:01 +04:00
}