summaryrefslogtreecommitdiffstats
path: root/collectors/log2journal/log2journal-pcre2.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-07-24 09:54:23 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-07-24 09:54:44 +0000
commit836b47cb7e99a977c5a23b059ca1d0b5065d310e (patch)
tree1604da8f482d02effa033c94a84be42bc0c848c3 /collectors/log2journal/log2journal-pcre2.c
parentReleasing debian version 1.44.3-2. (diff)
downloadnetdata-836b47cb7e99a977c5a23b059ca1d0b5065d310e.tar.xz
netdata-836b47cb7e99a977c5a23b059ca1d0b5065d310e.zip
Merging upstream version 1.46.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'collectors/log2journal/log2journal-pcre2.c')
-rw-r--r--collectors/log2journal/log2journal-pcre2.c139
1 files changed, 0 insertions, 139 deletions
diff --git a/collectors/log2journal/log2journal-pcre2.c b/collectors/log2journal/log2journal-pcre2.c
deleted file mode 100644
index 185e69108..000000000
--- a/collectors/log2journal/log2journal-pcre2.c
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "log2journal.h"
-
-#define PCRE2_ERROR_LINE_MAX 1024
-#define PCRE2_KEY_MAX 1024
-
-struct pcre2_state {
- LOG_JOB *jb;
-
- const char *line;
- uint32_t pos;
- uint32_t key_start;
-
- pcre2_code *re;
- pcre2_match_data *match_data;
-
- char key[PCRE2_KEY_MAX];
- char msg[PCRE2_ERROR_LINE_MAX];
-};
-
-static inline void copy_and_convert_key(PCRE2_STATE *pcre2, const char *key) {
- char *d = &pcre2->key[pcre2->key_start];
- size_t remaining = sizeof(pcre2->key) - pcre2->key_start;
-
- while(remaining >= 2 && *key) {
- *d = journal_key_characters_map[(unsigned) (*key)];
- remaining--;
- key++;
- d++;
- }
-
- *d = '\0';
-}
-
-static inline void jb_traverse_pcre2_named_groups_and_send_keys(PCRE2_STATE *pcre2, pcre2_code *re, pcre2_match_data *match_data, char *line) {
- PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data);
- uint32_t names_count;
- pcre2_pattern_info(re, PCRE2_INFO_NAMECOUNT, &names_count);
-
- if (names_count > 0) {
- PCRE2_SPTR name_table;
- pcre2_pattern_info(re, PCRE2_INFO_NAMETABLE, &name_table);
- uint32_t name_entry_size;
- pcre2_pattern_info(re, PCRE2_INFO_NAMEENTRYSIZE, &name_entry_size);
-
- const unsigned char *table_ptr = name_table;
- for (uint32_t i = 0; i < names_count; i++) {
- int n = (table_ptr[0] << 8) | table_ptr[1];
- const char *group_name = (const char *)(table_ptr + 2);
-
- PCRE2_SIZE start_offset = ovector[2 * n];
- PCRE2_SIZE end_offset = ovector[2 * n + 1];
- PCRE2_SIZE group_length = end_offset - start_offset;
-
- copy_and_convert_key(pcre2, group_name);
- log_job_send_extracted_key_value(pcre2->jb, pcre2->key, line + start_offset, group_length);
-
- table_ptr += name_entry_size;
- }
- }
-}
-
-void pcre2_get_error_in_buffer(char *msg, size_t msg_len, int rc, int pos) {
- int l;
-
- if(pos >= 0)
- l = snprintf(msg, msg_len, "PCRE2 error %d at pos %d on: ", rc, pos);
- else
- l = snprintf(msg, msg_len, "PCRE2 error %d on: ", rc);
-
- pcre2_get_error_message(rc, (PCRE2_UCHAR *)&msg[l], msg_len - l);
-}
-
-static void pcre2_error_message(PCRE2_STATE *pcre2, int rc, int pos) {
- pcre2_get_error_in_buffer(pcre2->msg, sizeof(pcre2->msg), rc, pos);
-}
-
-bool pcre2_has_error(PCRE2_STATE *pcre2) {
- return !pcre2->re || pcre2->msg[0];
-}
-
-PCRE2_STATE *pcre2_parser_create(LOG_JOB *jb) {
- PCRE2_STATE *pcre2 = mallocz(sizeof(PCRE2_STATE));
- memset(pcre2, 0, sizeof(PCRE2_STATE));
- pcre2->jb = jb;
-
- if(jb->prefix)
- pcre2->key_start = copy_to_buffer(pcre2->key, sizeof(pcre2->key), pcre2->jb->prefix, strlen(pcre2->jb->prefix));
-
- int rc;
- PCRE2_SIZE pos;
- pcre2->re = pcre2_compile((PCRE2_SPTR)jb->pattern, PCRE2_ZERO_TERMINATED, 0, &rc, &pos, NULL);
- if (!pcre2->re) {
- pcre2_error_message(pcre2, rc, pos);
- return pcre2;
- }
-
- pcre2->match_data = pcre2_match_data_create_from_pattern(pcre2->re, NULL);
-
- return pcre2;
-}
-
-void pcre2_parser_destroy(PCRE2_STATE *pcre2) {
- if(pcre2)
- freez(pcre2);
-}
-
-const char *pcre2_parser_error(PCRE2_STATE *pcre2) {
- return pcre2->msg;
-}
-
-bool pcre2_parse_document(PCRE2_STATE *pcre2, const char *txt, size_t len) {
- pcre2->line = txt;
- pcre2->pos = 0;
- pcre2->msg[0] = '\0';
-
- if(!len)
- len = strlen(txt);
-
- int rc = pcre2_match(pcre2->re, (PCRE2_SPTR)pcre2->line, len, 0, 0, pcre2->match_data, NULL);
- if(rc < 0) {
- pcre2_error_message(pcre2, rc, -1);
- return false;
- }
-
- jb_traverse_pcre2_named_groups_and_send_keys(pcre2, pcre2->re, pcre2->match_data, (char *)pcre2->line);
-
- return true;
-}
-
-void pcre2_test(void) {
- LOG_JOB jb = { .prefix = "NIGNX_" };
- PCRE2_STATE *pcre2 = pcre2_parser_create(&jb);
-
- pcre2_parse_document(pcre2, "{\"value\":\"\\u\\u039A\\u03B1\\u03BB\\u03B7\\u03BC\\u03AD\\u03C1\\u03B1\"}", 0);
-
- pcre2_parser_destroy(pcre2);
-}