gui-fatal.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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\n", 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("/usr/bin/kdialog", "kdialog", "--sorry", dialog_msg, NULL);
  29. #else
  30. execlp("/usr/bin/zenity", "zenity", "--error", "--text", dialog_msg, NULL);
  31. #endif
  32. exit(1);
  33. default:;
  34. }
  35. free(dialog_msg);
  36. }
  37. void gui_fatal(const char *fmt, ...)
  38. {
  39. va_list args;
  40. va_start(args, fmt);
  41. produce_message("Fatal error", fmt, args);
  42. va_end(args);
  43. exit(1);
  44. }
  45. void gui_nonfatal(const char *fmt, ...)
  46. {
  47. va_list args;
  48. va_start(args, fmt);
  49. produce_message("Information", fmt, args);
  50. va_end(args);
  51. }