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 .
*/
# include "defs.h"
2015-04-07 04:36:50 +03:00
SYS_FUNC ( close )
1999-02-19 03:21:36 +03:00
{
2015-07-20 19:59:50 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
return RVAL_DECODED ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( dup )
2014-06-04 07:00:41 +04:00
{
2015-07-20 19:59:50 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
return RVAL_DECODED | RVAL_FD ;
2014-06-04 07:00:41 +04:00
}
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
static int
do_dup2 ( struct tcb * tcp , int flags_arg )
1999-02-19 03:21:36 +03:00
{
2015-07-20 19:59:50 +03:00
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
printfd ( tcp , tcp - > u_arg [ 1 ] ) ;
if ( flags_arg > = 0 ) {
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
2015-07-20 19:59:50 +03:00
printflags ( open_mode_flags , tcp - > u_arg [ flags_arg ] , " O_??? " ) ;
1999-02-19 03:21:36 +03:00
}
2015-07-20 19:59:50 +03:00
return RVAL_DECODED | RVAL_FD ;
1999-02-19 03:21:36 +03:00
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( dup2 )
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
{
return do_dup2 ( tcp , - 1 ) ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( dup3 )
2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
Implement parsers for new linux syscalls.
* desc.c (do_dup2, [LINUX] sys_dup3): New functions.
(sys_dup2): Use do_dup2.
[LINUX] (sys_epoll_create1): New function.
[LINUX] (do_eventfd, sys_eventfd2): New functions.
[LINUX] (sys_eventfd): Use do_eventfd.
* net.c (do_pipe, [LINUX] sys_pipe2): New functions.
(sys_pipe): Use do_pipe.
* signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
[LINUX] (sys_signalfd): Use do_signalfd.
* linux/syscall.h: Declare new sys_* functions.
* linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
dup3, pipe2, inotify_init1.
* linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
epoll_create1, dup3, pipe2, inotify_init1.
2008-11-11 01:53:02 +03:00
{
return do_dup2 ( tcp , 2 ) ;
}
1999-02-19 03:21:36 +03:00
static int
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
decode_select ( struct tcb * tcp , long * args ,
void ( * print_tv_ts ) ( struct tcb * , const long ) ,
const char * ( * sprint_tv_ts ) ( struct tcb * , const long ) )
1999-02-19 03:21:36 +03:00
{
2011-09-01 20:18:04 +04:00
int i , j ;
2013-11-05 19:20:16 +04:00
int nfds , fdsize ;
2014-09-10 02:42:12 +04:00
fd_set * fds = NULL ;
2010-09-07 02:08:24 +04:00
const char * sep ;
1999-02-19 03:21:36 +03:00
long arg ;
2013-11-06 02:46:43 +04:00
/* Kernel truncates arg[0] to int, we do the same. */
nfds = ( int ) args [ 0 ] ;
/* Kernel rejects negative nfds, so we don't parse it either. */
2014-09-10 02:42:12 +04:00
if ( nfds < 0 )
2013-11-06 02:46:43 +04:00
nfds = 0 ;
2014-09-10 02:42:12 +04:00
2011-09-01 18:35:44 +04:00
/* Beware of select(2^31-1, NULL, NULL, NULL) and similar... */
2013-11-06 02:46:43 +04:00
if ( nfds > 1024 * 1024 )
nfds = 1024 * 1024 ;
/*
* We had bugs a - la " while (j < args[0]) " and " umoven(args[0]) " below .
2013-11-05 14:54:51 +04:00
* Instead of args [ 0 ] , use nfds for fd count , fdsize for array lengths .
*/
2013-11-09 23:40:31 +04:00
fdsize = ( ( ( nfds + 7 ) / 8 ) + current_wordsize - 1 ) & - current_wordsize ;
2011-09-01 18:35:44 +04:00
1999-02-19 03:21:36 +03:00
if ( entering ( tcp ) ) {
2013-11-06 02:46:43 +04:00
tprintf ( " %d " , ( int ) args [ 0 ] ) ;
Introduce memory allocation wrappers
Introduce wrappers to the following functions that do memory allocation:
malloc, calloc, realloc, strdup.
This commit is a follow-up to the related discussions in strace-devel ML:
http://sourceforge.net/p/strace/mailman/message/33618180/
http://sourceforge.net/p/strace/mailman/message/33733470/
* defs.h (xmalloc, xcalloc, xreallocarray, xstrdup): New prototypes.
* xmalloc.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* count.c (count_syscall, call_summary_pers): Use xcalloc.
* desc.c (decode_select): Use xmalloc.
* dirent.c (sys_getdents, sys_getdents64): Likewise.
* net.c (sys_recvmmsg): Use xstrdup.
* pathtrace.c (storepath): Use xreallocarray.
(pathtrace_match): Use xmalloc.
* strace.c (die_out_of_memory): Move to xmalloc.c.
(expand_tcbtab): Use xcalloc and xreallocarray.
(startup_child): Use xstrdup.
(init): Use xmalloc, xcalloc, and xstrdup.
* syscall.c (reallocate_qual): Use xreallocarray.
(qualify): Use xstrdup.
* unwind.c (unwind_tcb_init): Use xmalloc.
(build_mmap_cache): Use xcalloc, xreallocarray, and xstrdup.
(get_symbol_name): Use xreallocarray.
(stacktrace_walk, queue_put): Use xmalloc.
* util.c (printstr): Use xmalloc.
* vsprintf.c (strace_vfprintf): Likewise.
2015-05-25 23:41:02 +03:00
if ( verbose ( tcp ) & & fdsize > 0 )
2015-07-20 19:44:51 +03:00
fds = malloc ( fdsize ) ;
1999-02-19 03:21:36 +03:00
for ( i = 0 ; i < 3 ; i + + ) {
arg = args [ i + 1 ] ;
2015-07-20 19:44:51 +03:00
tprints ( " , " ) ;
2015-01-28 04:26:04 +03:00
if ( ! fds ) {
2015-07-20 19:44:51 +03:00
printaddr ( arg ) ;
1999-02-19 03:21:36 +03:00
continue ;
}
2015-07-20 19:44:51 +03:00
if ( umoven_or_printaddr ( tcp , arg , fdsize , fds ) )
1999-02-19 03:21:36 +03:00
continue ;
2015-07-20 19:44:51 +03:00
tprints ( " [ " ) ;
2013-11-09 23:40:31 +04:00
for ( j = 0 , sep = " " ; ; j + + ) {
j = next_set_bit ( fds , j , nfds ) ;
if ( j < 0 )
break ;
tprints ( sep ) ;
printfd ( tcp , j ) ;
sep = " " ;
1999-02-19 03:21:36 +03:00
}
2011-09-01 12:00:28 +04:00
tprints ( " ] " ) ;
1999-02-19 03:21:36 +03:00
}
2005-02-06 04:55:12 +03:00
free ( fds ) ;
2011-09-01 12:00:28 +04:00
tprints ( " , " ) ;
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
print_tv_ts ( tcp , args [ 4 ] ) ;
2015-07-20 19:59:50 +03:00
} else {
2011-08-31 14:26:03 +04:00
static char outstr [ 1024 ] ;
char * outptr ;
# define end_outstr (outstr + sizeof(outstr))
2013-11-06 02:46:43 +04:00
int ready_fds ;
1999-02-19 03:21:36 +03:00
if ( syserror ( tcp ) )
return 0 ;
2013-11-05 14:54:51 +04:00
ready_fds = tcp - > u_rval ;
if ( ready_fds = = 0 ) {
1999-02-19 03:21:36 +03:00
tcp - > auxstr = " Timeout " ;
return RVAL_STR ;
}
2005-02-06 04:55:12 +03:00
2015-07-20 19:44:51 +03:00
fds = malloc ( fdsize ) ;
2005-02-06 04:55:12 +03:00
2011-08-31 14:26:03 +04:00
outptr = outstr ;
sep = " " ;
2013-11-06 02:46:43 +04:00
for ( i = 0 ; i < 3 & & ready_fds > 0 ; i + + ) {
1999-02-19 03:21:36 +03:00
int first = 1 ;
arg = args [ i + 1 ] ;
2015-07-20 19:44:51 +03:00
if ( ! arg | | ! fds | | umoven ( tcp , arg , fdsize , fds ) < 0 )
1999-02-19 03:21:36 +03:00
continue ;
2013-11-09 23:40:31 +04:00
for ( j = 0 ; ; j + + ) {
j = next_set_bit ( fds , j , nfds ) ;
if ( j < 0 )
break ;
/* +2 chars needed at the end: ']',NUL */
if ( outptr < end_outstr - ( sizeof ( " , except [ " ) + sizeof ( int ) * 3 + 2 ) ) {
if ( first ) {
outptr + = sprintf ( outptr , " %s%s [%u " ,
sep ,
i = = 0 ? " in " : i = = 1 ? " out " : " except " ,
j
) ;
first = 0 ;
sep = " , " ;
}
else {
outptr + = sprintf ( outptr , " %u " , j ) ;
1999-02-19 03:21:36 +03:00
}
}
2013-11-09 23:40:31 +04:00
if ( - - ready_fds = = 0 )
break ;
1999-02-19 03:21:36 +03:00
}
2011-08-31 14:26:03 +04:00
if ( outptr ! = outstr )
* outptr + + = ' ] ' ;
1999-02-19 03:21:36 +03:00
}
2005-02-06 04:55:12 +03:00
free ( fds ) ;
1999-02-19 03:21:36 +03:00
/* This contains no useful information on SunOS. */
if ( args [ 4 ] ) {
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
const char * str = sprint_tv_ts ( tcp , args [ 4 ] ) ;
if ( outptr + sizeof ( " left " ) + strlen ( sep ) + strlen ( str ) < end_outstr ) {
outptr + = sprintf ( outptr , " %sleft %s " , sep , str ) ;
2011-08-31 14:26:03 +04:00
}
1999-02-19 03:21:36 +03:00
}
2011-08-31 14:26:03 +04:00
* outptr = ' \0 ' ;
2011-09-01 13:27:37 +04:00
tcp - > auxstr = outstr ;
1999-02-19 03:21:36 +03:00
return RVAL_STR ;
2011-08-31 14:26:03 +04:00
# undef end_outstr
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( oldselect )
1999-02-19 03:21:36 +03:00
{
2015-07-29 21:38:54 +03:00
long long_args [ 5 ] ;
# undef oldselect_args
# if SIZEOF_LONG == 4
# define oldselect_args long_args
# else
unsigned int oldselect_args [ 5 ] ;
unsigned int i ;
# endif
1999-02-19 03:21:36 +03:00
2015-07-29 21:38:54 +03:00
if ( umove ( tcp , tcp - > u_arg [ 0 ] , & oldselect_args ) < 0 ) {
2015-07-20 19:44:51 +03:00
printaddr ( tcp - > u_arg [ 0 ] ) ;
1999-02-19 03:21:36 +03:00
return 0 ;
}
2015-07-29 21:38:54 +03:00
# ifndef oldselect_args
for ( i = 0 ; i < 5 ; i + + ) {
long_args [ i ] = oldselect_args [ i ] ;
}
# endif
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
return decode_select ( tcp , long_args , print_timeval , sprint_timeval ) ;
2015-07-29 21:38:54 +03:00
# undef oldselect_args
1999-02-19 03:21:36 +03:00
}
1999-11-18 20:09:47 +03:00
# ifdef ALPHA
2015-04-07 04:36:50 +03:00
SYS_FUNC ( osf_select )
1999-11-18 20:09:47 +03:00
{
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
return decode_select ( tcp , tcp - > u_arg , print_timeval32 , sprint_timeval32 ) ;
1999-11-18 20:09:47 +03:00
}
# endif
2015-04-07 04:36:50 +03:00
SYS_FUNC ( select )
1999-02-19 03:21:36 +03:00
{
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
return decode_select ( tcp , tcp - > u_arg , print_timeval , sprint_timeval ) ;
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
}
2015-11-27 07:37:46 +03:00
# include "kernel_types.h"
static int
umove_kulong_array_or_printaddr ( struct tcb * tcp , const long addr ,
kernel_ulong_t * ptr , size_t n )
{
# if defined X86_64 || defined X32
if ( current_personality = = 1 ) {
# else
if ( current_wordsize < sizeof ( * ptr ) ) {
# endif
uint32_t ptr32 [ n ] ;
int r = umove_or_printaddr ( tcp , addr , & ptr32 ) ;
if ( ! r ) {
size_t i ;
for ( i = 0 ; i < n ; + + i )
ptr [ i ] = ( kernel_ulong_t ) ptr32 [ i ] ;
}
return r ;
}
return umoven_or_printaddr ( tcp , addr , n * sizeof ( * ptr ) , ptr ) ;
}
2015-04-07 04:36:50 +03:00
SYS_FUNC ( pselect6 )
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
{
Convert another parser of struct timeval to new mpers infrastructure
* print_time.c (sprint_timeval): New mpers printer.
[ALPHA] (sprint_timeval32): New function.
* defs.h [ALPHA] (sprint_timeval32): New prototype.
(bitness_t, TIMEVAL_TEXT_BUFSIZE, printtv_bitness, sprinttv): Remove.
* desc.c (decode_select): Replace bitness parameter with two printers.
Use them instead of printtv_bitness and sprinttv.
(sys_oldselect, sys_select): Pass print_timeval and sprint_timeval
to decode_select.
[ALPHA] (sys_osf_select): Pass print_timeval32 and sprint_timeval32
to decode_select.
(pselect6): Pass print_timespec and sprint_timespec to decode_select.
* time.c (UTIME_NOW, UTIME_OMIT, current_time_t_is_compat,
struct timeval32, printtv_bitness, do_sprinttv, sprinttv): Remove.
2015-09-18 21:02:50 +03:00
int rc = decode_select ( tcp , tcp - > u_arg , print_timespec , sprint_timespec ) ;
2007-11-02 00:52:20 +03:00
if ( entering ( tcp ) ) {
2015-11-27 07:37:46 +03:00
kernel_ulong_t data [ 2 ] ;
2015-07-20 19:44:51 +03:00
tprints ( " , " ) ;
2015-11-27 07:37:46 +03:00
if ( ! umove_kulong_array_or_printaddr ( tcp , tcp - > u_arg [ 5 ] ,
data , ARRAY_SIZE ( data ) ) ) {
2015-07-20 19:44:51 +03:00
tprints ( " { " ) ;
2015-09-15 05:17:32 +03:00
/* NB: kernel requires data[1] == NSIG / 8 */
2015-11-27 07:37:46 +03:00
print_sigset_addr_len ( tcp , ( unsigned long ) data [ 0 ] ,
( unsigned long ) data [ 1 ] ) ;
2015-12-16 03:07:16 +03:00
tprintf ( " , %llu} " , ( unsigned long long ) data [ 1 ] ) ;
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
}
}
2015-11-27 07:37:46 +03:00
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
return rc ;
1999-02-19 03:21:36 +03:00
}