log_udpclient.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "precompile.h"
  2. #include "log_udpclient.h"
  3. #include "log_hdr.h"
  4. #include "log_base.h"
  5. #include "log.h"
  6. #include "spinlock.h"
  7. #include <winpr/winsock.h>
  8. #include <winpr/string.h>
  9. typedef struct udplogfactory_t udplogfactory_t;
  10. typedef struct udplog_t {
  11. logbase_t base;
  12. char *sink_inst;
  13. char *ip;
  14. unsigned short port;
  15. struct sockaddr_in sink_addr;
  16. }udplog_t;
  17. struct udplogfactory_t
  18. {
  19. logfactory_t base;
  20. lock_t lock;
  21. SOCKET sock_handle;
  22. };
  23. static void udplogfactory_destroy(void *self)
  24. {
  25. udplogfactory_t *fac = (udplogfactory_t *)self;
  26. if (fac) {
  27. if (fac->sock_handle != INVALID_SOCKET) {
  28. closesocket(fac->sock_handle);
  29. fac->sock_handle = INVALID_SOCKET;
  30. }
  31. if (fac->base.name) {
  32. free(fac->base.name);
  33. fac->base.name = NULL;
  34. }
  35. free(fac);
  36. }
  37. }
  38. static void* udplogfactory_create_log(void *self, const char* inst)
  39. {
  40. udplogfactory_t *fac = (udplogfactory_t *)self;
  41. udplog_t *log = MALLOC_T(udplog_t);
  42. log->base.level = XLOG_LEVEL_ALL;
  43. log->base.factory = self;
  44. log->base.inst_name = _strdup(inst);
  45. log->sink_inst = _strdup(log->base.inst_name);
  46. log->ip = 0;
  47. log->port = 0;
  48. if (fac->sock_handle == INVALID_SOCKET) {
  49. fac->sock_handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  50. }
  51. return log;
  52. }
  53. static int udplogfactory_set_log_param(void *self,
  54. void *log,
  55. const char *key,
  56. const char *value)
  57. {
  58. udplogfactory_t *fac = (udplogfactory_t *)self;
  59. udplog_t *slog = (udplog_t*)log;
  60. if (_stricmp(key, "ip") == 0) {
  61. slog->ip = _strdup(value);
  62. } else if (_stricmp(key, "port") == 0) {
  63. int nport = atoi(value);
  64. if (nport <= 65535 && nport > 0)
  65. slog->port = (unsigned short)nport;
  66. } else if (_stricmp(key, "inst") == 0) {
  67. if (slog->sink_inst)
  68. free(slog->sink_inst);
  69. slog->sink_inst = _strdup(value);
  70. } else if (_stricmp(key, "level") == 0) {
  71. if (_stricmp(value, "all") == 0) {
  72. slog->base.level = 0;
  73. } else if (_stricmp(value, "trace") == 0) {
  74. slog->base.level = 1;
  75. } else if (_stricmp(value, "debug") == 0) {
  76. slog->base.level = 2;
  77. } else if (_stricmp(value, "info") == 0) {
  78. slog->base.level = 3;
  79. } else if (_stricmp(value, "warn") == 0) {
  80. slog->base.level = 4;
  81. } else if (_stricmp(value, "error") == 0) {
  82. slog->base.level = 5;
  83. } else if (_stricmp(value, "fatal") == 0) {
  84. slog->base.level = 6;
  85. } else if (_stricmp(value, "none") == 0) {
  86. slog->base.level = 7;
  87. } else {
  88. return -1;
  89. }
  90. } else {
  91. return -1;
  92. }
  93. return 0;
  94. }
  95. static int udplogfactory_init_log(void *self, void *log)
  96. {
  97. udplogfactory_t *fac = (udplogfactory_t *)self;
  98. udplog_t *slog = (udplog_t*)log;
  99. if (!slog->ip || !slog->port)
  100. return -1;
  101. memset(&slog->sink_addr, 0, sizeof(slog->sink_addr));
  102. slog->sink_addr.sin_family = AF_INET;
  103. slog->sink_addr.sin_addr.s_addr = inet_addr(slog->ip);
  104. slog->sink_addr.sin_port = htons(slog->port);
  105. return 0;
  106. }
  107. static int udplogfactory_term_log(void *self, void *log)
  108. {
  109. udplogfactory_t *fac = (udplogfactory_t *)self;
  110. udplog_t *slog = (udplog_t*)log;
  111. if (slog->sink_inst) {
  112. free(slog->sink_inst);
  113. slog->sink_inst = NULL;
  114. }
  115. if (slog->ip) {
  116. free(slog->ip);
  117. slog->ip = NULL;
  118. }
  119. return 0;
  120. }
  121. static void udplogfactory_destroy_log(void *self, void *log)
  122. {
  123. udplogfactory_t *fac = (udplogfactory_t *)self;
  124. udplog_t *slog = (udplog_t*)log;
  125. if (slog) {
  126. if (slog->base.inst_name)
  127. free(slog->base.inst_name);
  128. if (slog->sink_inst)
  129. free(slog->sink_inst);
  130. free(slog);
  131. }
  132. }
  133. static int udplogfactory_record_log(void *self,
  134. void *log,
  135. int level,
  136. unsigned long ts_low,
  137. unsigned long ts_high,
  138. const char *s,
  139. int sn)
  140. {
  141. udplogfactory_t *fac = (udplogfactory_t *)self;
  142. udplog_t *slog = (udplog_t*)log;
  143. if (fac->sock_handle) {
  144. char tmp[1056];
  145. int n = 0;
  146. struct log_hdr *hdr;
  147. struct log_hdr_str *logstr;
  148. hdr = (struct log_hdr*)&tmp[0];
  149. hdr->level = (unsigned char)level;
  150. hdr->reserved = 0;
  151. hdr->tag = 'GOLX';
  152. hdr->tick_low = htonl(ts_low);
  153. hdr->tick_high = htonl(ts_high);
  154. hdr->version = 1;
  155. n += sizeof(struct log_hdr);
  156. logstr = (struct log_hdr_str *)(&tmp[n]);
  157. logstr->len = strlen(slog->sink_inst);
  158. memcpy(&logstr->data[0], slog->sink_inst, logstr->len);
  159. n += 2 + logstr->len;
  160. logstr->len = htons(logstr->len);
  161. logstr = (struct log_hdr_str *)(&tmp[n]);
  162. logstr->len = sn;
  163. memcpy(&logstr->data[0], s, logstr->len);
  164. n += 2 + logstr->len;
  165. logstr->len = htons(logstr->len);
  166. fastlock_enter(fac->lock);
  167. sendto(fac->sock_handle, tmp, n, 0, (struct sockaddr*)&slog->sink_addr, sizeof(slog->sink_addr));
  168. fastlock_leave(fac->lock);
  169. }
  170. return 0;
  171. }
  172. int udplogfactory_create(logfactory_t **p_fac)
  173. {
  174. udplogfactory_t *fac;
  175. if (!p_fac)
  176. return -1;
  177. fac = MALLOC_T(udplogfactory_t);
  178. fac->sock_handle = INVALID_SOCKET;
  179. fac->base.name = _strdup("udpclient");
  180. fac->base.record_log = &udplogfactory_record_log;
  181. fac->base.init_log = &udplogfactory_init_log;
  182. fac->base.set_log_param = &udplogfactory_set_log_param;
  183. fac->base.term_log = &udplogfactory_term_log;
  184. fac->base.create_log = &udplogfactory_create_log;
  185. fac->base.destroy_log = &udplogfactory_destroy_log;
  186. fac->base.destroy = &udplogfactory_destroy;
  187. fastlock_init(fac->lock);
  188. *p_fac = &fac->base;
  189. return 0;
  190. }