Signed-off-by: Alexander Vickberg <wickbergs...@gmail.com>
---
 sysklogd/syslogd.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 40 insertions(+), 5 deletions(-)

diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 6ddfd771a..95ef3c815 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -227,9 +227,17 @@ typedef struct logFile_t {
 } logFile_t;
 
 #if ENABLE_FEATURE_SYSLOGD_CFG
+typedef struct stringMatch_t {
+       char *str;
+       int len;
+       uint8_t enabled_priomap;
+       struct stringMatch_t *prev;
+} stringMatch_t;
+
 typedef struct logRule_t {
        uint8_t enabled_facility_priomap[LOG_NFACILITIES];
        struct logFile_t *file;
+       struct stringMatch_t *strmatch;
        struct logRule_t *next;
 } logRule_t;
 #endif
@@ -491,11 +499,28 @@ static void parse_syslogdcfg(const char *file)
                                        if (next_facility)
                                                *next_facility++ = '\0';
                                        code = find_by_name(t, 
bb_facilitynames);
-                                       if (!code)
-                                               goto cfgerr;
-                                       /* "mark" is not a real facility, skip 
it */
-                                       if (code->c_val != INTERNAL_MARK)
-                                               facmap |= 
1<<(LOG_FAC(code->c_val));
+                                       if (code) {
+                                               /* "mark" is not a real 
facility, skip it */
+                                               if (code->c_val != 
INTERNAL_MARK)
+                                                       facmap |= 
1<<(LOG_FAC(code->c_val));
+                                       } else { /* Treat this as string match 
filter */
+                                               stringMatch_t *strmatch;
+                                               /* Merge if previously found */
+                                               for (strmatch = 
cur_rule->strmatch; strmatch; strmatch = strmatch->prev)
+                                                       if 
(!strcmp(strmatch->str, t))
+                                                               break;
+                                               if (!strmatch) {
+                                                       strmatch = 
xzalloc(sizeof(struct stringMatch_t));
+                                                       strmatch->str = 
xstrdup(t);
+                                                       strmatch->len = 
strlen(t);
+                                                       strmatch->prev = 
cur_rule->strmatch;
+                                                       cur_rule->strmatch = 
strmatch;
+                                               }
+                                               if (negated_prio)
+                                                       
strmatch->enabled_priomap &= primap;
+                                               else
+                                                       
strmatch->enabled_priomap |= primap;
+                                       }
                                        t = next_facility;
                                } while (t);
                        }
@@ -883,6 +908,16 @@ static void timestamp_and_log(int pri, char *msg, int len)
                        if (rule->enabled_facility_priomap[facility] & 
prio_bit) {
                                log_locally(now, G.printbuf, rule->file);
                                match = 1;
+                       } else { /* check if message starts with any string in 
list rule->strmatch */
+                               stringMatch_t *strmatch;
+                               for (strmatch = rule->strmatch; strmatch; 
strmatch = strmatch->prev) {
+                                       if (!memcmp(strmatch->str, msg, 
strmatch->len) &&
+                                                (msg[strmatch->len] == ':' || 
msg[strmatch->len] == '[') &&
+                                                strmatch->enabled_priomap & 
prio_bit) {
+                                               log_locally(now, G.printbuf, 
rule->file);
+                                               match = 1;
+                                       }
+                               }
                        }
                }
                if (match)
-- 
2.25.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to