11de7afc9SPaolo Bonzini /* 21de7afc9SPaolo Bonzini * Error reporting 31de7afc9SPaolo Bonzini * 41de7afc9SPaolo Bonzini * Copyright (C) 2010 Red Hat Inc. 51de7afc9SPaolo Bonzini * 61de7afc9SPaolo Bonzini * Authors: 71de7afc9SPaolo Bonzini * Markus Armbruster <armbru@redhat.com>, 81de7afc9SPaolo Bonzini * 91de7afc9SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2 or later. 101de7afc9SPaolo Bonzini * See the COPYING file in the top-level directory. 111de7afc9SPaolo Bonzini */ 121de7afc9SPaolo Bonzini 13121d0712SMarkus Armbruster #ifndef QEMU_ERROR_REPORT_H 14121d0712SMarkus Armbruster #define QEMU_ERROR_REPORT_H 151de7afc9SPaolo Bonzini 161de7afc9SPaolo Bonzini typedef struct Location { 171de7afc9SPaolo Bonzini /* all members are private to qemu-error.c */ 181de7afc9SPaolo Bonzini enum { LOC_NONE, LOC_CMDLINE, LOC_FILE } kind; 191de7afc9SPaolo Bonzini int num; 201de7afc9SPaolo Bonzini const void *ptr; 211de7afc9SPaolo Bonzini struct Location *prev; 221de7afc9SPaolo Bonzini } Location; 231de7afc9SPaolo Bonzini 241de7afc9SPaolo Bonzini Location *loc_push_restore(Location *loc); 251de7afc9SPaolo Bonzini Location *loc_push_none(Location *loc); 261de7afc9SPaolo Bonzini Location *loc_pop(Location *loc); 271de7afc9SPaolo Bonzini Location *loc_save(Location *loc); 281de7afc9SPaolo Bonzini void loc_restore(Location *loc); 291de7afc9SPaolo Bonzini void loc_set_none(void); 301de7afc9SPaolo Bonzini void loc_set_cmdline(char **argv, int idx, int cnt); 311de7afc9SPaolo Bonzini void loc_set_file(const char *fname, int lno); 321de7afc9SPaolo Bonzini 33*9edc6313SMarc-André Lureau int error_vprintf(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0); 34*9edc6313SMarc-André Lureau int error_printf(const char *fmt, ...) G_GNUC_PRINTF(1, 2); 3597f40301SAlistair Francis 36*9edc6313SMarc-André Lureau void error_vreport(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0); 37*9edc6313SMarc-André Lureau void warn_vreport(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0); 38*9edc6313SMarc-André Lureau void info_vreport(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0); 3997f40301SAlistair Francis 40*9edc6313SMarc-André Lureau void error_report(const char *fmt, ...) G_GNUC_PRINTF(1, 2); 41*9edc6313SMarc-André Lureau void warn_report(const char *fmt, ...) G_GNUC_PRINTF(1, 2); 42*9edc6313SMarc-André Lureau void info_report(const char *fmt, ...) G_GNUC_PRINTF(1, 2); 4397f40301SAlistair Francis 44c55510b7SCornelia Huck bool error_report_once_cond(bool *printed, const char *fmt, ...) 45*9edc6313SMarc-André Lureau G_GNUC_PRINTF(2, 3); 46c55510b7SCornelia Huck bool warn_report_once_cond(bool *printed, const char *fmt, ...) 47*9edc6313SMarc-André Lureau G_GNUC_PRINTF(2, 3); 48c55510b7SCornelia Huck 49f5852efaSChristophe Fergeau void error_init(const char *argv0); 50f5852efaSChristophe Fergeau 51bc6a69ddSPeter Xu /* 52bc6a69ddSPeter Xu * Similar to error_report(), except it prints the message just once. 53bc6a69ddSPeter Xu * Return true when it prints, false otherwise. 54bc6a69ddSPeter Xu */ 55bc6a69ddSPeter Xu #define error_report_once(fmt, ...) \ 56bc6a69ddSPeter Xu ({ \ 57bc6a69ddSPeter Xu static bool print_once_; \ 58c6c59459SCornelia Huck error_report_once_cond(&print_once_, \ 59c6c59459SCornelia Huck fmt, ##__VA_ARGS__); \ 60bc6a69ddSPeter Xu }) 61bc6a69ddSPeter Xu 62bc6a69ddSPeter Xu /* 63bc6a69ddSPeter Xu * Similar to warn_report(), except it prints the message just once. 64bc6a69ddSPeter Xu * Return true when it prints, false otherwise. 65bc6a69ddSPeter Xu */ 66bc6a69ddSPeter Xu #define warn_report_once(fmt, ...) \ 67bc6a69ddSPeter Xu ({ \ 68bc6a69ddSPeter Xu static bool print_once_; \ 69c6c59459SCornelia Huck warn_report_once_cond(&print_once_, \ 70c6c59459SCornelia Huck fmt, ##__VA_ARGS__); \ 71bc6a69ddSPeter Xu }) 72bc6a69ddSPeter Xu 73651d588fSStefan Hajnoczi extern bool message_with_timestamp; 742880ffb0SMario Smarduch extern bool error_with_guestname; 752880ffb0SMario Smarduch extern const char *error_guest_name; 761de7afc9SPaolo Bonzini 771de7afc9SPaolo Bonzini #endif 78