gui-fatal.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. if (asprintf(&dialog_msg, "%s: %s: %s (error type: %s)",
  20. program_invocation_short_name, type, buf, strerror(errno)) < 0) {
  21. fprintf(stderr, "Failed to allocate memory for error message :(\n");
  22. return;
  23. }
  24. fprintf(stderr, "%s\n", dialog_msg);
  25. switch (fork()) {
  26. case -1:
  27. exit(1); //what else
  28. case 0:
  29. fix_display();
  30. #ifdef USE_KDIALOG
  31. execlp("/usr/bin/kdialog", "kdialog", "--sorry", dialog_msg, NULL);
  32. #else
  33. execlp("/usr/bin/zenity", "zenity", "--error", "--text", dialog_msg, NULL);
  34. #endif
  35. exit(1);
  36. default:;
  37. }
  38. free(dialog_msg);
  39. }
  40. void gui_fatal(const char *fmt, ...)
  41. {
  42. va_list args;
  43. va_start(args, fmt);
  44. produce_message("Fatal error", fmt, args);
  45. va_end(args);
  46. exit(1);
  47. }
  48. void gui_nonfatal(const char *fmt, ...)
  49. {
  50. va_list args;
  51. va_start(args, fmt);
  52. produce_message("Information", fmt, args);
  53. va_end(args);
  54. }