event.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "nssm.h"
  2. #define NSSM_ERROR_BUFSIZE 65535
  3. unsigned long tls_index;
  4. /* Convert error code to error string - must call LocalFree() on return value */
  5. char *error_string(unsigned long error) {
  6. /* Thread-safe buffer */
  7. char *error_message = (char *) TlsGetValue(tls_index);
  8. if (! error_message) {
  9. error_message = (char *) LocalAlloc(LPTR, NSSM_ERROR_BUFSIZE);
  10. if (! error_message) return "<out of memory for error message>";
  11. TlsSetValue(tls_index, (void *) error_message);
  12. }
  13. if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char *) error_message, NSSM_ERROR_BUFSIZE, 0)) {
  14. if (_snprintf(error_message, NSSM_ERROR_BUFSIZE, "system error %lu", error) < 0) return 0;
  15. }
  16. return error_message;
  17. }
  18. /* Convert message code to format string */
  19. char *message_string(unsigned long error) {
  20. char *ret;
  21. if (! FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &ret, NSSM_ERROR_BUFSIZE, 0)) {
  22. ret = (char *) HeapAlloc(GetProcessHeap(), 0, 32);
  23. if (_snprintf(ret, NSSM_ERROR_BUFSIZE, "system error %lu", error) < 0) return 0;
  24. }
  25. return ret;
  26. }
  27. /* Log a message to the Event Log */
  28. void log_event(unsigned short type, unsigned long id, ...) {
  29. va_list arg;
  30. int count;
  31. char *s;
  32. char *strings[6];
  33. /* Open event log */
  34. HANDLE handle = RegisterEventSource(0, TEXT(NSSM));
  35. if (! handle) return;
  36. /* Log it */
  37. count = 0;
  38. va_start(arg, id);
  39. while ((s = va_arg(arg, char *))) strings[count++] = s;
  40. va_end(arg);
  41. ReportEvent(handle, type, 0, id, 0, count, 0, (const char **) strings, 0);
  42. /* Close event log */
  43. DeregisterEventSource(handle);
  44. }
  45. /* Log a message to the console */
  46. void print_message(FILE *file, unsigned long id, ...) {
  47. va_list arg;
  48. char *format = message_string(id);
  49. if (! format) return;
  50. va_start(arg, id);
  51. vfprintf(file, format, arg);
  52. va_end(arg);
  53. LocalFree(format);
  54. }
  55. /* Show a GUI dialogue */
  56. int popup_message(unsigned int type, unsigned long id, ...) {
  57. va_list arg;
  58. char *format = message_string(id);
  59. if (! format) {
  60. return MessageBox(0, "Message %lu was supposed to go here!", NSSM, MB_OK | MB_ICONEXCLAMATION);
  61. }
  62. char blurb[256];
  63. va_start(arg, id);
  64. if (vsnprintf(blurb, sizeof(blurb), format, arg) < 0) {
  65. va_end(arg);
  66. LocalFree(format);
  67. return MessageBox(0, "Message %lu was supposed to go here!", NSSM, MB_OK | MB_ICONEXCLAMATION);
  68. }
  69. va_end(arg);
  70. int ret = MessageBox(0, blurb, NSSM, type);
  71. LocalFree(format);
  72. return ret;
  73. }