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 >
1999-12-23 17:20:14 +03:00
* Copyright ( c ) 1996 - 1999 Wichert Akkerman < wichert @ cistron . nl >
1999-02-19 03:21:36 +03:00
* 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"
# include <fcntl.h>
# include <sys/file.h>
2004-10-07 02:23:31 +04:00
# ifdef LINUX
# include <inttypes.h>
2004-10-20 06:17:41 +04:00
# endif
# ifdef HAVE_SYS_EPOLL_H
2004-10-07 02:23:31 +04:00
# include <sys/epoll.h>
# endif
2005-05-09 12:02:00 +04:00
# ifdef HAVE_LIBAIO_H
# include <libaio.h>
# endif
1999-02-19 03:21:36 +03:00
2001-03-08 16:59:00 +03:00
# if HAVE_LONG_LONG_OFF_T
/*
* Hacks for systems that have a long long off_t
*/
2001-03-07 19:53:07 +03:00
# define flock64 flock /* Horrid hack */
# define printflock printflock64 /* Horrider hack */
# endif
2004-09-04 07:39:20 +04:00
static const struct xlat fcntlcmds [ ] = {
1999-02-19 03:21:36 +03:00
{ F_DUPFD , " F_DUPFD " } ,
{ F_GETFD , " F_GETFD " } ,
{ F_SETFD , " F_SETFD " } ,
{ F_GETFL , " F_GETFL " } ,
{ F_SETFL , " F_SETFL " } ,
{ F_GETLK , " F_GETLK " } ,
{ F_SETLK , " F_SETLK " } ,
{ F_SETLKW , " F_SETLKW " } ,
{ F_GETOWN , " F_GETOWN " } ,
{ F_SETOWN , " F_SETOWN " } ,
# ifdef F_RSETLK
{ F_RSETLK , " F_RSETLK " } ,
# endif
# ifdef F_RSETLKW
{ F_RSETLKW , " F_RSETLKW " } ,
# endif
# ifdef F_RGETLK
{ F_RGETLK , " F_RGETLK " } ,
# endif
# ifdef F_CNVT
{ F_CNVT , " F_CNVT " } ,
2000-05-01 05:53:59 +04:00
# endif
# ifdef F_SETSIG
{ F_SETSIG , " F_SETSIG " } ,
# endif
# ifdef F_GETSIG
{ F_GETSIG , " F_GETSIG " } ,
2001-03-06 18:08:09 +03:00
# endif
# ifdef F_CHKFL
{ F_CHKFL , " F_CHKFL " } ,
# endif
# ifdef F_DUP2FD
{ F_DUP2FD , " F_DUP2FD " } ,
# endif
# ifdef F_ALLOCSP
{ F_ALLOCSP , " F_ALLOCSP " } ,
# endif
# ifdef F_ISSTREAM
{ F_ISSTREAM , " F_ISSTREAM " } ,
# endif
# ifdef F_PRIV
{ F_PRIV , " F_PRIV " } ,
# endif
# ifdef F_NPRIV
{ F_NPRIV , " F_NPRIV " } ,
# endif
# ifdef F_QUOTACL
{ F_QUOTACL , " F_QUOTACL " } ,
# endif
# ifdef F_BLOCKS
{ F_BLOCKS , " F_BLOCKS " } ,
# endif
# ifdef F_BLKSIZE
{ F_BLKSIZE , " F_BLKSIZE " } ,
# endif
# ifdef F_GETOWN
{ F_GETOWN , " F_GETOWN " } ,
# endif
# ifdef F_SETOWN
{ F_SETOWN , " F_SETOWN " } ,
# endif
# ifdef F_REVOKE
{ F_REVOKE , " F_REVOKE " } ,
# endif
# ifdef F_SETLK
{ F_SETLK , " F_SETLK " } ,
# endif
# ifdef F_SETLKW
{ F_SETLKW , " F_SETLKW " } ,
# endif
# ifdef F_FREESP
{ F_FREESP , " F_FREESP " } ,
# endif
# ifdef F_GETLK
{ F_GETLK , " F_GETLK " } ,
# endif
# ifdef F_SETLK64
{ F_SETLK64 , " F_SETLK64 " } ,
# endif
# ifdef F_SETLKW64
{ F_SETLKW64 , " F_SETLKW64 " } ,
# endif
# ifdef F_FREESP64
{ F_FREESP64 , " F_FREESP64 " } ,
# endif
# ifdef F_GETLK64
{ F_GETLK64 , " F_GETLK64 " } ,
# endif
# ifdef F_SHARE
{ F_SHARE , " F_SHARE " } ,
# endif
# ifdef F_UNSHARE
{ F_UNSHARE , " F_UNSHARE " } ,
1999-02-19 03:21:36 +03:00
# endif
{ 0 , NULL } ,
} ;
2004-09-04 07:39:20 +04:00
static const struct xlat fdflags [ ] = {
1999-02-19 03:21:36 +03:00
# ifdef FD_CLOEXEC
{ FD_CLOEXEC , " FD_CLOEXEC " } ,
# endif
{ 0 , NULL } ,
} ;
# ifdef LOCK_SH
2004-09-04 07:39:20 +04:00
static const struct xlat flockcmds [ ] = {
1999-02-19 03:21:36 +03:00
{ LOCK_SH , " LOCK_SH " } ,
{ LOCK_EX , " LOCK_EX " } ,
{ LOCK_NB , " LOCK_NB " } ,
{ LOCK_UN , " LOCK_UN " } ,
{ 0 , NULL } ,
} ;
# endif /* LOCK_SH */
2004-09-04 07:39:20 +04:00
static const struct xlat lockfcmds [ ] = {
1999-02-19 03:21:36 +03:00
{ F_RDLCK , " F_RDLCK " } ,
{ F_WRLCK , " F_WRLCK " } ,
{ F_UNLCK , " F_UNLCK " } ,
# ifdef F_EXLCK
{ F_EXLCK , " F_EXLCK " } ,
# endif
# ifdef F_SHLCK
{ F_SHLCK , " F_SHLCK " } ,
# endif
{ 0 , NULL } ,
} ;
2004-09-04 07:39:20 +04:00
static const struct xlat whence [ ] = {
1999-02-19 03:21:36 +03:00
{ SEEK_SET , " SEEK_SET " } ,
{ SEEK_CUR , " SEEK_CUR " } ,
{ SEEK_END , " SEEK_END " } ,
{ 0 , NULL } ,
} ;
2001-03-08 16:59:00 +03:00
# ifndef HAVE_LONG_LONG_OFF_T
1999-02-19 03:21:36 +03:00
/* fcntl/lockf */
static void
printflock ( tcp , addr , getlk )
struct tcb * tcp ;
2000-02-04 00:58:30 +03:00
long addr ;
1999-02-19 03:21:36 +03:00
int getlk ;
{
struct flock fl ;
if ( umove ( tcp , addr , & fl ) < 0 ) {
tprintf ( " {...} " ) ;
return ;
}
tprintf ( " {type= " ) ;
printxval ( lockfcmds , fl . l_type , " F_??? " ) ;
tprintf ( " , whence= " ) ;
printxval ( whence , fl . l_whence , " SEEK_??? " ) ;
tprintf ( " , start=%ld, len=%ld " , fl . l_start , fl . l_len ) ;
if ( getlk )
tprintf ( " , pid=%lu} " , ( unsigned long ) fl . l_pid ) ;
else
tprintf ( " } " ) ;
}
2001-03-07 19:53:07 +03:00
# endif
1999-02-19 03:21:36 +03:00
2001-03-08 16:59:00 +03:00
# if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
2001-03-06 18:08:09 +03:00
/* fcntl/lockf */
static void
printflock64 ( tcp , addr , getlk )
struct tcb * tcp ;
2003-01-14 10:53:31 +03:00
long addr ;
2001-03-06 18:08:09 +03:00
int getlk ;
{
struct flock64 fl ;
if ( umove ( tcp , addr , & fl ) < 0 ) {
tprintf ( " {...} " ) ;
return ;
}
tprintf ( " {type= " ) ;
printxval ( lockfcmds , fl . l_type , " F_??? " ) ;
tprintf ( " , whence= " ) ;
printxval ( whence , fl . l_whence , " SEEK_??? " ) ;
2001-10-10 03:47:38 +04:00
tprintf ( " , start=%lld, len=%lld " , ( long long ) fl . l_start , ( long long ) fl . l_len ) ;
2001-03-06 18:08:09 +03:00
if ( getlk )
tprintf ( " , pid=%lu} " , ( unsigned long ) fl . l_pid ) ;
else
tprintf ( " } " ) ;
}
# endif
2007-01-12 02:19:55 +03:00
/*
* low bits of the open ( 2 ) flags define access mode ,
* other bits are real flags .
*/
static const char *
sprint_open_modes ( mode_t flags )
1999-02-19 03:21:36 +03:00
{
2007-01-12 02:19:55 +03:00
extern const struct xlat open_access_modes [ ] ;
extern const struct xlat open_mode_flags [ ] ;
static char outstr [ 1024 ] ;
const char * str = xlookup ( open_access_modes , flags & 3 ) ;
const char * sep = " " ;
const struct xlat * x ;
1999-02-19 03:21:36 +03:00
2007-01-12 02:19:55 +03:00
strcpy ( outstr , " flags " ) ;
if ( str )
{
strcat ( outstr , str ) ;
flags & = ~ 3 ;
if ( ! flags )
return outstr ;
strcat ( outstr , " | " ) ;
}
for ( x = open_mode_flags ; x - > str ; x + + )
{
if ( ( flags & x - > val ) = = x - > val )
{
sprintf ( outstr + strlen ( outstr ) ,
" %s%s " , sep , x - > str ) ;
sep = " | " ;
flags & = ~ x - > val ;
}
}
if ( flags )
sprintf ( outstr + strlen ( outstr ) , " %s%#x " , sep , flags ) ;
return outstr ;
}
int
sys_fcntl ( struct tcb * tcp )
{
1999-02-19 03:21:36 +03:00
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printxval ( fcntlcmds , tcp - > u_arg [ 1 ] , " F_??? " ) ;
switch ( tcp - > u_arg [ 1 ] ) {
case F_SETFD :
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 ( fdflags , tcp - > u_arg [ 2 ] , " FD_??? " ) ;
1999-02-19 03:21:36 +03:00
break ;
case F_SETOWN : case F_DUPFD :
tprintf ( " , %ld " , tcp - > u_arg [ 2 ] ) ;
break ;
case F_SETFL :
tprintf ( " , " ) ;
2007-01-12 02:19:55 +03:00
tprint_open_modes ( tcp , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
break ;
case F_SETLK : case F_SETLKW :
2001-03-06 18:08:09 +03:00
# ifdef F_FREESP
case F_FREESP :
# endif
1999-02-19 03:21:36 +03:00
tprintf ( " , " ) ;
printflock ( tcp , tcp - > u_arg [ 2 ] , 0 ) ;
break ;
2001-03-06 18:08:09 +03:00
# if _LFS64_LARGEFILE
# ifdef F_FREESP64
case F_FREESP64 :
# endif
2002-12-16 02:58:18 +03:00
/* Linux glibc defines SETLK64 as SETLK,
2001-03-06 18:08:09 +03:00
even though the kernel has different values - as does Solaris . */
# if defined(F_SETLK64) && F_SETLK64+0!=F_SETLK
case F_SETLK64 :
# endif
# if defined(F_SETLKW64) && F_SETLKW64+0!=F_SETLKW
case F_SETLKW64 :
# endif
tprintf ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 0 ) ;
break ;
# endif
}
1999-02-19 03:21:36 +03:00
}
else {
switch ( tcp - > u_arg [ 1 ] ) {
case F_DUPFD :
case F_SETFD : case F_SETFL :
case F_SETLK : case F_SETLKW :
case F_SETOWN : case F_GETOWN :
break ;
case F_GETFD :
if ( tcp - > u_rval = = 0 )
return 0 ;
2007-11-02 00:46:22 +03:00
tcp - > auxstr =
sprintflags ( " flags " , fdflags , tcp - > u_rval ) ;
1999-02-19 03:21:36 +03:00
return RVAL_HEX | RVAL_STR ;
case F_GETFL :
2007-01-12 02:19:55 +03:00
tcp - > auxstr = sprint_open_modes ( tcp - > u_rval ) ;
1999-02-19 03:21:36 +03:00
return RVAL_HEX | RVAL_STR ;
case F_GETLK :
tprintf ( " , " ) ;
printflock ( tcp , tcp - > u_arg [ 2 ] , 1 ) ;
break ;
2001-03-06 18:08:09 +03:00
# if _LFS64_LARGEFILE
# if defined(F_GETLK64) && F_GETLK64+0!=F_GETLK
case F_GETLK64 :
# endif
tprintf ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 1 ) ;
break ;
# endif
default :
1999-02-19 03:21:36 +03:00
tprintf ( " , %#lx " , tcp - > u_arg [ 2 ] ) ;
break ;
}
}
return 0 ;
}
# ifdef LOCK_SH
int
sys_flock ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , 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 ( flockcmds , tcp - > u_arg [ 1 ] , " LOCK_??? " ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
# endif /* LOCK_SH */
int
sys_close ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld " , tcp - > u_arg [ 0 ] ) ;
}
return 0 ;
}
int
sys_dup ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld " , tcp - > u_arg [ 0 ] ) ;
}
return 0 ;
}
int
sys_dup2 ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, %ld " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
2006-12-13 19:59:44 +03:00
# if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4)
1999-02-19 03:21:36 +03:00
int
sys_getdtablesize ( tcp )
struct tcb * tcp ;
{
return 0 ;
}
2006-12-13 19:59:44 +03:00
# endif /* ALPHA || FREEBSD || SUNOS4 */
1999-02-19 03:21:36 +03:00
static int
2006-12-13 20:10:11 +03:00
decode_select ( struct tcb * tcp , long * args , enum bitness_t bitness )
1999-02-19 03:21:36 +03:00
{
int i , j , nfds ;
2005-02-06 04:55:12 +03:00
unsigned int fdsize = ( ( ( ( args [ 0 ] + 7 ) / 8 ) + sizeof ( long ) - 1 )
& - sizeof ( long ) ) ;
fd_set * fds ;
1999-02-19 03:21:36 +03:00
static char outstr [ 1024 ] ;
char * sep ;
long arg ;
if ( entering ( tcp ) ) {
2005-02-06 04:55:12 +03:00
fds = ( fd_set * ) malloc ( fdsize ) ;
2005-06-01 22:55:42 +04:00
if ( fds = = NULL )
fprintf ( stderr , " out of memory \n " ) ;
1999-02-19 03:21:36 +03:00
nfds = args [ 0 ] ;
tprintf ( " %d " , nfds ) ;
for ( i = 0 ; i < 3 ; i + + ) {
arg = args [ i + 1 ] ;
if ( arg = = 0 ) {
tprintf ( " , NULL " ) ;
continue ;
}
2005-06-01 22:55:42 +04:00
if ( fds = = NULL | | ! verbose ( tcp ) ) {
1999-02-19 03:21:36 +03:00
tprintf ( " , %#lx " , arg ) ;
continue ;
}
2005-02-06 04:55:12 +03:00
if ( umoven ( tcp , arg , fdsize , ( char * ) fds ) < 0 ) {
1999-02-19 03:21:36 +03:00
tprintf ( " , [?] " ) ;
continue ;
}
tprintf ( " , [ " ) ;
for ( j = 0 , sep = " " ; j < nfds ; j + + ) {
2005-02-06 04:55:12 +03:00
if ( FD_ISSET ( j , fds ) ) {
1999-02-19 03:21:36 +03:00
tprintf ( " %s%u " , sep , j ) ;
sep = " " ;
}
}
tprintf ( " ] " ) ;
}
2005-02-06 04:55:12 +03:00
free ( fds ) ;
2006-12-13 20:10:11 +03:00
tprintf ( " , " ) ;
2007-07-24 05:57:11 +04:00
printtv_bitness ( tcp , args [ 4 ] , bitness , 0 ) ;
1999-02-19 03:21:36 +03:00
}
1999-11-18 20:09:47 +03:00
else
{
1999-02-19 03:21:36 +03:00
unsigned int cumlen = 0 ;
char * sep = " " ;
if ( syserror ( tcp ) )
return 0 ;
if ( ( nfds = tcp - > u_rval ) = = 0 ) {
tcp - > auxstr = " Timeout " ;
return RVAL_STR ;
}
2005-02-06 04:55:12 +03:00
fds = ( fd_set * ) malloc ( fdsize ) ;
2005-06-01 22:55:42 +04:00
if ( fds = = NULL )
fprintf ( stderr , " out of memory \n " ) ;
2005-02-06 04:55:12 +03:00
1999-02-19 03:21:36 +03:00
outstr [ 0 ] = ' \0 ' ;
for ( i = 0 ; i < 3 ; i + + ) {
int first = 1 ;
char str [ 20 ] ;
tcp - > auxstr = outstr ;
arg = args [ i + 1 ] ;
2005-06-01 22:55:42 +04:00
if ( fds = = NULL | | ! arg | |
umoven ( tcp , arg , fdsize , ( char * ) fds ) < 0 )
1999-02-19 03:21:36 +03:00
continue ;
for ( j = 0 ; j < args [ 0 ] ; j + + ) {
2005-02-06 04:55:12 +03:00
if ( FD_ISSET ( j , fds ) ) {
1999-02-19 03:21:36 +03:00
if ( first ) {
sprintf ( str , " %s%s [%u " , sep ,
i = = 0 ? " in " :
i = = 1 ? " out " :
" except " , j ) ;
first = 0 ;
sep = " , " ;
}
else
sprintf ( str , " %u " , j ) ;
cumlen + = strlen ( str ) ;
if ( cumlen < sizeof ( outstr ) )
strcat ( outstr , str ) ;
nfds - - ;
}
}
if ( cumlen )
strcat ( outstr , " ] " ) ;
if ( nfds = = 0 )
break ;
}
2005-02-06 04:55:12 +03:00
free ( fds ) ;
1999-02-19 03:21:36 +03:00
# ifdef LINUX
/* This contains no useful information on SunOS. */
if ( args [ 4 ] ) {
2006-12-13 20:10:11 +03:00
char str [ 128 ] ;
1999-02-19 03:21:36 +03:00
2006-12-13 20:10:11 +03:00
sprintf ( str , " %sleft " , sep ) ;
sprinttv ( tcp , args [ 4 ] , bitness , str + strlen ( str ) ) ;
if ( ( cumlen + = strlen ( str ) ) < sizeof ( outstr ) )
strcat ( outstr , str ) ;
1999-02-19 03:21:36 +03:00
}
# endif /* LINUX */
return RVAL_STR ;
}
return 0 ;
}
# ifdef LINUX
int
sys_oldselect ( tcp )
struct tcb * tcp ;
{
long args [ 5 ] ;
if ( umoven ( tcp , tcp - > u_arg [ 0 ] , sizeof args , ( char * ) args ) < 0 ) {
tprintf ( " [...] " ) ;
return 0 ;
}
2006-12-13 20:10:11 +03:00
return decode_select ( tcp , args , BITNESS_CURRENT ) ;
1999-02-19 03:21:36 +03:00
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
2002-12-16 02:58:18 +03:00
int
1999-11-18 20:09:47 +03:00
sys_osf_select ( tcp )
struct tcb * tcp ;
{
long * args = tcp - > u_arg ;
2006-12-13 20:10:11 +03:00
return decode_select ( tcp , args , BITNESS_32 ) ;
1999-11-18 20:09:47 +03:00
}
# endif
2004-10-07 02:23:31 +04:00
static struct xlat epollctls [ ] = {
2004-10-20 06:17:41 +04:00
# ifdef EPOLL_CTL_ADD
2004-10-07 02:23:31 +04:00
{ EPOLL_CTL_ADD , " EPOLL_CTL_ADD " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLL_CTL_MOD
2004-10-07 02:23:31 +04:00
{ EPOLL_CTL_MOD , " EPOLL_CTL_MOD " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLL_CTL_DEL
2004-10-07 02:23:31 +04:00
{ EPOLL_CTL_DEL , " EPOLL_CTL_DEL " } ,
2004-10-20 06:17:41 +04:00
# endif
2004-10-07 02:23:31 +04:00
{ 0 , NULL }
} ;
static struct xlat epollevents [ ] = {
2004-10-20 06:17:41 +04:00
# ifdef EPOLLIN
2004-10-07 02:23:31 +04:00
{ EPOLLIN , " EPOLLIN " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLPRI
2004-10-07 02:23:31 +04:00
{ EPOLLPRI , " EPOLLPRI " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLOUT
2004-10-07 02:23:31 +04:00
{ EPOLLOUT , " EPOLLOUT " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLRDNORM
2004-10-07 02:23:31 +04:00
{ EPOLLRDNORM , " EPOLLRDNORM " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLRDBAND
2004-10-07 02:23:31 +04:00
{ EPOLLRDBAND , " EPOLLRDBAND " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLWRNORM
2004-10-07 02:23:31 +04:00
{ EPOLLWRNORM , " EPOLLWRNORM " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLWRBAND
2004-10-07 02:23:31 +04:00
{ EPOLLWRBAND , " EPOLLWRBAND " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLMSG
2004-10-07 02:23:31 +04:00
{ EPOLLMSG , " EPOLLMSG " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLERR
2004-10-07 02:23:31 +04:00
{ EPOLLERR , " EPOLLERR " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLHUP
2004-10-07 02:23:31 +04:00
{ EPOLLHUP , " EPOLLHUP " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLONESHOT
2004-10-07 02:23:31 +04:00
{ EPOLLONESHOT , " EPOLLONESHOT " } ,
2004-10-20 06:17:41 +04:00
# endif
# ifdef EPOLLET
2004-10-07 02:23:31 +04:00
{ EPOLLET , " EPOLLET " } ,
2004-10-20 06:17:41 +04:00
# endif
2004-10-07 02:23:31 +04:00
{ 0 , NULL }
} ;
int
sys_epoll_create ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) )
tprintf ( " %ld " , tcp - > u_arg [ 0 ] ) ;
return 0 ;
}
2004-10-20 06:17:41 +04:00
# ifdef HAVE_SYS_EPOLL_H
2004-10-07 02:23:31 +04:00
static void
print_epoll_event ( ev )
struct epoll_event * ev ;
{
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 ( epollevents , ev - > events , " EPOLL??? " ) ;
2004-10-07 02:23:31 +04:00
/* We cannot know what format the program uses, so print u32 and u64
which will cover every value . */
tprintf ( " , {u32=% " PRIu32 " , u64=% " PRIu64 " }} " ,
ev - > data . u32 , ev - > data . u64 ) ;
}
2004-10-20 06:17:41 +04:00
# endif
2004-10-07 02:23:31 +04:00
int
sys_epoll_ctl ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printxval ( epollctls , tcp - > u_arg [ 1 ] , " EPOLL_CTL_??? " ) ;
tprintf ( " , %ld, " , tcp - > u_arg [ 2 ] ) ;
if ( tcp - > u_arg [ 3 ] = = 0 )
tprintf ( " NULL " ) ;
2004-10-20 06:17:41 +04:00
else {
# ifdef HAVE_SYS_EPOLL_H
struct epoll_event ev ;
2004-10-20 06:17:41 +04:00
if ( umove ( tcp , tcp - > u_arg [ 3 ] , & ev ) = = 0 )
2004-10-20 06:17:41 +04:00
print_epoll_event ( & ev ) ;
else
# endif
tprintf ( " {...} " ) ;
}
2004-10-07 02:23:31 +04:00
}
return 0 ;
}
2007-08-02 05:13:26 +04:00
static void
epoll_wait_common ( tcp )
2004-10-07 02:23:31 +04:00
struct tcb * tcp ;
{
if ( entering ( tcp ) )
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
else {
if ( syserror ( tcp ) )
tprintf ( " %lx " , tcp - > u_arg [ 1 ] ) ;
else if ( tcp - > u_rval = = 0 )
tprintf ( " {} " ) ;
else {
2004-10-20 06:17:41 +04:00
# ifdef HAVE_SYS_EPOLL_H
2005-06-01 23:22:06 +04:00
struct epoll_event ev , * start , * cur , * end ;
int failed = 0 ;
tprintf ( " { " ) ;
start = ( struct epoll_event * ) tcp - > u_arg [ 1 ] ;
end = start + tcp - > u_rval ;
for ( cur = start ; cur < end ; + + cur ) {
if ( cur > start )
tprintf ( " , " ) ;
if ( umove ( tcp , ( long ) cur , & ev ) = = 0 )
print_epoll_event ( & ev ) ;
else {
tprintf ( " ? " ) ;
failed = 1 ;
break ;
2004-10-07 02:23:31 +04:00
}
}
2005-06-01 23:22:06 +04:00
tprintf ( " } " ) ;
if ( failed )
tprintf ( " %#lx " , ( long ) start ) ;
# else
tprintf ( " {...} " ) ;
2004-10-20 06:17:41 +04:00
# endif
2004-10-07 02:23:31 +04:00
}
tprintf ( " , %ld, %ld " , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 3 ] ) ;
}
2007-08-02 05:13:26 +04:00
}
int
sys_epoll_wait ( tcp )
struct tcb * tcp ;
{
epoll_wait_common ( tcp ) ;
return 0 ;
}
int
sys_epoll_pwait ( tcp )
struct tcb * tcp ;
{
epoll_wait_common ( tcp ) ;
if ( exiting ( tcp ) )
print_sigset ( tcp , tcp - > u_arg [ 4 ] , 0 ) ;
2004-10-07 02:23:31 +04:00
return 0 ;
}
2005-05-09 12:02:00 +04:00
int
sys_io_setup ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) )
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
else {
if ( syserror ( tcp ) )
tprintf ( " 0x%0lx " , tcp - > u_arg [ 1 ] ) ;
else {
unsigned long user_id ;
if ( umove ( tcp , tcp - > u_arg [ 1 ] , & user_id ) = = 0 )
tprintf ( " {%lu} " , user_id ) ;
else
tprintf ( " {...} " ) ;
}
}
return 0 ;
}
int
sys_io_destroy ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) )
tprintf ( " %lu " , tcp - > u_arg [ 0 ] ) ;
return 0 ;
}
int
sys_io_submit ( tcp )
struct tcb * tcp ;
{
long nr ;
if ( entering ( tcp ) ) {
tprintf ( " %lu, %ld, " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
nr = tcp - > u_arg [ 1 ] ;
/* and if nr is negative? */
if ( nr = = 0 )
tprintf ( " {} " ) ;
else {
# ifdef HAVE_LIBAIO_H
long i ;
struct iocb * iocbp , * * iocbs = ( void * ) tcp - > u_arg [ 2 ] ;
for ( i = 0 ; i < nr ; i + + , iocbs + + ) {
struct iocb iocb ;
if ( i = = 0 )
tprintf ( " { " ) ;
else
tprintf ( " , " ) ;
if ( umove ( tcp , ( unsigned long ) iocbs , & iocbp ) | |
umove ( tcp , ( unsigned long ) iocbp , & iocb ) ) {
tprintf ( " {...} " ) ;
continue ;
}
tprintf ( " {%p, %u, %hu, %hu, %d} " ,
iocb . data , iocb . key ,
iocb . aio_lio_opcode ,
iocb . aio_reqprio , iocb . aio_fildes ) ;
}
if ( i )
tprintf ( " } " ) ;
# else
tprintf ( " {...} " ) ;
# endif
}
}
return 0 ;
}
int
sys_io_cancel ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
# ifdef HAVE_LIBAIO_H
struct iocb iocb ;
# endif
tprintf ( " %lu, " , tcp - > u_arg [ 0 ] ) ;
# ifdef HAVE_LIBAIO_H
if ( umove ( tcp , tcp - > u_arg [ 1 ] , & iocb ) = = 0 ) {
tprintf ( " {%p, %u, %hu, %hu, %d}, " ,
iocb . data , iocb . key ,
iocb . aio_lio_opcode ,
iocb . aio_reqprio , iocb . aio_fildes ) ;
} else
# endif
tprintf ( " {...}, " ) ;
} else {
if ( tcp - > u_rval < 0 )
tprintf ( " {...} " ) ;
else {
# ifdef HAVE_LIBAIO_H
struct io_event event ;
if ( umove ( tcp , tcp - > u_arg [ 2 ] , & event ) = = 0 )
tprintf ( " {%p, %p, %ld, %ld} " ,
event . data , event . obj ,
event . res , event . res2 ) ;
else
# endif
tprintf ( " {...} " ) ;
}
}
return 0 ;
}
int
sys_io_getevents ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, %ld, %ld, " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ,
tcp - > u_arg [ 2 ] ) ;
} else {
if ( tcp - > u_rval = = 0 ) {
tprintf ( " {} " ) ;
} else {
# ifdef HAVE_LIBAIO_H
struct io_event * events = ( void * ) tcp - > u_arg [ 3 ] ;
long i , nr = tcp - > u_rval ;
for ( i = 0 ; i < nr ; i + + , events + + ) {
struct io_event event ;
if ( i = = 0 )
tprintf ( " { " ) ;
else
tprintf ( " , " ) ;
if ( umove ( tcp , ( unsigned long ) events , & event ) ! = 0 ) {
tprintf ( " {...} " ) ;
continue ;
}
tprintf ( " {%p, %p, %ld, %ld} " , event . data ,
event . obj , event . res , event . res2 ) ;
}
tprintf ( " }, " ) ;
# else
tprintf ( " {...} " ) ;
# endif
}
if ( tcp - > u_arg [ 4 ] = = 0 )
tprintf ( " NULL " ) ;
else {
struct timespec to ;
if ( umove ( tcp , tcp - > u_arg [ 4 ] , & to ) = = 0 )
tprintf ( " {%lu, %lu} " , to . tv_sec , to . tv_nsec ) ;
else
tprintf ( " {...} " ) ;
}
}
return 0 ;
}
1999-02-19 03:21:36 +03:00
# endif /* LINUX */
int
sys_select ( tcp )
struct tcb * tcp ;
{
2006-12-13 20:10:11 +03:00
return decode_select ( tcp , tcp - > u_arg , BITNESS_CURRENT ) ;
2006-10-13 Ulrich Drepper <drepper@redhat.com>
Bernhard Kaindl <bk@suse.de>
Dmitry V. Levin <ldv@altlinux.org>
Michael Holzheu <holzheu@de.ibm.com>
Add hooks for new syscalls. Add decoders for *at, inotify*,
pselect6, ppoll and unshare syscalls.
* defs.h: Declare print_sigset.
* desc.c (sys_pselect6): New function.
* file.c (decode_open, decode_access, decode_mkdir,
decode_readlink, decode_chmod, decode_utimes, decode_mknod):
New functions.
(sys_open, sys_access, sys_mkdir, sys_readlink, sys_chmod,
sys_utimes, sys_mknod): Use them.
[LINUX] (fstatatflags, unlinkatflags, inotify_modes): New
variables.
[LINUX] (print_dirfd, sys_openat, sys_faccessat,
sys_newfstatat, sys_mkdirat, sys_linkat, sys_unlinkat,
sys_symlinkat, sys_readlinkat, sys_renameat, sys_fchownat,
sys_fchmodat, sys_futimesat, sys_mknodat, sys_inotify_add_watch,
sys_inotify_rm_watch): New functions.
* process.c [LINUX] (sys_unshare): New function.
* signal.c (print_sigset): New function.
(sys_sigprocmask): Use it.
* stream.c (decode_poll): New function.
(sys_poll): Use it.
[LINUX] (sys_ppoll): New function.
* linux/syscall.h: Delcare new syscall handlers.
* linux/syscallent.h: Hook up new syscalls.
* linux/alpha/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/mips/syscallent.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
Fixes RH#178633.
2006-10-14 00:25:12 +04:00
}
# ifdef LINUX
int
sys_pselect6 ( struct tcb * tcp )
{
2006-12-13 20:10:11 +03:00
int rc = decode_select ( tcp , tcp - > u_arg , BITNESS_CURRENT ) ;
2006-10-13 Ulrich Drepper <drepper@redhat.com>
Bernhard Kaindl <bk@suse.de>
Dmitry V. Levin <ldv@altlinux.org>
Michael Holzheu <holzheu@de.ibm.com>
Add hooks for new syscalls. Add decoders for *at, inotify*,
pselect6, ppoll and unshare syscalls.
* defs.h: Declare print_sigset.
* desc.c (sys_pselect6): New function.
* file.c (decode_open, decode_access, decode_mkdir,
decode_readlink, decode_chmod, decode_utimes, decode_mknod):
New functions.
(sys_open, sys_access, sys_mkdir, sys_readlink, sys_chmod,
sys_utimes, sys_mknod): Use them.
[LINUX] (fstatatflags, unlinkatflags, inotify_modes): New
variables.
[LINUX] (print_dirfd, sys_openat, sys_faccessat,
sys_newfstatat, sys_mkdirat, sys_linkat, sys_unlinkat,
sys_symlinkat, sys_readlinkat, sys_renameat, sys_fchownat,
sys_fchmodat, sys_futimesat, sys_mknodat, sys_inotify_add_watch,
sys_inotify_rm_watch): New functions.
* process.c [LINUX] (sys_unshare): New function.
* signal.c (print_sigset): New function.
(sys_sigprocmask): Use it.
* stream.c (decode_poll): New function.
(sys_poll): Use it.
[LINUX] (sys_ppoll): New function.
* linux/syscall.h: Delcare new syscall handlers.
* linux/syscallent.h: Hook up new syscalls.
* linux/alpha/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/mips/syscallent.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
Fixes RH#178633.
2006-10-14 00:25:12 +04:00
if ( exiting ( tcp ) ) {
struct {
void * ss ;
unsigned long len ;
} data ;
if ( umove ( tcp , tcp - > u_arg [ 5 ] , & data ) < 0 )
tprintf ( " , %#lx " , tcp - > u_arg [ 5 ] ) ;
else {
tprintf ( " , { " ) ;
if ( data . len < sizeof ( sigset_t ) )
tprintf ( " %#lx " , ( long ) data . ss ) ;
else
print_sigset ( tcp , ( long ) data . ss , 0 ) ;
tprintf ( " , %lu} " , data . len ) ;
}
}
return rc ;
1999-02-19 03:21:36 +03:00
}
2007-08-02 05:32:17 +04:00
int
sys_eventfd ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) )
tprintf ( " %lu " , tcp - > u_arg [ 0 ] ) ;
return 0 ;
}
2006-10-13 Ulrich Drepper <drepper@redhat.com>
Bernhard Kaindl <bk@suse.de>
Dmitry V. Levin <ldv@altlinux.org>
Michael Holzheu <holzheu@de.ibm.com>
Add hooks for new syscalls. Add decoders for *at, inotify*,
pselect6, ppoll and unshare syscalls.
* defs.h: Declare print_sigset.
* desc.c (sys_pselect6): New function.
* file.c (decode_open, decode_access, decode_mkdir,
decode_readlink, decode_chmod, decode_utimes, decode_mknod):
New functions.
(sys_open, sys_access, sys_mkdir, sys_readlink, sys_chmod,
sys_utimes, sys_mknod): Use them.
[LINUX] (fstatatflags, unlinkatflags, inotify_modes): New
variables.
[LINUX] (print_dirfd, sys_openat, sys_faccessat,
sys_newfstatat, sys_mkdirat, sys_linkat, sys_unlinkat,
sys_symlinkat, sys_readlinkat, sys_renameat, sys_fchownat,
sys_fchmodat, sys_futimesat, sys_mknodat, sys_inotify_add_watch,
sys_inotify_rm_watch): New functions.
* process.c [LINUX] (sys_unshare): New function.
* signal.c (print_sigset): New function.
(sys_sigprocmask): Use it.
* stream.c (decode_poll): New function.
(sys_poll): Use it.
[LINUX] (sys_ppoll): New function.
* linux/syscall.h: Delcare new syscall handlers.
* linux/syscallent.h: Hook up new syscalls.
* linux/alpha/syscallent.h: Likewise.
* linux/hppa/syscallent.h: Likewise.
* linux/ia64/syscallent.h: Likewise.
* linux/mips/syscallent.h: Likewise.
* linux/powerpc/syscallent.h: Likewise.
* linux/s390/syscallent.h: Likewise.
* linux/s390x/syscallent.h: Likewise.
* linux/sparc/syscallent.h: Likewise.
* linux/sparc64/syscallent.h: Likewise.
* linux/x86_64/syscallent.h: Likewise.
Fixes RH#178633.
2006-10-14 00:25:12 +04:00
# endif