1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
* 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 .
*
* $ Id $
*/
# include "defs.h"
# ifdef LINUX
# include <linux/version.h>
2000-10-13 16:47:12 +04:00
# include <sys/timex.h>
2004-10-07 02:27:43 +04:00
# include <linux/ioctl.h>
# include <linux/rtc.h>
2007-07-24 05:57:11 +04:00
# ifndef UTIME_NOW
# define UTIME_NOW ((1l << 30) - 1l)
# endif
# ifndef UTIME_OMIT
# define UTIME_OMIT ((1l << 30) - 2l)
# endif
1999-02-19 03:21:36 +03:00
# endif /* LINUX */
2006-12-13 20:10:11 +03:00
struct timeval32
1999-02-19 03:21:36 +03:00
{
2006-12-13 20:10:11 +03:00
u_int32_t tv_sec , tv_usec ;
} ;
1999-02-19 03:21:36 +03:00
2006-12-13 20:14:36 +03:00
static void
tprint_timeval32 ( struct tcb * tcp , const struct timeval32 * tv )
{
tprintf ( " {%u, %u} " , tv - > tv_sec , tv - > tv_usec ) ;
}
static void
tprint_timeval ( struct tcb * tcp , const struct timeval * tv )
{
tprintf ( " {%lu, %lu} " ,
( unsigned long ) tv - > tv_sec , ( unsigned long ) tv - > tv_usec ) ;
}
2006-12-13 20:10:11 +03:00
void
2007-07-24 05:57:11 +04:00
printtv_bitness ( struct tcb * tcp , long addr , enum bitness_t bitness , int special )
2006-12-13 20:10:11 +03:00
{
1999-02-19 03:21:36 +03:00
if ( addr = = 0 )
tprintf ( " NULL " ) ;
else if ( ! verbose ( tcp ) )
tprintf ( " %#lx " , addr ) ;
2009-04-14 16:51:00 +04:00
else {
int rc ;
1999-02-19 03:21:36 +03:00
2006-12-13 20:10:11 +03:00
if ( bitness = = BITNESS_32
# if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
| | personality_wordsize [ current_personality ] = = 4
# endif
)
{
struct timeval32 tv ;
2007-07-24 05:57:11 +04:00
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 ) {
2007-07-24 05:58:52 +04:00
if ( special & & tv . tv_sec = = 0 & &
tv . tv_usec = = UTIME_NOW )
2007-07-24 05:57:11 +04:00
tprintf ( " UTIME_NOW " ) ;
2007-07-24 05:58:52 +04:00
else if ( special & & tv . tv_sec = = 0 & &
tv . tv_usec = = UTIME_OMIT )
2007-07-24 05:57:11 +04:00
tprintf ( " UTIME_OMIT " ) ;
else
tprint_timeval32 ( tcp , & tv ) ;
}
2009-04-14 16:51:00 +04:00
} else {
2006-12-13 20:10:11 +03:00
struct timeval tv ;
2007-07-24 05:57:11 +04:00
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 ) {
2007-07-24 05:58:52 +04:00
if ( special & & tv . tv_sec = = 0 & &
tv . tv_usec = = UTIME_NOW )
2007-07-24 05:57:11 +04:00
tprintf ( " UTIME_NOW " ) ;
2007-07-24 05:58:52 +04:00
else if ( special & & tv . tv_sec = = 0 & &
tv . tv_usec = = UTIME_OMIT )
2007-07-24 05:57:11 +04:00
tprintf ( " UTIME_OMIT " ) ;
else
tprint_timeval ( tcp , & tv ) ;
}
2006-12-13 20:10:11 +03:00
}
if ( rc < 0 )
tprintf ( " {...} " ) ;
}
}
1999-11-18 20:26:45 +03:00
1999-11-18 20:09:47 +03:00
void
2006-12-13 20:10:11 +03:00
sprinttv ( struct tcb * tcp , long addr , enum bitness_t bitness , char * buf )
1999-11-18 20:09:47 +03:00
{
2006-12-13 20:10:11 +03:00
if ( addr = = 0 )
strcpy ( buf , " NULL " ) ;
else if ( ! verbose ( tcp ) )
sprintf ( buf , " %#lx " , addr ) ;
2009-04-14 16:51:00 +04:00
else {
int rc ;
2006-12-13 20:10:11 +03:00
if ( bitness = = BITNESS_32
# if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
| | personality_wordsize [ current_personality ] = = 4
1999-11-18 20:09:47 +03:00
# endif
2006-12-13 20:10:11 +03:00
)
{
struct timeval32 tv ;
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 )
sprintf ( buf , " {%u, %u} " ,
tv . tv_sec , tv . tv_usec ) ;
2009-04-14 16:51:00 +04:00
} else {
2006-12-13 20:10:11 +03:00
struct timeval tv ;
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 )
sprintf ( buf , " {%lu, %lu} " ,
( unsigned long ) tv . tv_sec ,
( unsigned long ) tv . tv_usec ) ;
}
if ( rc < 0 )
strcpy ( buf , " {...} " ) ;
}
}
1999-11-18 20:09:47 +03:00
2009-04-14 16:51:00 +04:00
void print_timespec ( struct tcb * tcp , long addr )
2007-11-02 00:50:54 +03:00
{
if ( addr = = 0 )
tprintf ( " NULL " ) ;
else if ( ! verbose ( tcp ) )
tprintf ( " %#lx " , addr ) ;
else {
2009-04-14 16:51:00 +04:00
int rc ;
2007-11-02 00:50:54 +03:00
# if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
2009-04-14 16:51:00 +04:00
if ( personality_wordsize [ current_personality ] = = 4 ) {
2007-11-02 00:50:54 +03:00
struct timeval32 tv ;
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 )
tprintf ( " {%u, %u} " ,
tv . tv_sec , tv . tv_usec ) ;
} else
# endif
2009-04-14 16:51:00 +04:00
{
2007-11-02 00:50:54 +03:00
struct timespec ts ;
if ( ( rc = umove ( tcp , addr , & ts ) ) > = 0 )
tprintf ( " {%lu, %lu} " ,
( unsigned long ) ts . tv_sec ,
( unsigned long ) ts . tv_nsec ) ;
}
if ( rc < 0 )
tprintf ( " {...} " ) ;
}
}
2009-04-14 16:51:00 +04:00
void sprint_timespec ( char * buf , struct tcb * tcp , long addr )
2007-11-02 00:50:54 +03:00
{
if ( addr = = 0 )
strcpy ( buf , " NULL " ) ;
else if ( ! verbose ( tcp ) )
sprintf ( buf , " %#lx " , addr ) ;
else {
2009-04-14 16:51:00 +04:00
int rc ;
2007-11-02 00:50:54 +03:00
# if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
2009-04-14 16:51:00 +04:00
if ( personality_wordsize [ current_personality ] = = 4 ) {
2007-11-02 00:50:54 +03:00
struct timeval32 tv ;
if ( ( rc = umove ( tcp , addr , & tv ) ) > = 0 )
sprintf ( buf , " {%u, %u} " ,
tv . tv_sec , tv . tv_usec ) ;
} else
# endif
2009-04-14 16:51:00 +04:00
{
2007-11-02 00:50:54 +03:00
struct timespec ts ;
if ( ( rc = umove ( tcp , addr , & ts ) ) > = 0 )
sprintf ( buf , " {%lu, %lu} " ,
( unsigned long ) ts . tv_sec ,
( unsigned long ) ts . tv_nsec ) ;
}
if ( rc < 0 )
strcpy ( buf , " {...} " ) ;
}
}
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_time ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( exiting ( tcp ) ) {
# ifndef SVR4
printnum ( tcp , tcp - > u_arg [ 0 ] , " %ld " ) ;
# endif /* SVR4 */
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_stime ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( exiting ( tcp ) ) {
printnum ( tcp , tcp - > u_arg [ 0 ] , " %ld " ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_gettimeofday ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( exiting ( tcp ) ) {
if ( syserror ( tcp ) ) {
tprintf ( " %#lx, %#lx " ,
tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
return 0 ;
}
printtv ( tcp , tcp - > u_arg [ 0 ] ) ;
# ifndef SVR4
tprintf ( " , " ) ;
printtv ( tcp , tcp - > u_arg [ 1 ] ) ;
# endif /* !SVR4 */
}
return 0 ;
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
int
2011-05-30 16:00:14 +04:00
sys_osf_gettimeofday ( struct tcb * tcp )
1999-11-18 20:09:47 +03:00
{
2009-04-14 16:51:00 +04:00
if ( exiting ( tcp ) ) {
if ( syserror ( tcp ) ) {
tprintf ( " %#lx, %#lx " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
return 0 ;
}
printtv_bitness ( tcp , tcp - > u_arg [ 0 ] , BITNESS_32 , 0 ) ;
1999-11-18 20:09:47 +03:00
# ifndef SVR4
2009-04-14 16:51:00 +04:00
tprintf ( " , " ) ;
printtv_bitness ( tcp , tcp - > u_arg [ 1 ] , BITNESS_32 , 0 ) ;
1999-11-18 20:09:47 +03:00
# endif /* !SVR4 */
2009-04-14 16:51:00 +04:00
}
return 0 ;
1999-11-18 20:09:47 +03:00
}
# endif
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_settimeofday ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
printtv ( tcp , tcp - > u_arg [ 0 ] ) ;
# ifndef SVR4
tprintf ( " , " ) ;
printtv ( tcp , tcp - > u_arg [ 1 ] ) ;
# endif /* !SVR4 */
}
return 0 ;
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
int
2011-05-30 16:00:14 +04:00
sys_osf_settimeofday ( struct tcb * tcp )
1999-11-18 20:09:47 +03:00
{
2009-04-14 16:51:00 +04:00
if ( entering ( tcp ) ) {
printtv_bitness ( tcp , tcp - > u_arg [ 0 ] , BITNESS_32 , 0 ) ;
1999-11-18 20:09:47 +03:00
# ifndef SVR4
2009-04-14 16:51:00 +04:00
tprintf ( " , " ) ;
printtv_bitness ( tcp , tcp - > u_arg [ 1 ] , BITNESS_32 , 0 ) ;
1999-11-18 20:09:47 +03:00
# endif /* !SVR4 */
2009-04-14 16:51:00 +04:00
}
return 0 ;
1999-11-18 20:09:47 +03:00
}
# endif
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_adjtime ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
printtv ( tcp , tcp - > u_arg [ 0 ] ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printtv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
2008-09-03 05:02:46 +04:00
int
sys_nanosleep ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
print_timespec ( tcp , tcp - > u_arg [ 0 ] ) ;
tprintf ( " , " ) ;
} else {
if ( ! tcp - > u_arg [ 1 ] | | is_restart_error ( tcp ) )
print_timespec ( tcp , tcp - > u_arg [ 1 ] ) ;
else
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
2004-09-04 07:39:20 +04:00
static const struct xlat which [ ] = {
1999-02-19 03:21:36 +03:00
{ ITIMER_REAL , " ITIMER_REAL " } ,
{ ITIMER_VIRTUAL , " ITIMER_VIRTUAL " } ,
{ ITIMER_PROF , " ITIMER_PROF " } ,
{ 0 , NULL } ,
} ;
static void
2006-12-13 20:14:36 +03:00
printitv_bitness ( struct tcb * tcp , long addr , enum bitness_t bitness )
1999-02-19 03:21:36 +03:00
{
if ( addr = = 0 )
tprintf ( " NULL " ) ;
else if ( ! verbose ( tcp ) )
tprintf ( " %#lx " , addr ) ;
2009-04-14 16:51:00 +04:00
else {
int rc ;
1999-02-19 03:21:36 +03:00
2006-12-13 20:14:36 +03:00
if ( bitness = = BITNESS_32
# if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
| | personality_wordsize [ current_personality ] = = 4
# endif
)
{
2009-04-14 16:51:00 +04:00
struct {
2006-12-13 20:14:36 +03:00
struct timeval32 it_interval , it_value ;
} itv ;
2007-08-02 05:25:34 +04:00
if ( ( rc = umove ( tcp , addr , & itv ) ) > = 0 ) {
2006-12-13 20:14:36 +03:00
tprintf ( " {it_interval= " ) ;
tprint_timeval32 ( tcp , & itv . it_interval ) ;
tprintf ( " , it_value= " ) ;
tprint_timeval32 ( tcp , & itv . it_value ) ;
tprintf ( " } " ) ;
2007-08-02 05:25:34 +04:00
}
2009-04-14 16:51:00 +04:00
} else {
2006-12-13 20:14:36 +03:00
struct itimerval itv ;
2007-08-02 05:25:34 +04:00
if ( ( rc = umove ( tcp , addr , & itv ) ) > = 0 ) {
2006-12-13 20:14:36 +03:00
tprintf ( " {it_interval= " ) ;
tprint_timeval ( tcp , & itv . it_interval ) ;
tprintf ( " , it_value= " ) ;
tprint_timeval ( tcp , & itv . it_value ) ;
tprintf ( " } " ) ;
2007-08-02 05:25:34 +04:00
}
2006-12-13 20:14:36 +03:00
}
if ( rc < 0 )
tprintf ( " {...} " ) ;
}
1999-11-18 20:09:47 +03:00
}
2006-12-13 20:14:36 +03:00
# define printitv(tcp, addr) \
printitv_bitness ( ( tcp ) , ( addr ) , BITNESS_CURRENT )
1999-11-18 20:09:47 +03:00
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_getitimer ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
printxval ( which , tcp - > u_arg [ 0 ] , " ITIMER_??? " ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printitv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
int
2011-05-30 16:00:14 +04:00
sys_osf_getitimer ( struct tcb * tcp )
1999-11-18 20:09:47 +03:00
{
2009-04-14 16:51:00 +04:00
if ( entering ( tcp ) ) {
printxval ( which , tcp - > u_arg [ 0 ] , " ITIMER_??? " ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printitv_bitness ( tcp , tcp - > u_arg [ 1 ] , BITNESS_32 ) ;
}
return 0 ;
1999-11-18 20:09:47 +03:00
}
# endif
1999-02-19 03:21:36 +03:00
int
2011-05-30 16:00:14 +04:00
sys_setitimer ( struct tcb * tcp )
1999-02-19 03:21:36 +03:00
{
if ( entering ( tcp ) ) {
printxval ( which , tcp - > u_arg [ 0 ] , " ITIMER_??? " ) ;
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 1 ] ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 2 ] ) ;
else
printitv ( tcp , tcp - > u_arg [ 2 ] ) ;
}
return 0 ;
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
int
2011-05-30 16:00:14 +04:00
sys_osf_setitimer ( struct tcb * tcp )
1999-11-18 20:09:47 +03:00
{
2009-04-14 16:51:00 +04:00
if ( entering ( tcp ) ) {
printxval ( which , tcp - > u_arg [ 0 ] , " ITIMER_??? " ) ;
tprintf ( " , " ) ;
printitv_bitness ( tcp , tcp - > u_arg [ 1 ] , BITNESS_32 ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 2 ] ) ;
else
printitv_bitness ( tcp , tcp - > u_arg [ 2 ] , BITNESS_32 ) ;
}
return 0 ;
1999-11-18 20:09:47 +03:00
}
# endif
1999-02-19 03:21:36 +03:00
# ifdef LINUX
2006-12-13 20:42:32 +03:00
static const struct xlat adjtimex_modes [ ] = {
{ 0 , " 0 " } ,
# ifdef ADJ_OFFSET
{ ADJ_OFFSET , " ADJ_OFFSET " } ,
# endif
# ifdef ADJ_FREQUENCY
{ ADJ_FREQUENCY , " ADJ_FREQUENCY " } ,
# endif
# ifdef ADJ_MAXERROR
{ ADJ_MAXERROR , " ADJ_MAXERROR " } ,
# endif
# ifdef ADJ_ESTERROR
{ ADJ_ESTERROR , " ADJ_ESTERROR " } ,
# endif
# ifdef ADJ_STATUS
{ ADJ_STATUS , " ADJ_STATUS " } ,
# endif
# ifdef ADJ_TIMECONST
{ ADJ_TIMECONST , " ADJ_TIMECONST " } ,
# endif
# ifdef ADJ_TICK
{ ADJ_TICK , " ADJ_TICK " } ,
# endif
# ifdef ADJ_OFFSET_SINGLESHOT
{ ADJ_OFFSET_SINGLESHOT , " ADJ_OFFSET_SINGLESHOT " } ,
# endif
{ 0 , NULL }
} ;
static const struct xlat adjtimex_status [ ] = {
# ifdef STA_PLL
{ STA_PLL , " STA_PLL " } ,
# endif
# ifdef STA_PPSFREQ
{ STA_PPSFREQ , " STA_PPSFREQ " } ,
# endif
# ifdef STA_PPSTIME
{ STA_PPSTIME , " STA_PPSTIME " } ,
# endif
# ifdef STA_FLL
{ STA_FLL , " STA_FLL " } ,
# endif
# ifdef STA_INS
{ STA_INS , " STA_INS " } ,
# endif
# ifdef STA_DEL
{ STA_DEL , " STA_DEL " } ,
# endif
# ifdef STA_UNSYNC
{ STA_UNSYNC , " STA_UNSYNC " } ,
# endif
# ifdef STA_FREQHOLD
{ STA_FREQHOLD , " STA_FREQHOLD " } ,
# endif
# ifdef STA_PPSSIGNAL
{ STA_PPSSIGNAL , " STA_PPSSIGNAL " } ,
# endif
# ifdef STA_PPSJITTER
{ STA_PPSJITTER , " STA_PPSJITTER " } ,
# endif
# ifdef STA_PPSWANDER
{ STA_PPSWANDER , " STA_PPSWANDER " } ,
# endif
# ifdef STA_PPSERROR
{ STA_PPSERROR , " STA_PPSERROR " } ,
# endif
# ifdef STA_CLOCKERR
{ STA_CLOCKERR , " STA_CLOCKERR " } ,
# endif
{ 0 , NULL }
} ;
static const struct xlat adjtimex_state [ ] = {
# ifdef TIME_OK
{ TIME_OK , " TIME_OK " } ,
# endif
# ifdef TIME_INS
{ TIME_INS , " TIME_INS " } ,
# endif
# ifdef TIME_DEL
{ TIME_DEL , " TIME_DEL " } ,
# endif
# ifdef TIME_OOP
{ TIME_OOP , " TIME_OOP " } ,
# endif
# ifdef TIME_WAIT
{ TIME_WAIT , " TIME_WAIT " } ,
# endif
# ifdef TIME_ERROR
{ TIME_ERROR , " TIME_ERROR " } ,
# endif
{ 0 , NULL }
} ;
2006-12-13 20:43:45 +03:00
# if SUPPORTED_PERSONALITIES > 1
static int
tprint_timex32 ( struct tcb * tcp , long addr )
{
2009-04-14 16:51:00 +04:00
struct {
2006-12-13 20:43:45 +03:00
unsigned int modes ;
int offset ;
int freq ;
int maxerror ;
int esterror ;
int status ;
int constant ;
int precision ;
int tolerance ;
struct timeval32 time ;
int tick ;
int ppsfreq ;
int jitter ;
int shift ;
int stabil ;
int jitcnt ;
int calcnt ;
int errcnt ;
int stbcnt ;
} tx ;
if ( umove ( tcp , addr , & tx ) < 0 )
return - 1 ;
tprintf ( " {modes= " ) ;
2007-01-13 14:17:38 +03:00
printflags ( adjtimex_modes , tx . modes , " ADJ_??? " ) ;
2006-12-13 20:43:45 +03:00
tprintf ( " , offset=%d, freq=%d, maxerror=%d, " ,
tx . offset , tx . freq , tx . maxerror ) ;
tprintf ( " esterror=%u, status= " , tx . esterror ) ;
printflags ( adjtimex_status , tx . status , " STA_??? " ) ;
tprintf ( " , constant=%d, precision=%u, " ,
tx . constant , tx . precision ) ;
tprintf ( " tolerance=%d, time= " , tx . tolerance ) ;
tprint_timeval32 ( tcp , & tx . time ) ;
tprintf ( " , tick=%d, ppsfreq=%d, jitter=%d " ,
tx . tick , tx . ppsfreq , tx . jitter ) ;
tprintf ( " , shift=%d, stabil=%d, jitcnt=%d " ,
tx . shift , tx . stabil , tx . jitcnt ) ;
tprintf ( " , calcnt=%d, errcnt=%d, stbcnt=%d " ,
tx . calcnt , tx . errcnt , tx . stbcnt ) ;
tprintf ( " } " ) ;
return 0 ;
}
# endif /* SUPPORTED_PERSONALITIES > 1 */
static int
tprint_timex ( struct tcb * tcp , long addr )
1999-02-19 03:21:36 +03:00
{
2006-12-13 20:42:32 +03:00
struct timex tx ;
1999-02-19 03:21:36 +03:00
2006-12-13 20:43:45 +03:00
# if SUPPORTED_PERSONALITIES > 1
if ( personality_wordsize [ current_personality ] = = 4 )
return tprint_timex32 ( tcp , addr ) ;
# endif
if ( umove ( tcp , addr , & tx ) < 0 )
return - 1 ;
# if LINUX_VERSION_CODE < 66332
tprintf ( " {mode=%d, offset=%ld, frequency=%ld, " ,
tx . mode , tx . offset , tx . frequency ) ;
tprintf ( " maxerror=%ld, esterror=%lu, status=%u, " ,
tx . maxerror , tx . esterror , tx . status ) ;
tprintf ( " time_constant=%ld, precision=%lu, " ,
tx . time_constant , tx . precision ) ;
tprintf ( " tolerance=%ld, time= " , tx . tolerance ) ;
tprint_timeval ( tcp , & tx . time ) ;
# else
tprintf ( " {modes= " ) ;
2007-01-13 14:17:38 +03:00
printflags ( adjtimex_modes , tx . modes , " ADJ_??? " ) ;
2006-12-13 20:43:45 +03:00
tprintf ( " , offset=%ld, freq=%ld, maxerror=%ld, " ,
tx . offset , tx . freq , tx . maxerror ) ;
tprintf ( " esterror=%lu, status= " , tx . esterror ) ;
printflags ( adjtimex_status , tx . status , " STA_??? " ) ;
tprintf ( " , constant=%ld, precision=%lu, " ,
tx . constant , tx . precision ) ;
tprintf ( " tolerance=%ld, time= " , tx . tolerance ) ;
tprint_timeval ( tcp , & tx . time ) ;
tprintf ( " , tick=%ld, ppsfreq=%ld, jitter=%ld " ,
tx . tick , tx . ppsfreq , tx . jitter ) ;
tprintf ( " , shift=%d, stabil=%ld, jitcnt=%ld " ,
tx . shift , tx . stabil , tx . jitcnt ) ;
tprintf ( " , calcnt=%ld, errcnt=%ld, stbcnt=%ld " ,
tx . calcnt , tx . errcnt , tx . stbcnt ) ;
# endif
tprintf ( " } " ) ;
return 0 ;
}
int
sys_adjtimex ( struct tcb * tcp )
{
1999-02-19 03:21:36 +03:00
if ( exiting ( tcp ) ) {
if ( tcp - > u_arg [ 0 ] = = 0 )
tprintf ( " NULL " ) ;
else if ( syserror ( tcp ) | | ! verbose ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 0 ] ) ;
2006-12-13 20:43:45 +03:00
else if ( tprint_timex ( tcp , tcp - > u_arg [ 0 ] ) < 0 )
1999-02-19 03:21:36 +03:00
tprintf ( " {...} " ) ;
2008-09-03 05:22:18 +04:00
if ( syserror ( tcp ) )
return 0 ;
2006-12-13 20:42:32 +03:00
tcp - > auxstr = xlookup ( adjtimex_state , tcp - > u_rval ) ;
if ( tcp - > auxstr )
return RVAL_STR ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2003-03-31 03:52:28 +04:00
2004-09-04 07:39:20 +04:00
static const struct xlat clockflags [ ] = {
2003-03-31 03:52:28 +04:00
{ TIMER_ABSTIME , " TIMER_ABSTIME " } ,
{ 0 , NULL }
} ;
2004-09-04 07:39:20 +04:00
static const struct xlat clocknames [ ] = {
2004-08-31 12:26:39 +04:00
# ifdef CLOCK_REALTIME
2004-08-31 10:52:45 +04:00
{ CLOCK_REALTIME , " CLOCK_REALTIME " } ,
2004-08-31 12:26:39 +04:00
# endif
# ifdef CLOCK_MONOTONIC
2004-08-31 10:52:45 +04:00
{ CLOCK_MONOTONIC , " CLOCK_MONOTONIC " } ,
2004-08-31 12:26:39 +04:00
# endif
2010-09-17 13:19:49 +04:00
# ifdef CLOCK_PROCESS_CPUTIME_ID
{ CLOCK_PROCESS_CPUTIME_ID , " CLOCK_PROCESS_CPUTIME_ID " } ,
# endif
# ifdef CLOCK_THREAD_CPUTIME_ID
{ CLOCK_THREAD_CPUTIME_ID , " CLOCK_THREAD_CPUTIME_ID " } ,
# endif
# ifdef CLOCK_MONOTONIC_RAW
{ CLOCK_MONOTONIC_RAW , " CLOCK_MONOTONIC_RAW " } ,
# endif
# ifdef CLOCK_REALTIME_COARSE
{ CLOCK_REALTIME_COARSE , " CLOCK_REALTIME_COARSE " } ,
# endif
# ifdef CLOCK_MONOTONIC_COARSE
{ CLOCK_MONOTONIC_COARSE , " CLOCK_MONOTONIC_COARSE " } ,
# endif
{ 0 , NULL }
2004-08-31 10:52:45 +04:00
} ;
2003-03-31 03:52:28 +04:00
int
2011-05-30 16:00:14 +04:00
sys_clock_settime ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
2004-08-31 10:52:45 +04:00
printxval ( clocknames , tcp - > u_arg [ 0 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
2003-03-31 03:52:28 +04:00
printtv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_clock_gettime ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
2004-08-31 10:52:45 +04:00
printxval ( clocknames , tcp - > u_arg [ 0 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
2003-03-31 03:52:28 +04:00
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printtv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_clock_nanosleep ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
2004-08-31 10:52:45 +04:00
printxval ( clocknames , tcp - > u_arg [ 0 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( clockflags , tcp - > u_arg [ 1 ] , " TIMER_??? " ) ;
2003-03-31 03:52:28 +04:00
tprintf ( " , " ) ;
printtv ( tcp , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 3 ] ) ;
else
printtv ( tcp , tcp - > u_arg [ 3 ] ) ;
}
return 0 ;
}
# ifndef SIGEV_THREAD_ID
# define SIGEV_THREAD_ID 4
# endif
2004-09-04 07:39:20 +04:00
static const struct xlat sigev_value [ ] = {
2003-03-31 03:52:28 +04:00
{ SIGEV_SIGNAL + 1 , " SIGEV_SIGNAL " } ,
{ SIGEV_NONE + 1 , " SIGEV_NONE " } ,
{ SIGEV_THREAD + 1 , " SIGEV_THREAD " } ,
{ SIGEV_THREAD_ID + 1 , " SIGEV_THREAD_ID " } ,
{ 0 , NULL }
} ;
2006-12-13 20:45:02 +03:00
# if SUPPORTED_PERSONALITIES > 1
static void
printsigevent32 ( struct tcb * tcp , long arg )
{
2009-04-14 16:51:00 +04:00
struct {
2006-12-13 20:45:02 +03:00
int sigev_value ;
int sigev_signo ;
int sigev_notify ;
2009-04-14 16:51:00 +04:00
union {
2006-12-13 20:45:02 +03:00
int tid ;
2009-04-14 16:51:00 +04:00
struct {
2006-12-13 20:45:02 +03:00
int function , attribute ;
} thread ;
} un ;
} sev ;
if ( umove ( tcp , arg , & sev ) < 0 )
tprintf ( " {...} " ) ;
2009-04-14 16:51:00 +04:00
else {
2006-12-13 20:45:02 +03:00
tprintf ( " {%#x, " , sev . sigev_value ) ;
if ( sev . sigev_notify = = SIGEV_SIGNAL )
tprintf ( " %s, " , signame ( sev . sigev_signo ) ) ;
else
tprintf ( " %u, " , sev . sigev_signo ) ;
printxval ( sigev_value , sev . sigev_notify + 1 , " SIGEV_??? " ) ;
tprintf ( " , " ) ;
if ( sev . sigev_notify = = SIGEV_THREAD_ID )
tprintf ( " {%d} " , sev . un . tid ) ;
else if ( sev . sigev_notify = = SIGEV_THREAD )
tprintf ( " {%#x, %#x} " ,
sev . un . thread . function ,
sev . un . thread . attribute ) ;
else
tprintf ( " {...} " ) ;
tprintf ( " } " ) ;
}
}
# endif
2003-03-31 03:52:28 +04:00
void
2006-12-13 20:45:02 +03:00
printsigevent ( struct tcb * tcp , long arg )
2003-03-31 03:52:28 +04:00
{
struct sigevent sev ;
2006-12-13 20:45:02 +03:00
# if SUPPORTED_PERSONALITIES > 1
if ( personality_wordsize [ current_personality ] = = 4 )
{
printsigevent32 ( tcp , arg ) ;
return ;
}
# endif
2011-06-07 14:13:24 +04:00
if ( umove ( tcp , arg , & sev ) < 0 )
2003-03-31 03:52:28 +04:00
tprintf ( " {...} " ) ;
else {
2004-09-11 12:12:45 +04:00
tprintf ( " {%p, " , sev . sigev_value . sival_ptr ) ;
if ( sev . sigev_notify = = SIGEV_SIGNAL )
tprintf ( " %s, " , signame ( sev . sigev_signo ) ) ;
else
tprintf ( " %u, " , sev . sigev_signo ) ;
2003-03-31 03:52:28 +04:00
printxval ( sigev_value , sev . sigev_notify + 1 , " SIGEV_??? " ) ;
tprintf ( " , " ) ;
if ( sev . sigev_notify = = SIGEV_THREAD_ID )
/* _pad[0] is the _tid field which might not be
present in the userlevel definition of the
struct . */
tprintf ( " {%d} " , sev . _sigev_un . _pad [ 0 ] ) ;
2004-04-17 01:48:44 +04:00
else if ( sev . sigev_notify = = SIGEV_THREAD )
tprintf ( " {%p, %p} " , sev . sigev_notify_function ,
sev . sigev_notify_attributes ) ;
2003-03-31 03:52:28 +04:00
else
tprintf ( " {...} " ) ;
tprintf ( " } " ) ;
}
}
int
2011-05-30 16:00:14 +04:00
sys_timer_create ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
2004-09-11 12:12:45 +04:00
printxval ( clocknames , tcp - > u_arg [ 0 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
2003-03-31 03:52:28 +04:00
printsigevent ( tcp , tcp - > u_arg [ 1 ] ) ;
tprintf ( " , " ) ;
} else {
2006-12-13 20:03:02 +03:00
void * p ;
if ( syserror ( tcp ) | | umove ( tcp , tcp - > u_arg [ 2 ] , & p ) < 0 )
2003-03-31 03:52:28 +04:00
tprintf ( " %#lx " , tcp - > u_arg [ 2 ] ) ;
2006-12-13 20:03:02 +03:00
else
2003-03-31 03:52:28 +04:00
tprintf ( " {%p} " , p ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_timer_settime ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
tprintf ( " %#lx, " , tcp - > u_arg [ 0 ] ) ;
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 23:02:36 +04:00
printflags ( clockflags , tcp - > u_arg [ 1 ] , " TIMER_??? " ) ;
2003-03-31 03:52:28 +04:00
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , " ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 3 ] ) ;
else
printitv ( tcp , tcp - > u_arg [ 3 ] ) ;
}
return 0 ;
}
int
2011-05-30 16:00:14 +04:00
sys_timer_gettime ( struct tcb * tcp )
2003-03-31 03:52:28 +04:00
{
if ( entering ( tcp ) ) {
tprintf ( " %#lx, " , tcp - > u_arg [ 0 ] ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printitv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
2004-10-07 02:27:43 +04:00
static void
2011-05-30 16:00:14 +04:00
print_rtc ( struct tcb * tcp , const struct rtc_time * rt )
2004-10-07 02:27:43 +04:00
{
tprintf ( " {tm_sec=%d, tm_min=%d, tm_hour=%d, "
" tm_mday=%d, tm_mon=%d, tm_year=%d, " ,
rt - > tm_sec , rt - > tm_min , rt - > tm_hour ,
rt - > tm_mday , rt - > tm_mon , rt - > tm_year ) ;
if ( ! abbrev ( tcp ) )
tprintf ( " tm_wday=%d, tm_yday=%d, tm_isdst=%d} " ,
rt - > tm_wday , rt - > tm_yday , rt - > tm_isdst ) ;
else
tprintf ( " ...} " ) ;
}
int
2011-05-30 16:00:14 +04:00
rtc_ioctl ( struct tcb * tcp , long code , long arg )
2004-10-07 02:27:43 +04:00
{
switch ( code ) {
case RTC_ALM_SET :
case RTC_SET_TIME :
if ( entering ( tcp ) ) {
struct rtc_time rt ;
if ( umove ( tcp , arg , & rt ) < 0 )
tprintf ( " , %#lx " , arg ) ;
else {
tprintf ( " , " ) ;
print_rtc ( tcp , & rt ) ;
}
}
break ;
case RTC_ALM_READ :
case RTC_RD_TIME :
if ( exiting ( tcp ) ) {
struct rtc_time rt ;
if ( syserror ( tcp ) | | umove ( tcp , arg , & rt ) < 0 )
tprintf ( " , %#lx " , arg ) ;
else {
tprintf ( " , " ) ;
print_rtc ( tcp , & rt ) ;
}
}
break ;
case RTC_IRQP_SET :
case RTC_EPOCH_SET :
if ( entering ( tcp ) )
tprintf ( " , %lu " , arg ) ;
break ;
case RTC_IRQP_READ :
case RTC_EPOCH_READ :
if ( exiting ( tcp ) )
tprintf ( " , %lu " , arg ) ;
break ;
case RTC_WKALM_SET :
if ( entering ( tcp ) ) {
struct rtc_wkalrm wk ;
if ( umove ( tcp , arg , & wk ) < 0 )
tprintf ( " , %#lx " , arg ) ;
else {
tprintf ( " , {enabled=%d, pending=%d, " ,
wk . enabled , wk . pending ) ;
print_rtc ( tcp , & wk . time ) ;
tprintf ( " } " ) ;
}
}
break ;
case RTC_WKALM_RD :
if ( exiting ( tcp ) ) {
struct rtc_wkalrm wk ;
if ( syserror ( tcp ) | | umove ( tcp , arg , & wk ) < 0 )
tprintf ( " , %#lx " , arg ) ;
else {
tprintf ( " , {enabled=%d, pending=%d, " ,
wk . enabled , wk . pending ) ;
print_rtc ( tcp , & wk . time ) ;
tprintf ( " } " ) ;
}
}
break ;
default :
if ( entering ( tcp ) )
tprintf ( " , %#lx " , arg ) ;
break ;
}
return 1 ;
}
2007-08-02 05:25:34 +04:00
# ifndef TFD_TIMER_ABSTIME
# define TFD_TIMER_ABSTIME (1 << 0)
# endif
static const struct xlat timerfdflags [ ] = {
{ TFD_TIMER_ABSTIME , " TFD_TIMER_ABSTIME " } ,
{ 0 , NULL }
} ;
int
2011-05-30 16:00:14 +04:00
sys_timerfd ( struct tcb * tcp )
2007-08-02 05:25:34 +04:00
{
if ( entering ( tcp ) ) {
/* It does not matter that the kernel uses itimerspec. */
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printxval ( clocknames , tcp - > u_arg [ 1 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
printflags ( timerfdflags , tcp - > u_arg [ 2 ] , " TFD_??? " ) ;
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 3 ] ) ;
}
return 0 ;
}
2008-05-20 08:56:13 +04:00
int
sys_timerfd_create ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
printxval ( clocknames , tcp - > u_arg [ 0 ] , " CLOCK_??? " ) ;
tprintf ( " , " ) ;
printflags ( timerfdflags , tcp - > u_arg [ 1 ] , " TFD_??? " ) ;
}
return 0 ;
}
int
sys_timerfd_settime ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
Fix decoding of file descriptors
* defs.h (printfd): New function prototype.
* util.c (printfd): New function.
* file.c (print_dirfd): Update prototype to use printfd().
(sys_openat, sys_faccessat, sys_newfstatat, sys_mkdirat, sys_linkat,
sys_unlinkat, sys_readlinkat, sys_renameat, sys_fchownat, sys_fchmodat,
sys_futimesat, sys_utimensat, sys_mknodat): Update use of print_dirfd().
(sys_lseek, sys_llseek, sys_readahead, sys_ftruncate, sys_ftruncate64,
sys_fstat, sys_fstat64, sys_oldfstat, sys_fstatfs, sys_fstatfs64,
sys_fchdir, sys_fchroot, sys_linkat, sys_fchown, sys_fchmod, sys_fsync,
sys_readdir, sys_getdents, sys_getdirentries, sys_fsetxattr,
sys_fgetxattr, sys_flistxattr, sys_fremovexattr, sys_fadvise64,
sys_fadvise64_64, sys_inotify_add_watch, sys_inotify_rm_watch,
sys_fallocate): Use printfd() for decoding of file descriptors.
* desc.c (sys_fcntl, sys_flock, sys_close, sys_dup, do_dup2,
decode_select, sys_epoll_ctl, epoll_wait_common): Use printfd() for
decoding of file descriptors.
* io.c (sys_read, sys_write, sys_readv, sys_writev, sys_pread,
sys_pwrite, sys_sendfile, sys_sendfile64, sys_pread64, sys_pwrite64,
sys_ioctl): Likewise.
* mem.c (print_mmap, sys_mmap64): Likewise.
* signal.c (do_signalfd): Likewise.
* stream.c (decode_poll): Likewise.
* time.c (sys_timerfd_settime, sys_timerfd_gettime): Likewise.
Based on patch from Grant Edwards <grant.b.edwards@gmail.com>.
2011-03-04 05:08:02 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprintf ( " , " ) ;
2008-05-20 08:56:13 +04:00
printflags ( timerfdflags , tcp - > u_arg [ 1 ] , " TFD_??? " ) ;
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 3 ] ) ;
}
return 0 ;
}
int
sys_timerfd_gettime ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
Fix decoding of file descriptors
* defs.h (printfd): New function prototype.
* util.c (printfd): New function.
* file.c (print_dirfd): Update prototype to use printfd().
(sys_openat, sys_faccessat, sys_newfstatat, sys_mkdirat, sys_linkat,
sys_unlinkat, sys_readlinkat, sys_renameat, sys_fchownat, sys_fchmodat,
sys_futimesat, sys_utimensat, sys_mknodat): Update use of print_dirfd().
(sys_lseek, sys_llseek, sys_readahead, sys_ftruncate, sys_ftruncate64,
sys_fstat, sys_fstat64, sys_oldfstat, sys_fstatfs, sys_fstatfs64,
sys_fchdir, sys_fchroot, sys_linkat, sys_fchown, sys_fchmod, sys_fsync,
sys_readdir, sys_getdents, sys_getdirentries, sys_fsetxattr,
sys_fgetxattr, sys_flistxattr, sys_fremovexattr, sys_fadvise64,
sys_fadvise64_64, sys_inotify_add_watch, sys_inotify_rm_watch,
sys_fallocate): Use printfd() for decoding of file descriptors.
* desc.c (sys_fcntl, sys_flock, sys_close, sys_dup, do_dup2,
decode_select, sys_epoll_ctl, epoll_wait_common): Use printfd() for
decoding of file descriptors.
* io.c (sys_read, sys_write, sys_readv, sys_writev, sys_pread,
sys_pwrite, sys_sendfile, sys_sendfile64, sys_pread64, sys_pwrite64,
sys_ioctl): Likewise.
* mem.c (print_mmap, sys_mmap64): Likewise.
* signal.c (do_signalfd): Likewise.
* stream.c (decode_poll): Likewise.
* time.c (sys_timerfd_settime, sys_timerfd_gettime): Likewise.
Based on patch from Grant Edwards <grant.b.edwards@gmail.com>.
2011-03-04 05:08:02 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
2008-05-20 08:56:13 +04:00
tprintf ( " , " ) ;
printitv ( tcp , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
1999-02-19 03:21:36 +03:00
# endif /* LINUX */