From: Edgar Kaziakhmedov <edgar.kaziakhme...@virtuzzo.com> In order to allow usage of utility functions by other binaries included in the strace package (like the upcoming asinfo utility), these functions should be moved to separate files.
* Makefile.am (strace_SOURCES): Add error_prints.c, error_prints.h, and xmalloc.h. * defs.h: Include "xmalloc.h" and "error_prints.h". (error_msg, error_msg_and_help, error_msg_and_die, perror_msg, perror_msg_and_die, xcalloc, xmalloc, xreallocarray, xstrdup, xstrndup): Move to corresponding headers. * error_prints.h: New file. (error_msg, error_msg_and_die, error_msg_and_help, perror_msg, perror_msg_and_die): Move from defs.h. * xmalloc.h: New file. (xcalloc, xmalloc, xreallocarray, xstrdup, xstrndup): Move from defs.h. * strace.c (die): Remove static quialifier to make visible for error_prints.c (die_out_of_memory, error_msg, error_msg_and_help, error_msg_and_die, perror_msg, perror_msg_and_die, verror_msg): Move ... * error_prints.c: ... to the new file. * xmalloc.c: Remove "defs.h". Add "xmalloc.h". Fix codestyle. Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhme...@virtuozzo.com> --- Makefile.am | 3 ++ defs.h | 21 ++-------- error_prints.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ error_prints.h | 50 +++++++++++++++++++++++ strace.c | 79 +----------------------------------- xmalloc.c | 26 ++++++++---- xmalloc.h | 45 +++++++++++++++++++++ 7 files changed, 244 insertions(+), 103 deletions(-) create mode 100644 error_prints.c create mode 100644 error_prints.h create mode 100644 xmalloc.h diff --git a/Makefile.am b/Makefile.am index 92e80842..20708711 100644 --- a/Makefile.am +++ b/Makefile.am @@ -113,6 +113,8 @@ strace_SOURCES = \ dyxlat.c \ empty.h \ epoll.c \ + error_prints.c \ + error_prints.h \ evdev.c \ eventfd.c \ execve.c \ @@ -294,6 +296,7 @@ strace_SOURCES = \ xlat.c \ xlat.h \ xmalloc.c \ + xmalloc.h \ # end of strace_SOURCES if USE_LIBUNWIND diff --git a/defs.h b/defs.h index a45d37b5..081fd4a8 100644 --- a/defs.h +++ b/defs.h @@ -53,11 +53,13 @@ #include <time.h> #include <sys/time.h> -#include "kernel_types.h" +#include "error_prints.h" #include "gcc_compat.h" +#include "kernel_types.h" #include "macros.h" #include "mpers_type.h" #include "sysent.h" +#include "xmalloc.h" #ifndef HAVE_STRERROR const char *strerror(int); @@ -384,23 +386,6 @@ extern unsigned os_release; #undef KERNEL_VERSION #define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c)) -void error_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); -void perror_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); -void error_msg_and_die(const char *fmt, ...) - ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; -void error_msg_and_help(const char *fmt, ...) - ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; -void perror_msg_and_die(const char *fmt, ...) - ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; - -void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1)); -void *xcalloc(size_t nmemb, size_t size) - ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2)); -void *xreallocarray(void *ptr, size_t nmemb, size_t size) - ATTRIBUTE_ALLOC_SIZE((2, 3)); -char *xstrdup(const char *str) ATTRIBUTE_MALLOC; -char *xstrndup(const char *str, size_t n) ATTRIBUTE_MALLOC; - extern int read_int_from_file(const char *, int *); extern void set_sortby(const char *); diff --git a/error_prints.c b/error_prints.c new file mode 100644 index 00000000..8519b924 --- /dev/null +++ b/error_prints.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 1999-2017 The strace developers. + * 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <errno.h> +#include <stdarg.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#include "error_prints.h" + +extern char *program_invocation_name; + +static void +verror_msg(int err_no, const char *fmt, va_list p) +{ + char *msg; + + fflush(NULL); + + /* We want to print entire message with single fprintf to ensure + * message integrity if stderr is shared with other programs. + * Thus we use vasprintf + single fprintf. + */ + msg = NULL; + if (vasprintf(&msg, fmt, p) >= 0) { + if (err_no) + fprintf(stderr, "%s: %s: %s\n", + program_invocation_name, msg, strerror(err_no)); + else + fprintf(stderr, "%s: %s\n", + program_invocation_name, msg); + free(msg); + } else { + /* malloc in vasprintf failed, try it without malloc */ + fprintf(stderr, "%s: ", program_invocation_name); + vfprintf(stderr, fmt, p); + if (err_no) + fprintf(stderr, ": %s\n", strerror(err_no)); + else + putc('\n', stderr); + } + /* We don't switch stderr to buffered, thus fprintf(stderr) + * always flushes its output and this is not necessary: */ + /* fflush(stderr); */ +} + +void +error_msg(const char *fmt, ...) +{ + va_list p; + va_start(p, fmt); + verror_msg(0, fmt, p); + va_end(p); +} + +void +error_msg_and_die(const char *fmt, ...) +{ + va_list p; + va_start(p, fmt); + verror_msg(0, fmt, p); + die(); +} + +void +error_msg_and_help(const char *fmt, ...) +{ + if (fmt != NULL) { + va_list p; + va_start(p, fmt); + verror_msg(0, fmt, p); + } + fprintf(stderr, "Try '%s -h' for more information.\n", + program_invocation_name); + die(); +} + +void +perror_msg(const char *fmt, ...) +{ + va_list p; + va_start(p, fmt); + verror_msg(errno, fmt, p); + va_end(p); +} + +void +perror_msg_and_die(const char *fmt, ...) +{ + va_list p; + va_start(p, fmt); + verror_msg(errno, fmt, p); + die(); +} diff --git a/error_prints.h b/error_prints.h new file mode 100644 index 00000000..0a818c94 --- /dev/null +++ b/error_prints.h @@ -0,0 +1,50 @@ +/* + * This file contains error printing functions. This set of soubroutines can be + * used by various binaries included in the strace package. For compilation + * variable 'program_invocation_name' and function 'die()' have to be defined + * globally. + * + * Copyright (c) 2001-2017 The strace developers. + * 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. + */ + +#ifndef STRACE_ERROR_PRINTS_H +#define STRACE_ERROR_PRINTS_H + +#include "gcc_compat.h" + +extern void +ATTRIBUTE_NORETURN die(void); + +void error_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); +void perror_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); +void perror_msg_and_die(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; +void error_msg_and_help(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; +void error_msg_and_die(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; + +#endif /* !STRACE_ERROR_PRINTS_H */ diff --git a/strace.c b/strace.c index 0015ad50..f23a7e34 100644 --- a/strace.c +++ b/strace.c @@ -286,7 +286,7 @@ Miscellaneous:\n\ exit(0); } -static void ATTRIBUTE_NORETURN +void ATTRIBUTE_NORETURN die(void) { if (strace_tracer_pid == getpid()) { @@ -296,83 +296,6 @@ die(void) exit(1); } -static void verror_msg(int err_no, const char *fmt, va_list p) -{ - char *msg; - - fflush(NULL); - - /* We want to print entire message with single fprintf to ensure - * message integrity if stderr is shared with other programs. - * Thus we use vasprintf + single fprintf. - */ - msg = NULL; - if (vasprintf(&msg, fmt, p) >= 0) { - if (err_no) - fprintf(stderr, "%s: %s: %s\n", - program_invocation_name, msg, strerror(err_no)); - else - fprintf(stderr, "%s: %s\n", - program_invocation_name, msg); - free(msg); - } else { - /* malloc in vasprintf failed, try it without malloc */ - fprintf(stderr, "%s: ", program_invocation_name); - vfprintf(stderr, fmt, p); - if (err_no) - fprintf(stderr, ": %s\n", strerror(err_no)); - else - putc('\n', stderr); - } - /* We don't switch stderr to buffered, thus fprintf(stderr) - * always flushes its output and this is not necessary: */ - /* fflush(stderr); */ -} - -void error_msg(const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - verror_msg(0, fmt, p); - va_end(p); -} - -void error_msg_and_die(const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - verror_msg(0, fmt, p); - die(); -} - -void error_msg_and_help(const char *fmt, ...) -{ - if (fmt != NULL) { - va_list p; - va_start(p, fmt); - verror_msg(0, fmt, p); - } - fprintf(stderr, "Try '%s -h' for more information.\n", - program_invocation_name); - die(); -} - -void perror_msg(const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - verror_msg(errno, fmt, p); - va_end(p); -} - -void perror_msg_and_die(const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - verror_msg(errno, fmt, p); - die(); -} - static void error_opt_arg(int opt, const char *arg) { diff --git a/xmalloc.c b/xmalloc.c index 43e93eb3..4290a017 100644 --- a/xmalloc.c +++ b/xmalloc.c @@ -25,9 +25,16 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "defs.h" +#include <stdbool.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> -static void die_out_of_memory(void) +#include "error_prints.h" +#include "xmalloc.h" + +static void +die_out_of_memory(void) { static bool recursed; @@ -38,7 +45,8 @@ static void die_out_of_memory(void) error_msg_and_die("Out of memory"); } -void *xmalloc(size_t size) +void * +xmalloc(size_t size) { void *p = malloc(size); @@ -48,7 +56,8 @@ void *xmalloc(size_t size) return p; } -void *xcalloc(size_t nmemb, size_t size) +void * +xcalloc(size_t nmemb, size_t size) { void *p = calloc(nmemb, size); @@ -60,7 +69,8 @@ void *xcalloc(size_t nmemb, size_t size) #define HALF_SIZE_T (((size_t) 1) << (sizeof(size_t) * 4)) -void *xreallocarray(void *ptr, size_t nmemb, size_t size) +void * +xreallocarray(void *ptr, size_t nmemb, size_t size) { size_t bytes = nmemb * size; @@ -76,7 +86,8 @@ void *xreallocarray(void *ptr, size_t nmemb, size_t size) return p; } -char *xstrdup(const char *str) +char * +xstrdup(const char *str) { char *p = strdup(str); @@ -86,7 +97,8 @@ char *xstrdup(const char *str) return p; } -char *xstrndup(const char *str, size_t n) +char * +xstrndup(const char *str, size_t n) { char *p; diff --git a/xmalloc.h b/xmalloc.h new file mode 100644 index 00000000..33b77a0e --- /dev/null +++ b/xmalloc.h @@ -0,0 +1,45 @@ +/* This file contains wrapper functions working with memory, the wrapper + * just terminates program in case of lack of memory. This set of + * soubroutines can be used by various binaries included in the strace + * package. + * + * Copyright (c) 2001-2017 The strace developers. + * 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. + */ + +#ifndef STRACE_XMALLOC_H +#define STRACE_XMALLOC_H + +#include "gcc_compat.h" + +void *xcalloc(size_t nmemb, size_t size) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2)); +void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1)); +void *xreallocarray(void *ptr, size_t nmemb, size_t size) + ATTRIBUTE_ALLOC_SIZE((2, 3)); +char *xstrdup(const char *str) ATTRIBUTE_MALLOC; +char *xstrndup(const char *str, size_t n) ATTRIBUTE_MALLOC; + +#endif /* !STRACE_XMALLOC_H */ -- 2.11.0 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel