level.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * This file is part of the zlog Library.
  3. *
  4. * Copyright (C) 2011 by Hardy Simpson <HardySimpson1984@gmail.com>
  5. *
  6. * Licensed under the LGPL v2.1, see the file COPYING in base directory.
  7. */
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <errno.h>
  11. #include "syslog.h"
  12. #include "zc_defs.h"
  13. #include "level.h"
  14. void zlog_level_profile(zlog_level_t *a_level, int flag)
  15. {
  16. zc_assert(a_level,);
  17. zc_profile(flag, "---level[%p][%d,%s,%s,%d,%d]---",
  18. a_level,
  19. a_level->int_level,
  20. a_level->str_uppercase,
  21. a_level->str_lowercase,
  22. (int) a_level->str_len,
  23. a_level->syslog_level);
  24. return;
  25. }
  26. /*******************************************************************************/
  27. void zlog_level_del(zlog_level_t *a_level)
  28. {
  29. zc_assert(a_level,);
  30. zc_debug("zlog_level_del[%p]", a_level);
  31. free(a_level);
  32. return;
  33. }
  34. static int syslog_level_atoi(char *str)
  35. {
  36. /* guess no unix system will choose -187
  37. * as its syslog level, so it is a safe return value
  38. */
  39. zc_assert(str, -187);
  40. if (STRICMP(str, ==, "LOG_EMERG"))
  41. return LOG_EMERG;
  42. if (STRICMP(str, ==, "LOG_ALERT"))
  43. return LOG_ALERT;
  44. if (STRICMP(str, ==, "LOG_CRIT"))
  45. return LOG_CRIT;
  46. if (STRICMP(str, ==, "LOG_ERR"))
  47. return LOG_ERR;
  48. if (STRICMP(str, ==, "LOG_WARNING"))
  49. return LOG_WARNING;
  50. if (STRICMP(str, ==, "LOG_NOTICE"))
  51. return LOG_NOTICE;
  52. if (STRICMP(str, ==, "LOG_INFO"))
  53. return LOG_INFO;
  54. if (STRICMP(str, ==, "LOG_DEBUG"))
  55. return LOG_DEBUG;
  56. zc_error("wrong syslog level[%s]", str);
  57. return -187;
  58. }
  59. /* line: TRACE = 10, LOG_ERR */
  60. zlog_level_t *zlog_level_new(char *line)
  61. {
  62. zlog_level_t *a_level = NULL;
  63. int i;
  64. int nscan;
  65. char str[MAXLEN_CFG_LINE + 1];
  66. int l = 0;
  67. char sl[MAXLEN_CFG_LINE + 1];
  68. zc_assert(line, NULL);
  69. memset(str, 0x00, sizeof(str));
  70. memset(sl, 0x00, sizeof(sl));
  71. nscan = sscanf(line, " %[^= \t] = %d ,%s", str, &l, sl);
  72. if (nscan < 2) {
  73. zc_error("level[%s], syntax wrong", line);
  74. return NULL;
  75. }
  76. /* check level and str */
  77. if ((l < 0) || (l > 255)) {
  78. zc_error("l[%d] not in [0,255], wrong", l);
  79. return NULL;
  80. }
  81. if (str[0] == '\0') {
  82. zc_error("str[0] = 0");
  83. return NULL;
  84. }
  85. a_level = calloc(1, sizeof(zlog_level_t));
  86. if (!a_level) {
  87. zc_error("calloc fail, errno[%d]", errno);
  88. return NULL;
  89. }
  90. a_level->int_level = l;
  91. /* fill syslog level */
  92. if (sl[0] == '\0') {
  93. a_level->syslog_level = LOG_DEBUG;
  94. } else {
  95. a_level->syslog_level = syslog_level_atoi(sl);
  96. if (a_level->syslog_level == -187) {
  97. zc_error("syslog_level_atoi fail");
  98. goto err;
  99. }
  100. }
  101. /* strncpy and toupper(str) */
  102. for (i = 0; (i < sizeof(a_level->str_uppercase) - 1) && str[i] != '\0'; i++) {
  103. (a_level->str_uppercase)[i] = toupper(str[i]);
  104. (a_level->str_lowercase)[i] = tolower(str[i]);
  105. }
  106. if (str[i] != '\0') {
  107. /* overflow */
  108. zc_error("not enough space for str, str[%s] > %d", str, i);
  109. goto err;
  110. } else {
  111. (a_level->str_uppercase)[i] = '\0';
  112. (a_level->str_lowercase)[i] = '\0';
  113. }
  114. a_level->str_len = i;
  115. //zlog_level_profile(a_level, ZC_DEBUG);
  116. return a_level;
  117. err:
  118. zc_error("line[%s]", line);
  119. zlog_level_del(a_level);
  120. return NULL;
  121. }