2016-01-02 12:05:14 +00:00
/*
* Copyright ( c ) 2016 Dmitry V . Levin < ldv @ altlinux . org >
2017-05-22 19:14:52 +02:00
* Copyright ( c ) 2016 - 2017 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
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <sys / types.h>
2016-12-16 12:01:44 +00:00
# include "kernel_types.h"
2016-01-02 12:05:14 +00:00
# include "gcc_compat.h"
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
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 ;
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 .
* Pages allocated by this call are preceeded by an unmapped page
* 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
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 ) ;
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 * ) ;
2016-05-10 22:05:53 +00:00
/* Print memory in a quoted form. */
void print_quoted_memory ( const char * , size_t ) ;
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. */
int create_nl_socket ( int ) ;
2016-11-30 00:56:04 +00:00
/* Create a pipe with maximized descriptor numbers. */
void pipe_maxfd ( int pipefd [ 2 ] ) ;
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 ARRAY_SIZE(arg) ((unsigned int) (sizeof(arg) / sizeof((arg)[0])))
# 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 ) )
2016-01-02 12:05:14 +00:00
# define SKIP_MAIN_UNDEFINED(arg) \
int main ( void ) { error_msg_and_skip ( " undefined: %s " , arg ) ; }
2016-05-18 18:09:41 -04:00
/*
* The kernel used to define 64 - bit types on 64 - bit systems on a per - arch
* basis . Some architectures would use unsigned long and others would use
* unsigned long long . These types were exported as part of the
* kernel - userspace ABI and now must be maintained forever . This matches
* what the kernel exports for each architecture so we don ' t need to cast
* every printing of __u64 or __s64 to stdint types .
*/
# if SIZEOF_LONG == 4
# define PRI__64 "ll"
# elif defined ALPHA || defined IA64 || defined MIPS || defined POWERPC
# define PRI__64 "l"
# else
# define PRI__64 "ll"
# endif
# define PRI__d64 PRI__64"d"
# define PRI__u64 PRI__64"u"
# define PRI__x64 PRI__64"x"
2016-10-12 10:24:00 +03: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-13 10:26:07 +03:00
# define _STR(_arg) #_arg
# define ARG_STR(_arg) (_arg), #_arg
# define ARG_ULL_STR(_arg) _arg##ULL, #_arg
2016-08-06 21:51:29 +00:00
# endif /* !STRACE_TESTS_H */