1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU Lesser General Public 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License as published by the Free Software Foundation; 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * version 2.1 of the License (not later!) 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is distributed in the hope that it will be useful, 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * GNU Lesser General Public License for more details. 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You should have received a copy of the GNU Lesser General Public 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License along with this program; if not, see <http://www.gnu.org/licenses> 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h> 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <string.h> 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdarg.h> 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <errno.h> 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __weak __attribute__((weak)) 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vdie(const char *fmt, va_list ap) 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret = errno; 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno) 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perror("trace-cmd"); 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = -1; 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(stderr, " "); 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng vfprintf(stderr, fmt, ap); 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(stderr, "\n"); 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng exit(ret); 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __die(const char *fmt, ...) 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vdie(fmt, ap); 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __weak die(const char *fmt, ...) 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vdie(fmt, ap); 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vwarning(const char *fmt, va_list ap) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno) 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perror("trace-cmd"); 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng errno = 0; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(stderr, " "); 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng vfprintf(stderr, fmt, ap); 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(stderr, "\n"); 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __warning(const char *fmt, ...) 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vwarning(fmt, ap); 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __weak warning(const char *fmt, ...) 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vwarning(fmt, ap); 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vpr_stat(const char *fmt, va_list ap) 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng vprintf(fmt, ap); 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng printf("\n"); 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __pr_stat(const char *fmt, ...) 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vpr_stat(fmt, ap); 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __weak vpr_stat(const char *fmt, va_list ap) 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vpr_stat(fmt, ap); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __weak pr_stat(const char *fmt, ...) 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list ap; 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(ap, fmt); 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __vpr_stat(fmt, ap); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(ap); 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __weak *malloc_or_die(unsigned int size) 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng void *data; 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng data = malloc(size); 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!data) 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("malloc"); 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return data; 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 130