Skip to content

Commit 214605e

Browse files
author
norberttakacs
committed
persist-tool: remove JSON dependencies
Remove JSON dependencies and the old state.c/h files Signed-off-by: norberttakacs <norbert.takacs@balabit.com>
1 parent 4459fbe commit 214605e

13 files changed

+156
-865
lines changed

CMakeLists.txt

-2
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,6 @@ if ((NOT IVYKIS_INTERNAL) AND (IVYKIS_PKGCONF_VERSION VERSION_LESS "0.39"))
130130
set (SYSLOG_NG_USE_CONST_IVYKIS_MOCK 0)
131131
endif()
132132

133-
external_or_find_package(JSONC)
134-
135133
find_package(OpenSSL REQUIRED)
136134
find_package(FLEX REQUIRED)
137135
find_package(LibNet REQUIRED)

modules/json/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ set(JSON_SOURCES
1414

1515
set(JSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
1616

17+
external_or_find_package(JSONC)
18+
1719
if(JSONC_FOUND)
1820
option(ENABLE_JSON "Enable JSON plugin" ON)
1921
else()

persist-tool/CMakeLists.txt

-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ set(PERSIST-TOOL_SOURCE
33
dump.c
44
generate.c
55
persist-tool.c
6-
state.c
76
)
87

98
add_executable(persist-tool ${PERSIST-TOOL_SOURCE})
@@ -13,20 +12,14 @@ include_directories(persist-tool
1312
${CMAKE_CURRENT_SOURCE_DIR}
1413
${GLIB_INCLUDE_DIRS}
1514
${PROJECT_SOURCE_DIR}/lib
16-
${JSONC_INCLUDE_DIR}
1715
${PROJECT_SOURCE_DIR}/lib/eventlog/src
1816
)
1917

2018
target_link_libraries(persist-tool
2119
${GLIB_GMODULE_LIBRARIES}
2220
${GLIB_GTHREAD_LIBRARIES}
2321
${GLIB_LIBRARIES}
24-
${JSONC_LIBRARY}
2522
syslog-ng
2623
)
2724

28-
if (JSONC_INTERNAL)
29-
add_dependencies(persist-tool JSONC)
30-
endif()
31-
3225
install(TARGETS persist-tool RUNTIME DESTINATION bin)

persist-tool/Makefile.am

+7-13
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
1-
pkginclude_HEADERS += \
2-
persist-tool/add.h \
3-
persist-tool/dump.h \
4-
persist-tool/generate.h \
5-
persist-tool/persist-tool.h \
6-
persist-tool/state.h
7-
81
bin_PROGRAMS += persist-tool/persist-tool
2+
93
persist_tool_persist_tool_CPPFLAGS = \
10-
-I$(top_srcdir)/lib \
11-
-I$(top_srcdir)/lib/jsonc \
12-
$(JSON_CFLAGS)
4+
-I$(top_srcdir)/lib
135

146
persist_tool_persist_tool_SOURCES = \
157
persist-tool/add.c \
8+
persist-tool/add.h \
169
persist-tool/dump.c \
10+
persist-tool/dump.h \
1711
persist-tool/generate.c \
12+
persist-tool/generate.h \
1813
persist-tool/persist-tool.c \
19-
persist-tool/state.c
14+
persist-tool/persist-tool.h
2015

2116
persist_tool_persist_tool_LDADD = \
2217
$(TEST_LDADD) \
2318
@GLIB_LIBS@ \
24-
@BASE_LIBS@ \
25-
@JSON_LIBS@
19+
@BASE_LIBS@
2620

2721
EXTRA_DIST += persist-tool/CMakeLists.txt

persist-tool/add.c

+80-42
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
*/
2323

2424
#include "add.h"
25-
#include "jsonc/json.h"
26-
#include "mainloop.h"
27-
#include "state.h"
2825

2926
typedef struct __PersistStateEntry
3027
{
@@ -40,12 +37,6 @@ check_directory_exists(gchar *path)
4037
return g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR);
4138
}
4239

43-
gboolean
44-
check_file_exists(gchar *path)
45-
{
46-
return g_file_test(path, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS);
47-
}
48-
4940
PersistStateEntry *
5041
persist_state_entry_new(void)
5142
{
@@ -67,6 +58,56 @@ persist_state_parse_entry(PersistStateEntry *self, gchar *entry)
6758
return TRUE;
6859
}
6960

61+
#define NAME_LENGTH 40
62+
#define MAX_LINE_LEN 4000
63+
#define MAX_ENTRY_VALUE_LENGTH (3*MAX_LINE_LEN)
64+
65+
/* This function parses a JSON style string
66+
* containing series of integer values.
67+
* For example:
68+
* { "value": "00 00 00 00 01 02 03 0A" } */
69+
gint
70+
parse_value_string(gchar *value_str, gchar *buffer, gint buffer_length)
71+
{
72+
gchar *p = strchr(value_str, ':');
73+
if (!p)
74+
return -1;
75+
76+
p = strchr(p, '"');
77+
if (!p || strlen(p)<1)
78+
return -1;
79+
80+
p = g_strchug(p+1); // p points to the first value
81+
82+
gint count = 0;
83+
gint token_index = 0;
84+
gchar *token = NULL;
85+
86+
gchar **token_list = g_strsplit (p," ",-1);
87+
while ((token = token_list[token_index++]))
88+
{
89+
int value;
90+
int result = sscanf(token, "%X", &value);
91+
92+
if (result == EOF || result == 0)
93+
continue;
94+
95+
if (count >= buffer_length)
96+
break;
97+
98+
if (value > 0xFF)
99+
{
100+
fprintf(stderr,"invalid numeric value (%s)\n", token);
101+
return -1;
102+
}
103+
104+
buffer[count++] = (gchar)value;
105+
}
106+
107+
g_strfreev(token_list);
108+
return count;
109+
}
110+
70111
void
71112
persist_state_entry_free(PersistStateEntry *self)
72113
{
@@ -75,15 +116,10 @@ persist_state_entry_free(PersistStateEntry *self)
75116
g_free(self);
76117
}
77118

78-
#define NAME_LENGTH 40
79-
#define MAX_LINE_LEN 4000
80-
81119
gint
82120
add_entry_to_persist_file(gchar *entry, PersistTool *self)
83121
{
84122
PersistStateEntry *persist_entry = persist_state_entry_new();
85-
NameValueContainer *container = name_value_container_new();
86-
StateHandler *state_handler = NULL;
87123
GError *error = NULL;
88124
gint result = 0;
89125

@@ -94,45 +130,42 @@ add_entry_to_persist_file(gchar *entry, PersistTool *self)
94130
error = g_error_new(1, 1, "Invalid entry syntax");
95131
goto exit;
96132
}
97-
fprintf(stderr, "%s", persist_entry->name);
98-
if (!name_value_container_parse_json_string(container, persist_entry->value))
99-
{
100-
result = 1;
101-
error = g_error_new(1, 1, "JSON parsing error");
102-
goto exit;
103-
}
104-
state_handler = persist_tool_get_state_handler(self, persist_entry->name);
105-
if (!state_handler)
133+
134+
gchar buffer[MAX_ENTRY_VALUE_LENGTH];
135+
gint value_count = parse_value_string(persist_entry->value, buffer, MAX_ENTRY_VALUE_LENGTH);
136+
if (value_count < 0)
106137
{
107138
result = 1;
108-
error = g_error_new(1, 1, "Unknown prefix");
139+
fprintf(stderr,"value string is invalid (%s)\n", entry);
140+
error = g_error_new(1, 1, "Invalid value string in input");
109141
goto exit;
110142
}
111143

112-
if (!state_handler_load_state(state_handler, container, &error))
144+
PersistEntryHandle handle = persist_state_alloc_entry(self->state, persist_entry->name, value_count);
145+
if (!handle)
113146
{
114147
result = 1;
148+
fprintf(stderr, "%.*s", NAME_LENGTH, entry);
149+
error = g_error_new(1, 1, "Can't alloc entry");
115150
goto exit;
116151
}
152+
153+
gpointer block = persist_state_map_entry(self->state, handle);
154+
memcpy(block, buffer, value_count);
155+
156+
persist_state_unmap_entry(self->state, handle);
157+
117158
exit:
118159
if (result == 0)
119160
{
120-
fprintf(stderr, "\tOK\n");
161+
fprintf(stderr, "%s\t-->>OK\n", persist_entry->name);
121162
}
122163
else
123164
{
124-
fprintf(stderr, "\tFAILED (error: %s)\n",error ? error->message : "<UNKNOWN>");
125-
}
126-
if (error)
127-
{
128-
g_error_free(error);
129-
}
130-
if (state_handler)
131-
{
132-
state_handler_free(state_handler);
165+
fprintf(stderr, "%s\t-->>FAILED (error: %s)\n", persist_entry->name, error ? error->message : "<UNKNOWN>");
133166
}
167+
g_clear_error(&error);
134168

135-
name_value_container_free(container);
136169
persist_state_entry_free(persist_entry);
137170
return result;
138171
}
@@ -149,11 +182,11 @@ lookup_entry(gpointer data, gpointer user_data)
149182
persist_state_lookup_entry(self->state, name, &value_len, &version);
150183
}
151184

152-
/* this function reads all entries in persist to update the in_use struct memeber */
185+
/* this function reads all entries in persist to update the in_use struct member */
153186
static void
154-
dump_all_entries(PersistTool *self)
187+
ref_all_entries(PersistTool *self)
155188
{
156-
GList *keys = persist_state_get_key_list(self->state);
189+
GList *keys = g_hash_table_get_keys(self->state->keys);
157190
g_list_foreach(keys, lookup_entry, self);
158191
g_list_free(keys);
159192
}
@@ -177,7 +210,8 @@ add_main(int argc, char *argv[])
177210
fprintf(stderr, "Directory doesn't exist: %s\n", persist_state_dir);
178211
return 1;
179212
}
180-
filename = g_build_path(G_DIR_SEPARATOR_S, persist_state_dir, DEFAULT_PERSIST_FILE, NULL);
213+
filename = g_build_path(G_DIR_SEPARATOR_S, persist_state_dir,
214+
persist_state_name ? persist_state_name : DEFAULT_PERSIST_FILE, NULL);
181215

182216
if (argc < 2)
183217
{
@@ -202,8 +236,12 @@ add_main(int argc, char *argv[])
202236
}
203237
}
204238

205-
206239
self = persist_tool_new(filename, persist_mode_edit);
240+
if (!self)
241+
{
242+
fprintf(stderr,"Error creating persist tool\n");
243+
return 1;
244+
}
207245

208246
while(fgets(line, MAX_LINE_LEN, input_file))
209247
{
@@ -214,7 +252,7 @@ add_main(int argc, char *argv[])
214252
}
215253
g_free(line);
216254

217-
dump_all_entries(self);
255+
ref_all_entries(self);
218256

219257
persist_tool_free(self);
220258
if (input_file != stdin)

persist-tool/add.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
#include "persist-tool.h"
3434

3535
gchar *persist_state_dir;
36+
gchar *persist_state_name;
3637

3738
gint add_main(int argc, char *argv[]);
3839

39-
4040
#endif

persist-tool/dump.c

+26-18
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,39 @@
2222
*/
2323

2424
#include "dump.h"
25-
#include "state.h"
2625

27-
void
28-
print_struct(gpointer data, gpointer user_data)
26+
static void
27+
print_struct_json_style(gpointer data, gpointer user_data)
2928
{
29+
PersistEntryHandle handle;
30+
gsize size;
31+
guint8 result_version;
32+
3033
PersistTool *self = (PersistTool *)user_data;
3134
gchar *name = (gchar *)data;
32-
StateHandler *handler;
33-
NameValueContainer *nv_pairs;
3435

35-
handler = persist_tool_get_state_handler(self, name);
36-
nv_pairs = handler->dump_state(handler);
36+
if (!(handle = persist_state_lookup_entry(self->state, name, &size, &result_version)))
37+
{
38+
fprintf(stderr,"Can't lookup for entry \"%s\"\n", name);
39+
return;
40+
}
3741

38-
fprintf(stdout, "%s = %s\n\n", (char *) data, name_value_container_get_json_string(nv_pairs));
42+
gpointer block = persist_state_map_entry(self->state, handle);
3943

40-
name_value_container_free(nv_pairs);
41-
state_handler_free(handler);
44+
fprintf(stdout,"\n%s = { \"value\": \"", name);
45+
gchar *block_data = (gchar *) block;
46+
for (gsize i=0; i<size; i++)
47+
{
48+
fprintf(stdout, "%.2X ", block_data[i]&0xff);
49+
}
50+
fprintf(stdout,"\" }\n");
51+
52+
persist_state_unmap_entry(self->state, handle);
4253
}
4354

4455
gint
4556
dump_main(int argc, char *argv[])
4657
{
47-
gint result = 0;
48-
PersistTool *self;
49-
GList *keys;
50-
5158
if (argc < 2)
5259
{
5360
fprintf(stderr, "Persist file is a required parameter\n");
@@ -60,17 +67,18 @@ dump_main(int argc, char *argv[])
6067
return 1;
6168
}
6269

63-
self = persist_tool_new(argv[1], persist_mode_dump);
70+
PersistTool *self = persist_tool_new(argv[1], persist_mode_dump);
6471
if (!self)
6572
{
73+
fprintf(stderr,"Error creating persist tool\n");
6674
return 1;
6775
}
6876

69-
keys = persist_state_get_key_list(self->state);
77+
GList *keys = g_hash_table_get_keys(self->state->keys);
7078

71-
g_list_foreach(keys, print_struct, self);
79+
g_list_foreach(keys, print_struct_json_style, self);
7280
g_list_free(keys);
7381

7482
persist_tool_free(self);
75-
return result;
83+
return 0;
7684
}

0 commit comments

Comments
 (0)