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

Reply via email to