logger.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. logger.c -- logging code
  3. Copyright (C) 2004-2016 Guus Sliepen <guus@tinc-vpn.org>
  4. 2004-2005 Ivo Timmermans
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License along
  14. with this program; if not, write to the Free Software Foundation, Inc.,
  15. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  16. */
  17. #include "system.h"
  18. #include "conf.h"
  19. #include "logger.h"
  20. debug_t debug_level = DEBUG_NOTHING;
  21. static logmode_t logmode = LOGMODE_STDERR;
  22. static pid_t logpid;
  23. extern char *logfilename;
  24. static FILE *logfile = NULL;
  25. #ifdef HAVE_MINGW
  26. static HANDLE loghandle = NULL;
  27. #endif
  28. static const char *logident = NULL;
  29. void openlogger(const char *ident, logmode_t mode) {
  30. logident = ident;
  31. logmode = mode;
  32. switch(mode) {
  33. case LOGMODE_STDERR:
  34. logpid = getpid();
  35. break;
  36. case LOGMODE_FILE:
  37. logpid = getpid();
  38. logfile = fopen(logfilename, "a");
  39. if(!logfile) {
  40. fprintf(stderr, "Could not open log file %s: %s\n", logfilename, strerror(errno));
  41. logmode = LOGMODE_NULL;
  42. }
  43. break;
  44. case LOGMODE_SYSLOG:
  45. #ifdef HAVE_MINGW
  46. loghandle = RegisterEventSource(NULL, logident);
  47. if(!loghandle) {
  48. fprintf(stderr, "Could not open log handle!");
  49. logmode = LOGMODE_NULL;
  50. }
  51. break;
  52. #else
  53. #ifdef HAVE_SYSLOG_H
  54. openlog(logident, LOG_CONS | LOG_PID, LOG_DAEMON);
  55. break;
  56. #endif
  57. #endif
  58. case LOGMODE_NULL:
  59. break;
  60. }
  61. }
  62. void reopenlogger() {
  63. if(logmode != LOGMODE_FILE) {
  64. return;
  65. }
  66. fflush(logfile);
  67. FILE *newfile = fopen(logfilename, "a");
  68. if(!newfile) {
  69. logger(LOG_ERR, "Unable to reopen log file %s: %s", logfilename, strerror(errno));
  70. return;
  71. }
  72. fclose(logfile);
  73. logfile = newfile;
  74. }
  75. void logger(int priority, const char *format, ...) {
  76. va_list ap;
  77. char timestr[32] = "";
  78. time_t now;
  79. va_start(ap, format);
  80. switch(logmode) {
  81. case LOGMODE_STDERR:
  82. vfprintf(stderr, format, ap);
  83. fprintf(stderr, "\n");
  84. fflush(stderr);
  85. break;
  86. case LOGMODE_FILE:
  87. now = time(NULL);
  88. strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", localtime(&now));
  89. fprintf(logfile, "%s %s[%ld]: ", timestr, logident, (long)logpid);
  90. vfprintf(logfile, format, ap);
  91. fprintf(logfile, "\n");
  92. fflush(logfile);
  93. break;
  94. case LOGMODE_SYSLOG:
  95. #ifdef HAVE_MINGW
  96. {
  97. char message[4096];
  98. const char *messages[] = {message};
  99. vsnprintf(message, sizeof(message), format, ap);
  100. message[sizeof(message) - 1] = 0;
  101. ReportEvent(loghandle, priority, 0, 0, NULL, 1, 0, messages, NULL);
  102. }
  103. #else
  104. #ifdef HAVE_SYSLOG_H
  105. #ifdef HAVE_VSYSLOG
  106. vsyslog(priority, format, ap);
  107. #else
  108. {
  109. char message[4096];
  110. vsnprintf(message, sizeof(message), format, ap);
  111. syslog(priority, "%s", message);
  112. }
  113. #endif
  114. break;
  115. #endif
  116. #endif
  117. case LOGMODE_NULL:
  118. break;
  119. }
  120. va_end(ap);
  121. }
  122. void closelogger(void) {
  123. switch(logmode) {
  124. case LOGMODE_FILE:
  125. fclose(logfile);
  126. break;
  127. case LOGMODE_SYSLOG:
  128. #ifdef HAVE_MINGW
  129. DeregisterEventSource(loghandle);
  130. break;
  131. #else
  132. #ifdef HAVE_SYSLOG_H
  133. closelog();
  134. break;
  135. #endif
  136. #endif
  137. case LOGMODE_NULL:
  138. case LOGMODE_STDERR:
  139. break;
  140. }
  141. }