2016-01-02 12:05:14 +00:00
/*
* Copyright ( c ) 2016 Dmitry V . Levin < ldv @ altlinux . org >
2018-02-13 22:00:00 +00:00
* Copyright ( c ) 2016 - 2018 The strace developers .
2016-01-02 12:05:14 +00: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 .
*/
2016-08-06 21:51:29 +00:00
# ifndef STRACE_TESTS_H
# define STRACE_TESTS_H
2016-01-02 12:05:14 +00:00
2018-04-03 08:08:09 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
2018-02-02 17:58:18 +01:00
2018-04-03 08:08:09 +00:00
# ifdef TESTS_SIZEOF_KERNEL_LONG_T
# undef SIZEOF_KERNEL_LONG_T
# define SIZEOF_KERNEL_LONG_T TESTS_SIZEOF_KERNEL_LONG_T
# endif
# ifdef TESTS_SIZEOF_LONG
# undef SIZEOF_LONG
# define SIZEOF_LONG TESTS_SIZEOF_LONG
# endif
2018-04-03 08:08:09 +00:00
# include <stdbool.h>
# include <sys/types.h>
# include "kernel_types.h"
# include "gcc_compat.h"
# include "macros.h"
2016-01-02 12:05:14 +00:00
2017-07-01 13:14:49 +00:00
/*
* The printf - like function to use in header files
* shared between strace and its tests .
*/
# ifndef STRACE_PRINTF
# define STRACE_PRINTF printf
# endif
2016-09-21 00:35:30 +00:00
/* Tests of "strace -v" are expected to define VERBOSE to 1. */
# ifndef VERBOSE
# define VERBOSE 0
# endif
tests: add mmap/mmap64 variants different xlat verbosity levels
* tests/tests.h [!XLAT_RAW] (XLAT_RAW): Define.
[!XLAT_VERBOSE] (XLAT_VERBOSE): Likewise.
* tests/mmap-Xabbrev.c: New file.
* tests/mmap-Xraw.c: Likewise.
* tests/mmap-Xverbose.c: Likewise.
* tests/mmap64-Xabbrev.c: Likewise.
* tests/mmap64-Xraw.c: Likewise.
* tests/mmap64-Xverbose.c: Likewise.
* tests/mmap.c (main): Add handling of XLAT_RAW and XLAT_VERBOSE macros.
* tests/mmap.test: Add handling of optional test arguments that set
alignment and xlat verbosity options.
* tests/Makefile.am (mmap64_Xabbrev_CPPFLAGS, mmap64_Xraw_CPPFLAGS,
mmap64_Xverbose_CPPFLAGS): New variables, analogous to mmap64_CPPFLAGS.
* tests/pure_executables.list: Add mmap-Xabbrev, mmap-Xraw,
mmap-Xverbose, mmap64-Xabbrev, mmap64-Xraw, and mmap64-Xverbose.
* tests/.gitignore: Likewise.
* tests/gen_tests.in (mmap-Xabbrev, mmap-Xraw, mmap-Xverbose,
mmap64-Xabbrev, mmap64-Xraw, mmap64-Xverbose): New tests.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
2018-04-04 17:38:53 +02:00
/* xlat verbosity defaults */
# ifndef XLAT_RAW
# define XLAT_RAW 0
# endif
# ifndef XLAT_VERBOSE
# define XLAT_VERBOSE 0
# endif
2017-07-03 15:14:54 +00:00
# ifndef DEFAULT_STRLEN
/* Default maximum # of bytes printed in printstr et al. */
# define DEFAULT_STRLEN 32
# endif
2016-01-02 12:05:14 +00:00
/* Cached sysconf(_SC_PAGESIZE). */
size_t get_page_size ( void ) ;
2017-02-20 00:10:35 +00:00
/* The size of kernel's sigset_t. */
unsigned int get_sigset_size ( void ) ;
2016-01-02 12:05:14 +00:00
/* Print message and strerror(errno) to stderr, then exit(1). */
void perror_msg_and_fail ( const char * , . . . )
ATTRIBUTE_FORMAT ( ( printf , 1 , 2 ) ) ATTRIBUTE_NORETURN ;
2016-01-21 23:46:43 +00:00
/* Print message to stderr, then exit(1). */
void error_msg_and_fail ( const char * , . . . )
ATTRIBUTE_FORMAT ( ( printf , 1 , 2 ) ) ATTRIBUTE_NORETURN ;
2016-01-02 12:05:14 +00:00
/* Print message to stderr, then exit(77). */
void error_msg_and_skip ( const char * , . . . )
ATTRIBUTE_FORMAT ( ( printf , 1 , 2 ) ) ATTRIBUTE_NORETURN ;
/* Print message and strerror(errno) to stderr, then exit(77). */
void perror_msg_and_skip ( const char * , . . . )
ATTRIBUTE_FORMAT ( ( printf , 1 , 2 ) ) ATTRIBUTE_NORETURN ;
2018-01-23 21:17:05 +00:00
# ifndef perror_msg_and_fail
# define perror_msg_and_fail(fmt_, ...) \
perror_msg_and_fail ( " %s:%d: " fmt_ , __FILE__ , __LINE__ , # # __VA_ARGS__ )
# endif
# ifndef perror_msg_and_fail
# define error_msg_and_fail(fmt_, ...) \
error_msg_and_fail ( " %s:%d: " fmt_ , __FILE__ , __LINE__ , # # __VA_ARGS__ )
# endif
2017-04-19 02:16:31 +00:00
/* Stat the specified file and skip the test if the stat call failed. */
void skip_if_unavailable ( const char * ) ;
2016-01-02 12:05:14 +00:00
/*
* Allocate memory that ends on the page boundary .
2017-06-16 22:54:04 +00:00
* Pages allocated by this call are preceded by an unmapped page
2016-01-02 12:05:14 +00:00
* and followed also by an unmapped page .
*/
void * tail_alloc ( const size_t )
ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ( ( 1 ) ) ;
2016-01-11 00:17:36 +00:00
/* Allocate memory using tail_alloc, then memcpy. */
void * tail_memdup ( const void * , const size_t )
ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE ( ( 2 ) ) ;
2016-01-02 12:05:14 +00:00
2018-05-08 07:10:16 +02:00
# define midtail_alloc(after_, before_) \
( ( void * ) ( ( char * ) tail_alloc ( ( ( before_ ) + ( after_ ) ) ) + ( before_ ) ) )
2017-03-16 13:46:36 +00:00
/*
* Allocate an object of the specified type at the end
* of a mapped memory region .
* Assign its address to the specified constant pointer .
*/
# define TAIL_ALLOC_OBJECT_CONST_PTR(type_name, type_ptr) \
type_name * const type_ptr = tail_alloc ( sizeof ( * type_ptr ) )
/*
* Allocate an object of the specified type at the end
* of a mapped memory region .
* Assign its address to the specified variable pointer .
*/
# define TAIL_ALLOC_OBJECT_VAR_PTR(type_name, type_ptr) \
type_name * type_ptr = tail_alloc ( sizeof ( * type_ptr ) )
2016-10-02 23:39:11 +03:00
/*
* Fill memory ( pointed by ptr , having size bytes ) with different bytes ( with
* values starting with start and resetting every period ) in order to catch
* sign , byte order and / or alignment errors .
*/
2017-01-04 22:08:32 +00:00
void fill_memory_ex ( void * ptr , size_t size , unsigned char start ,
2016-10-02 23:39:11 +03:00
unsigned char period ) ;
/* Shortcut for fill_memory_ex(ptr, size, 0x80, 0x80) */
2017-01-04 22:08:32 +00:00
void fill_memory ( void * ptr , size_t size ) ;
2016-10-02 23:39:11 +03:00
2016-01-20 02:06:59 +00:00
/* Close stdin, move stdout to a non-standard descriptor, and print. */
void tprintf ( const char * , . . . )
ATTRIBUTE_FORMAT ( ( printf , 1 , 2 ) ) ;
2016-01-20 05:26:43 +00:00
/* Make a hexdump copy of C string */
const char * hexdump_strdup ( const char * ) ;
2016-04-02 18:24:36 +00:00
/* Make a hexdump copy of memory */
const char * hexdump_memdup ( const char * , size_t ) ;
2016-02-04 01:59:35 +00:00
/* Make a hexquoted copy of a string */
const char * hexquote_strndup ( const char * , size_t ) ;
2016-01-25 22:20:40 +00:00
/* Return inode number of socket descriptor. */
unsigned long inode_of_sockfd ( int ) ;
2018-02-02 18:46:29 +01:00
/* Print string in a quoted form with optional escape characters. */
void print_quoted_string_ex ( const char * , bool quote , const char * escape_str ) ;
2018-02-02 17:58:18 +01:00
2016-05-10 22:05:53 +00:00
/* Print string in a quoted form. */
2016-04-13 22:38:17 +00:00
void print_quoted_string ( const char * ) ;
2017-07-24 12:10:54 +00:00
/*
* Print a NUL - terminated string ` str ' of length up to ` size ' - 1
* in a quoted form .
*/
void print_quoted_cstring ( const char * str , size_t size ) ;
2018-02-02 18:46:29 +01:00
/* Print memory in a quoted form with optional escape characters. */
void print_quoted_memory_ex ( const void * , size_t , bool quote ,
const char * escape_chars ) ;
2018-02-02 17:58:18 +01:00
2016-05-10 22:05:53 +00:00
/* Print memory in a quoted form. */
2017-07-08 14:57:44 +00:00
void print_quoted_memory ( const void * , size_t ) ;
2016-05-10 22:05:53 +00:00
2017-07-04 14:21:18 +08:00
/* Print memory in a hexquoted form. */
2017-07-08 14:57:44 +00:00
void print_quoted_hex ( const void * , size_t ) ;
2017-07-04 14:21:18 +08:00
2017-02-26 23:23:31 +00:00
/* Print time_t and nanoseconds in symbolic format. */
Always print raw values of time data fields
Refactor sprinttime: implement sprinttime_nsec and sprinttime_usec
that handle nanoseconds and microseconds, respectively.
Always print raw values of time data fields, format string
representations of time as comments.
* defs.h (sprinttime): Change argument type from time_t to long long.
(sprinttime_nsec, sprinttime_usec): New prototypes.
* util.c (sprinttime_ex, sprinttime_nsec, sprinttime_usec): New
functions.
(sprinttime): Turn into a thin wrapper around sprinttime_ex.
* stat.h (struct strace_stat): Add has_nsec field.
* fetch_struct_stat.c (HAVE_NSEC): New macro.
(fetch_struct_stat): Initialize has_nsec field with HAVE_NSEC.
* fetch_struct_stat64.c (HAVE_NSEC): New macro.
(fetch_struct_stat64): Initialize has_nsec field with HAVE_NSEC.
* print_struct_stat.c (print_struct_stat) <PRINT_ST_TIME>:
Print raw values of time fields, use sprinttime_nsec to format a string
representation of time, use tprints_comment to print it as a comment.
* statx.c (SYS_FUNC(statx)) <PRINT_FIELD_TIME>: Likewise.
* utime.c (SYS_FUNC(utime)): Print raw values of struct utimbuf.actime
and struct utimbuf.modtime fields, use sprinttime to format a string
representation of time, use tprints_comment to print it as a comment.
* tests/tests.h (print_time_t_nsec): Add int argument.
* tests/print_time.c (print_time_t_ex): New function.
(print_time_t_nsec): Add int argument, turn into a thin wrapper around
print_time_t_ex.
* tests/utime.c (main): Update expected output.
* tests/xstatx.c [!IS_STATX] (HAVE_NSEC): New macro.
[!IS_STATX] (PRINT_ST_TIME), [IS_STATX] (PRINT_FIELD_TIME): Update
expected output.
* NEWS: Mention this timestamps representation improvement.
Co-authored-by: Dmitry V. Levin <ldv@altlinux.org>
2017-04-21 05:16:12 +02:00
void print_time_t_nsec ( time_t , unsigned long long , int ) ;
2017-02-26 20:35:37 +00:00
2017-04-23 06:04:44 +02:00
/* Print time_t and microseconds in symbolic format. */
void print_time_t_usec ( time_t , unsigned long long , int ) ;
2016-07-03 22:15:38 +00:00
/* Read an int from the file. */
int read_int_from_file ( const char * , int * ) ;
2016-04-13 22:38:17 +00:00
/* Check whether given uid matches kernel overflowuid. */
void check_overflowuid ( const int ) ;
/* Check whether given gid matches kernel overflowgid. */
void check_overflowgid ( const int ) ;
2016-03-23 19:04:15 +05:30
2016-04-26 00:13:47 +00:00
/* Translate errno to its name. */
2016-04-20 22:51:28 +00:00
const char * errno2name ( void ) ;
2016-06-16 10:42:13 +08:00
/* Translate signal number to its name. */
const char * signal2name ( int ) ;
2016-09-02 18:28:02 +03:00
/* Print return code and, in case return code is -1, errno information. */
const char * sprintrc ( long rc ) ;
2016-09-06 05:08:24 +03:00
/* sprintrc variant suitable for usage as part of grep pattern. */
const char * sprintrc_grep ( long rc ) ;
2016-09-02 18:28:02 +03:00
2016-04-26 00:13:47 +00:00
struct xlat ;
2016-04-27 20:29:46 +00:00
/* Print flags in symbolic form according to xlat table. */
2016-04-26 00:13:47 +00:00
int printflags ( const struct xlat * , const unsigned long long , const char * ) ;
2016-04-27 20:29:46 +00:00
/* Print constant in symbolic form according to xlat table. */
int printxval ( const struct xlat * , const unsigned long long , const char * ) ;
2016-07-19 11:18:25 +00:00
/* Invoke a socket syscall, either directly or via __NR_socketcall. */
int socketcall ( const int nr , const int call ,
long a1 , long a2 , long a3 , long a4 , long a5 ) ;
2016-07-19 15:09:05 +00:00
/* Wrappers for recvmmsg and sendmmsg syscalls. */
struct mmsghdr ;
struct timespec ;
int recv_mmsg ( int , struct mmsghdr * , unsigned int , unsigned int , struct timespec * ) ;
int send_mmsg ( int , struct mmsghdr * , unsigned int , unsigned int ) ;
2017-06-05 22:05:07 +08:00
/* Create a netlink socket. */
2017-06-05 12:17:49 +00:00
int create_nl_socket_ext ( int proto , const char * name ) ;
# define create_nl_socket(proto) create_nl_socket_ext((proto), #proto)
2017-06-05 22:05:07 +08:00
2016-11-30 00:56:04 +00:00
/* Create a pipe with maximized descriptor numbers. */
void pipe_maxfd ( int pipefd [ 2 ] ) ;
2017-08-08 20:40:57 +00:00
/* if_nametoindex("lo") */
unsigned int ifindex_lo ( void ) ;
# ifdef HAVE_IF_INDEXTONAME
# define IFINDEX_LO_STR "if_nametoindex(\"lo\")"
# else
# define IFINDEX_LO_STR "1"
# endif
2016-12-23 18:44:37 +00:00
# define F8ILL_KULONG_SUPPORTED (sizeof(void *) < sizeof(kernel_ulong_t))
# define F8ILL_KULONG_MASK ((kernel_ulong_t) 0xffffffff00000000ULL)
/*
* For 64 - bit kernel_ulong_t and 32 - bit pointer ,
* return a kernel_ulong_t value by filling higher bits .
* For other architertures , return the original pointer .
*/
static inline kernel_ulong_t
f8ill_ptr_to_kulong ( const void * const ptr )
{
const unsigned long uptr = ( unsigned long ) ptr ;
return F8ILL_KULONG_SUPPORTED
? F8ILL_KULONG_MASK | uptr : ( kernel_ulong_t ) uptr ;
}
2016-01-20 05:08:04 +00:00
# define LENGTH_OF(arg) ((unsigned int) sizeof(arg) - 1)
2016-08-31 16:09:24 +00:00
/* Zero-extend a signed integer type to unsigned long long. */
2016-08-23 00:24:10 +00:00
# define zero_extend_signed_to_ull(v) \
2016-09-26 20:27:53 +00:00
( sizeof ( v ) = = sizeof ( char ) ? ( unsigned long long ) ( unsigned char ) ( v ) : \
sizeof ( v ) = = sizeof ( short ) ? ( unsigned long long ) ( unsigned short ) ( v ) : \
2016-08-23 00:24:17 +00:00
sizeof ( v ) = = sizeof ( int ) ? ( unsigned long long ) ( unsigned int ) ( v ) : \
2016-06-10 09:13:32 +00:00
sizeof ( v ) = = sizeof ( long ) ? ( unsigned long long ) ( unsigned long ) ( v ) : \
( unsigned long long ) ( v ) )
2016-08-31 16:09:24 +00:00
/* Sign-extend an unsigned integer type to long long. */
# define sign_extend_unsigned_to_ll(v) \
2016-09-26 20:27:53 +00:00
( sizeof ( v ) = = sizeof ( char ) ? ( long long ) ( char ) ( v ) : \
sizeof ( v ) = = sizeof ( short ) ? ( long long ) ( short ) ( v ) : \
2016-08-31 16:09:24 +00:00
sizeof ( v ) = = sizeof ( int ) ? ( long long ) ( int ) ( v ) : \
sizeof ( v ) = = sizeof ( long ) ? ( long long ) ( long ) ( v ) : \
( long long ) ( v ) )
2018-04-03 08:08:09 +00:00
# define SKIP_MAIN_UNDEFINED(arg) \
2016-01-02 12:05:14 +00:00
int main ( void ) { error_msg_and_skip ( " undefined: %s " , arg ) ; }
2018-04-03 08:08:09 +00:00
# if WORDS_BIGENDIAN
# define LL_PAIR(HI, LO) (HI), (LO)
# else
# define LL_PAIR(HI, LO) (LO), (HI)
# endif
# define LL_VAL_TO_PAIR(llval) LL_PAIR((long) ((llval) >> 32), (long) (llval))
2016-10-12 10:24:00 +03:00
2018-04-03 08:08:09 +00:00
# define ARG_STR(_arg) (_arg), #_arg
# define ARG_ULL_STR(_arg) _arg##ULL, #_arg
2016-10-13 10:26:07 +03:00
2017-06-20 17:41:59 +00:00
/*
* Assign an object of type DEST_TYPE at address DEST_ADDR
* using memcpy to avoid potential unaligned access .
*/
# define SET_STRUCT(DEST_TYPE, DEST_ADDR, ...) \
do { \
DEST_TYPE dest_type_tmp_var = { __VA_ARGS__ } ; \
memcpy ( DEST_ADDR , & dest_type_tmp_var , sizeof ( dest_type_tmp_var ) ) ; \
} while ( 0 )
2017-06-27 16:18:23 +08:00
# define NLMSG_ATTR(nlh, hdrlen) ((void *)(nlh) + NLMSG_SPACE(hdrlen))
2016-08-06 21:51:29 +00:00
# endif /* !STRACE_TESTS_H */