gui-fatal.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #define _GNU_SOURCE
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <malloc.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <stdarg.h>
  10. static void fix_display(void)
  11. {
  12. setenv("DISPLAY", ":0", 1);
  13. }
  14. static void produce_message(const char * type, const char *fmt, va_list args)
  15. {
  16. char *dialog_msg;
  17. char buf[1024];
  18. (void) vsnprintf(buf, sizeof(buf), fmt, args);
  19. asprintf(&dialog_msg, "%s: %s: %s (error type: %s)",
  20. program_invocation_short_name, type, buf, strerror(errno));
  21. fprintf(stderr, "%s", dialog_msg);
  22. switch (fork()) {
  23. case -1:
  24. exit(1); //what else
  25. case 0:
  26. fix_display();
  27. #ifdef USE_KDIALOG
  28. execlp("kdialog", "kdialog", "--sorry", dialog_msg, NULL);
  29. #else
  30. execlp("zenity", "zenity", "--error", "--text", dialog_msg, NULL);
  31. #endif
  32. exit(1);
  33. default:;
  34. }
  35. }
  36. void gui_fatal(const char *fmt, ...)
  37. {
  38. va_list args;
  39. va_start(args, fmt);
  40. produce_message("Fatal error", fmt, args);
  41. va_end(args);
  42. exit(1);
  43. }
  44. void gui_nonfatal(const char *fmt, ...)
  45. {
  46. va_list args;
  47. va_start(args, fmt);
  48. produce_message("Information", fmt, args);
  49. va_end(args);
  50. }