2015-10-01 15:24:01 +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 >
* Copyright ( c ) 1996 - 1999 Wichert Akkerman < wichert @ cistron . nl >
* 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-10-09 04:38:07 +03:00
# include "flock.h"
2015-10-01 15:24:01 +03:00
fcntl.c: implement decoding for all known operations
* xlat/f_owner_types.in: New file.
* xlat/f_seals.in: Likewise.
* fcntl.c: Include "xlat/f_owner_types.h" and "xlat/f_seals.h".
(print_f_owner_ex): New function.
(SYS_FUNC(fcntl)): Use it.
Handle F_SETPIPE_SZ, F_GETPIPE_SZ, F_OFD_SETLKW,
F_OFD_SETLK, F_SETOWN_EX, F_ADD_SEALS, F_SETSIG,
F_OFD_GETLK, F_GETOWN_EX, F_GET_SEALS, F_GETSIG.
2015-10-10 00:08:43 +03:00
# include "xlat/f_owner_types.h"
# include "xlat/f_seals.h"
2015-10-01 15:24:01 +03:00
# include "xlat/fcntlcmds.h"
fcntl: skip F_GETLK64, F_SETLK64, and F_SETLKW64 in fcntl syscall parser
As the kernel recognizes F_GETLK64, F_SETLK64, and F_SETLKW64 commands
in fcntl64 syscall only, do not parse their structures in fcntl parser.
* xlat/fcntlcmds.in: Move F_GETLK64, F_SETLK64, and F_SETLKW64 ...
* xlat/fcntl64cmds.in: ... here.
* fcntl.c: Include "xlat/fcntl64cmds.h".
(print_fcntl): Move printing of first two syscall arguments
and handling of F_GETLK64, F_SETLK64, and F_SETLKW64 commands ...
(SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): ... here.
* tests/fcntl.c: New file, based on struct_flock.c.
* tests/fcntl64.c: Likewise.
* tests/struct_flock.c (test_flock_einval, create_sample): New functions.
(test_flock): Use test_flock_einval.
(test_flock64, main): Remove.
* tests/fcntl.test: New test.
* tests/fcntl64.test: Likewise.
* tests/struct_flock.test: Remove.
* tests/Makefile.am (check_PROGRAMS): Add fcntl and fcntl64,
remove struct_flock.
(TESTS): Add fcntl.test and fcntl64.test, remove struct_flock.test.
(EXTRA_DIST) Add struct_flock.c.
* tests/.gitignore: Add fcntl and fcntl64, remove struct_flock.
2015-12-05 03:52:01 +03:00
# include "xlat/fcntl64cmds.h"
2015-10-01 15:24:01 +03:00
# include "xlat/fdflags.h"
# include "xlat/lockfcmds.h"
# include "xlat/notifyflags.h"
static void
2015-09-20 02:48:56 +03:00
print_struct_flock64 ( const struct_kernel_flock64 * fl , const int getlk )
{
tprints ( " {l_type= " ) ;
printxval ( lockfcmds , fl - > l_type , " F_??? " ) ;
tprints ( " , l_whence= " ) ;
printxval ( whence_codes , fl - > l_whence , " SEEK_??? " ) ;
2015-12-16 03:07:16 +03:00
tprintf ( " , l_start=%lld, l_len=%lld " ,
2015-09-20 02:48:56 +03:00
( long long ) fl - > l_start , ( long long ) fl - > l_len ) ;
if ( getlk )
tprintf ( " , l_pid=%lu " , ( unsigned long ) fl - > l_pid ) ;
tprints ( " } " ) ;
}
static void
printflock64 ( struct tcb * tcp , const long addr , const int getlk )
2015-10-01 15:24:01 +03:00
{
2015-10-09 04:38:07 +03:00
struct_kernel_flock64 fl ;
2015-10-01 15:24:01 +03:00
2015-09-20 02:48:56 +03:00
if ( fetch_struct_flock64 ( tcp , addr , & fl ) )
print_struct_flock64 ( & fl , getlk ) ;
2015-10-01 15:24:01 +03:00
}
static void
2015-09-20 02:48:56 +03:00
printflock ( struct tcb * tcp , const long addr , const int getlk )
2015-10-01 15:24:01 +03:00
{
2015-09-20 02:48:56 +03:00
struct_kernel_flock64 fl ;
2015-10-01 15:24:01 +03:00
2015-09-20 02:48:56 +03:00
if ( fetch_struct_flock ( tcp , addr , & fl ) )
print_struct_flock64 ( & fl , getlk ) ;
2015-10-01 15:24:01 +03:00
}
fcntl.c: implement decoding for all known operations
* xlat/f_owner_types.in: New file.
* xlat/f_seals.in: Likewise.
* fcntl.c: Include "xlat/f_owner_types.h" and "xlat/f_seals.h".
(print_f_owner_ex): New function.
(SYS_FUNC(fcntl)): Use it.
Handle F_SETPIPE_SZ, F_GETPIPE_SZ, F_OFD_SETLKW,
F_OFD_SETLK, F_SETOWN_EX, F_ADD_SEALS, F_SETSIG,
F_OFD_GETLK, F_GETOWN_EX, F_GET_SEALS, F_GETSIG.
2015-10-10 00:08:43 +03:00
static void
print_f_owner_ex ( struct tcb * tcp , const long addr )
{
struct { int type , pid ; } owner ;
if ( umove_or_printaddr ( tcp , addr , & owner ) )
return ;
tprints ( " {type= " ) ;
printxval ( f_owner_types , owner . type , " F_OWNER_??? " ) ;
tprintf ( " , pid=%d} " , owner . pid ) ;
}
2015-12-05 00:42:58 +03:00
static int
print_fcntl ( struct tcb * tcp )
2015-10-01 15:24:01 +03:00
{
2015-12-05 20:54:26 +03:00
switch ( tcp - > u_arg [ 1 ] ) {
case F_SETFD :
tprints ( " , " ) ;
printflags ( fdflags , tcp - > u_arg [ 2 ] , " FD_??? " ) ;
break ;
case F_SETOWN :
case F_SETPIPE_SZ :
tprintf ( " , %ld " , tcp - > u_arg [ 2 ] ) ;
break ;
case F_DUPFD :
case F_DUPFD_CLOEXEC :
tprintf ( " , %ld " , tcp - > u_arg [ 2 ] ) ;
return RVAL_DECODED | RVAL_FD ;
case F_SETFL :
tprints ( " , " ) ;
tprint_open_modes ( tcp - > u_arg [ 2 ] ) ;
break ;
case F_SETLK :
case F_SETLKW :
tprints ( " , " ) ;
printflock ( tcp , tcp - > u_arg [ 2 ] , 0 ) ;
break ;
case F_OFD_SETLK :
case F_OFD_SETLKW :
tprints ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 0 ) ;
break ;
case F_SETOWN_EX :
tprints ( " , " ) ;
print_f_owner_ex ( tcp , tcp - > u_arg [ 2 ] ) ;
break ;
case F_NOTIFY :
tprints ( " , " ) ;
printflags ( notifyflags , tcp - > u_arg [ 2 ] , " DN_??? " ) ;
break ;
case F_SETLEASE :
tprints ( " , " ) ;
printxval ( lockfcmds , tcp - > u_arg [ 2 ] , " F_??? " ) ;
break ;
case F_ADD_SEALS :
tprints ( " , " ) ;
printflags ( f_seals , tcp - > u_arg [ 2 ] , " F_SEAL_??? " ) ;
break ;
case F_SETSIG :
tprints ( " , " ) ;
tprints ( signame ( tcp - > u_arg [ 2 ] ) ) ;
break ;
case F_GETOWN :
case F_GETPIPE_SZ :
break ;
case F_GETFD :
if ( entering ( tcp ) | | syserror ( tcp ) | | tcp - > u_rval = = 0 )
return 0 ;
tcp - > auxstr = sprintflags ( " flags " , fdflags , tcp - > u_rval ) ;
return RVAL_HEX | RVAL_STR ;
case F_GETFL :
if ( entering ( tcp ) | | syserror ( tcp ) )
return 0 ;
tcp - > auxstr = sprint_open_modes ( tcp - > u_rval ) ;
return RVAL_HEX | RVAL_STR ;
case F_GETLK :
if ( entering ( tcp ) )
return 0 ;
tprints ( " , " ) ;
printflock ( tcp , tcp - > u_arg [ 2 ] , 1 ) ;
break ;
case F_OFD_GETLK :
if ( entering ( tcp ) )
return 0 ;
tprints ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 1 ) ;
break ;
case F_GETOWN_EX :
if ( entering ( tcp ) )
return 0 ;
tprints ( " , " ) ;
print_f_owner_ex ( tcp , tcp - > u_arg [ 2 ] ) ;
break ;
case F_GETLEASE :
if ( entering ( tcp ) | | syserror ( tcp ) )
return 0 ;
tcp - > auxstr = xlookup ( lockfcmds , tcp - > u_rval ) ;
return RVAL_HEX | RVAL_STR ;
case F_GET_SEALS :
if ( entering ( tcp ) | | syserror ( tcp ) | | tcp - > u_rval = = 0 )
return 0 ;
tcp - > auxstr = sprintflags ( " seals " , f_seals , tcp - > u_rval ) ;
return RVAL_HEX | RVAL_STR ;
case F_GETSIG :
if ( entering ( tcp ) | | syserror ( tcp ) | | tcp - > u_rval = = 0 )
2015-10-09 04:55:46 +03:00
return 0 ;
2015-12-05 20:54:26 +03:00
tcp - > auxstr = signame ( tcp - > u_rval ) ;
return RVAL_STR ;
default :
tprintf ( " , %#lx " , tcp - > u_arg [ 2 ] ) ;
break ;
2015-10-01 15:24:01 +03:00
}
2015-12-05 20:54:26 +03:00
return RVAL_DECODED ;
2015-10-01 15:24:01 +03:00
}
2015-12-05 00:42:58 +03:00
SYS_FUNC ( fcntl )
{
fcntl: skip F_GETLK64, F_SETLK64, and F_SETLKW64 in fcntl syscall parser
As the kernel recognizes F_GETLK64, F_SETLK64, and F_SETLKW64 commands
in fcntl64 syscall only, do not parse their structures in fcntl parser.
* xlat/fcntlcmds.in: Move F_GETLK64, F_SETLK64, and F_SETLKW64 ...
* xlat/fcntl64cmds.in: ... here.
* fcntl.c: Include "xlat/fcntl64cmds.h".
(print_fcntl): Move printing of first two syscall arguments
and handling of F_GETLK64, F_SETLK64, and F_SETLKW64 commands ...
(SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): ... here.
* tests/fcntl.c: New file, based on struct_flock.c.
* tests/fcntl64.c: Likewise.
* tests/struct_flock.c (test_flock_einval, create_sample): New functions.
(test_flock): Use test_flock_einval.
(test_flock64, main): Remove.
* tests/fcntl.test: New test.
* tests/fcntl64.test: Likewise.
* tests/struct_flock.test: Remove.
* tests/Makefile.am (check_PROGRAMS): Add fcntl and fcntl64,
remove struct_flock.
(TESTS): Add fcntl.test and fcntl64.test, remove struct_flock.test.
(EXTRA_DIST) Add struct_flock.c.
* tests/.gitignore: Add fcntl and fcntl64, remove struct_flock.
2015-12-05 03:52:01 +03:00
if ( entering ( tcp ) ) {
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
const char * str = xlookup ( fcntlcmds , tcp - > u_arg [ 1 ] ) ;
if ( str ) {
tprints ( str ) ;
} else {
/*
* fcntl syscall does not recognize these
* constants , but we would like to show them
* for better debugging experience .
*/
printxval ( fcntl64cmds , tcp - > u_arg [ 1 ] , " F_??? " ) ;
}
}
2015-12-05 00:42:58 +03:00
return print_fcntl ( tcp ) ;
}
SYS_FUNC ( fcntl64 )
{
fcntl: skip F_GETLK64, F_SETLK64, and F_SETLKW64 in fcntl syscall parser
As the kernel recognizes F_GETLK64, F_SETLK64, and F_SETLKW64 commands
in fcntl64 syscall only, do not parse their structures in fcntl parser.
* xlat/fcntlcmds.in: Move F_GETLK64, F_SETLK64, and F_SETLKW64 ...
* xlat/fcntl64cmds.in: ... here.
* fcntl.c: Include "xlat/fcntl64cmds.h".
(print_fcntl): Move printing of first two syscall arguments
and handling of F_GETLK64, F_SETLK64, and F_SETLKW64 commands ...
(SYS_FUNC(fcntl), SYS_FUNC(fcntl64)): ... here.
* tests/fcntl.c: New file, based on struct_flock.c.
* tests/fcntl64.c: Likewise.
* tests/struct_flock.c (test_flock_einval, create_sample): New functions.
(test_flock): Use test_flock_einval.
(test_flock64, main): Remove.
* tests/fcntl.test: New test.
* tests/fcntl64.test: Likewise.
* tests/struct_flock.test: Remove.
* tests/Makefile.am (check_PROGRAMS): Add fcntl and fcntl64,
remove struct_flock.
(TESTS): Add fcntl.test and fcntl64.test, remove struct_flock.test.
(EXTRA_DIST) Add struct_flock.c.
* tests/.gitignore: Add fcntl and fcntl64, remove struct_flock.
2015-12-05 03:52:01 +03:00
if ( entering ( tcp ) ) {
printfd ( tcp , tcp - > u_arg [ 0 ] ) ;
tprints ( " , " ) ;
const char * str = xlookup ( fcntl64cmds , tcp - > u_arg [ 1 ] ) ;
if ( str ) {
tprints ( str ) ;
} else {
printxval ( fcntlcmds , tcp - > u_arg [ 1 ] , " F_??? " ) ;
}
}
switch ( tcp - > u_arg [ 1 ] ) {
case F_SETLK64 :
case F_SETLKW64 :
tprints ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 0 ) ;
return RVAL_DECODED ;
case F_GETLK64 :
if ( exiting ( tcp ) ) {
tprints ( " , " ) ;
printflock64 ( tcp , tcp - > u_arg [ 2 ] , 1 ) ;
}
return 0 ;
}
2015-12-05 00:42:58 +03:00
return print_fcntl ( tcp ) ;
}