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