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