On Sat, Aug 05, 2017 at 04:57:34AM +0300, Edgar Kaziakhmedov wrote: > From: Edgar Kaziakhmedov <edgar.kaziakhme...@virtuzzo.com> "virtuozzo"
> > 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 ------------------------------------------------------------------------------ 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