Coverage Report

Created: 2026-11-12 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-systemd-journal.c
Line
Count
Source
1
/* packet-systemd-journal.c
2
 * Routines for systemd journal export (application/vnd.fdo.journal) dissection
3
 * Copyright 2018, Gerald Combs <gerald@wireshark.org>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 *
9
 * SPDX-License-Identifier: GPL-2.0-or-later
10
 */
11
12
/*
13
 * Dissector for systemd's mostly-text-based Journal Export Format described
14
 * at https://www.freedesktop.org/wiki/Software/systemd/export/.
15
 *
16
 * Registered MIME type: application/vnd.fdo.journal
17
 *
18
 * To do:
19
 * - Rename systemd_journal to sdjournal? It's easier to type.
20
 * - Add an extcap module.
21
 * - Add errno strings.
22
 * - Pretty-print _CAP_EFFECTIVE
23
 * - Handle Journal JSON Format? https://www.freedesktop.org/wiki/Software/systemd/json/
24
 * - Handle raw journal files? https://www.freedesktop.org/wiki/Software/systemd/journal-files/
25
 */
26
27
#include <config.h>
28
29
#include <epan/exceptions.h>
30
#include <epan/packet.h>
31
#include <epan/expert.h>
32
#include <wiretap/wtap.h>
33
#include <wsutil/strtoi.h>
34
#include <wsutil/array.h>
35
36
#include "packet-syslog.h"
37
38
void event_register_systemd_journal(void);
39
void event_reg_handoff_systemd_journal(void);
40
41
/* Initialize the protocol and registered fields */
42
static int proto_systemd_journal;
43
44
// Official entries, listed in
45
// https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
46
// as of 2018-08.
47
static int hf_sj_message;
48
static int hf_sj_message_id;
49
static int hf_sj_priority;
50
static int hf_sj_code_file;
51
static int hf_sj_code_line;
52
static int hf_sj_code_func;
53
static int hf_sj_errno;
54
static int hf_sj_syslog_facility;
55
static int hf_sj_syslog_identifier;
56
static int hf_sj_syslog_pid;
57
58
static int hf_sj_pid;
59
static int hf_sj_uid;
60
static int hf_sj_gid;
61
static int hf_sj_comm;
62
static int hf_sj_exe;
63
static int hf_sj_cmdline;
64
static int hf_sj_cap_effective;
65
static int hf_sj_audit_session;
66
static int hf_sj_audit_loginuid;
67
static int hf_sj_systemd_cgroup;
68
static int hf_sj_systemd_slice;
69
static int hf_sj_systemd_unit;
70
static int hf_sj_systemd_user_unit;
71
static int hf_sj_systemd_session;
72
static int hf_sj_systemd_owner_uid;
73
74
static int hf_sj_selinux_context;
75
static int hf_sj_source_realtime_timestamp;
76
static int hf_sj_boot_id;
77
static int hf_sj_machine_id;
78
static int hf_sj_systemd_invocation_id;
79
static int hf_sj_hostname;
80
static int hf_sj_transport;
81
static int hf_sj_stream_id;
82
static int hf_sj_line_break;
83
84
static int hf_sj_kernel_device;
85
static int hf_sj_kernel_subsystem;
86
static int hf_sj_udev_sysname;
87
static int hf_sj_udev_devnode;
88
static int hf_sj_udev_devlink;
89
90
static int hf_sj_coredump_unit;
91
static int hf_sj_coredump_user_unit;
92
static int hf_sj_object_pid;
93
static int hf_sj_object_uid;
94
static int hf_sj_object_gid;
95
static int hf_sj_object_comm;
96
static int hf_sj_object_exe;
97
static int hf_sj_object_cmdline;
98
static int hf_sj_object_audit_session;
99
static int hf_sj_object_audit_loginuid;
100
static int hf_sj_object_cap_effective;
101
static int hf_sj_object_selinux_context;
102
static int hf_sj_object_systemd_cgroup;
103
static int hf_sj_object_systemd_session;
104
static int hf_sj_object_systemd_owner_uid;
105
static int hf_sj_object_systemd_unit;
106
static int hf_sj_object_systemd_user_unit;
107
static int hf_sj_object_systemd_slice;
108
static int hf_sj_object_systemd_user_slice;
109
static int hf_sj_object_systemd_invocation_id;
110
111
static int hf_sj_cursor;
112
static int hf_sj_realtime_timestamp;
113
static int hf_sj_monotonic_timestamp;
114
115
// Unofficial(?) fields. Not listed in the documentation but present in logs.
116
static int hf_sj_result;
117
static int hf_sj_source_monotonic_timestamp;
118
static int hf_sj_journal_name;
119
static int hf_sj_journal_path;
120
static int hf_sj_current_use;
121
static int hf_sj_current_use_pretty;
122
static int hf_sj_max_use;
123
static int hf_sj_max_use_pretty;
124
static int hf_sj_disk_keep_free;
125
static int hf_sj_disk_keep_free_pretty;
126
static int hf_sj_disk_available;
127
static int hf_sj_disk_available_pretty;
128
static int hf_sj_limit;
129
static int hf_sj_limit_pretty;
130
static int hf_sj_available;
131
static int hf_sj_available_pretty;
132
static int hf_sj_audit_type;
133
static int hf_sj_audit_id;
134
static int hf_sj_audit_field_apparmor;
135
static int hf_sj_audit_field_operation;
136
static int hf_sj_audit_field_profile;
137
static int hf_sj_audit_field_name;
138
static int hf_sj_seat_id;
139
static int hf_sj_kernel_usec;
140
static int hf_sj_userspace_usec;
141
static int hf_sj_session_id;
142
static int hf_sj_user_id;
143
static int hf_sj_leader;
144
static int hf_sj_job_type;
145
static int hf_sj_job_result;
146
static int hf_sj_user_invocation_id;
147
static int hf_sj_systemd_user_slice;
148
149
// Metadata.
150
static int hf_sj_binary_data_len;
151
static int hf_sj_unknown_field;
152
static int hf_sj_unknown_field_name;
153
static int hf_sj_unknown_field_value;
154
static int hf_sj_unknown_field_data;
155
static int hf_sj_unhandled_field_type;
156
157
static expert_field ei_unhandled_field_type;
158
static expert_field ei_nonbinary_field;
159
static expert_field ei_undecoded_field;
160
161
static dissector_handle_t sje_handle;
162
163
#define MAX_DATA_SIZE 262144 // WTAP_MAX_PACKET_SIZE_STANDARD. Increase if needed.
164
165
/* Initialize the subtree pointers */
166
static int ett_systemd_journal_entry;
167
static int ett_systemd_binary_data;
168
static int ett_systemd_unknown_field;
169
170
// XXX Use a value_string instead?
171
typedef struct _journal_field_hf_map {
172
    int hfid;
173
    const char *name;
174
} journal_field_hf_map;
175
176
static journal_field_hf_map *jf_to_hf;
177
178
0
static void init_jf_to_hf_map(void) {
179
0
    journal_field_hf_map jhmap[] = {
180
        // Official.
181
0
        { hf_sj_message, "MESSAGE=" },
182
0
        { hf_sj_message_id, "MESSAGE_ID=" },
183
0
        { hf_sj_priority, "PRIORITY=" },
184
0
        { hf_sj_code_file, "CODE_FILE=" },
185
0
        { hf_sj_code_line, "CODE_LINE=" },
186
0
        { hf_sj_code_func, "CODE_FUNC=" },
187
0
        { hf_sj_result, "RESULT=" },
188
0
        { hf_sj_errno, "ERRNO=" },
189
0
        { hf_sj_syslog_facility, "SYSLOG_FACILITY=" },
190
0
        { hf_sj_syslog_identifier, "SYSLOG_IDENTIFIER=" },
191
0
        { hf_sj_syslog_pid, "SYSLOG_PID=" },
192
193
0
        { hf_sj_pid, "_PID=" },
194
0
        { hf_sj_uid, "_UID=" },
195
0
        { hf_sj_gid, "_GID=" },
196
0
        { hf_sj_comm, "_COMM=" },
197
0
        { hf_sj_exe, "_EXE=" },
198
0
        { hf_sj_cmdline, "_CMDLINE=" },
199
0
        { hf_sj_cap_effective, "_CAP_EFFECTIVE=" },
200
0
        { hf_sj_audit_session, "_AUDIT_SESSION=" },
201
0
        { hf_sj_audit_loginuid, "_AUDIT_LOGINUID=" },
202
0
        { hf_sj_systemd_cgroup, "_SYSTEMD_CGROUP=" },
203
0
        { hf_sj_systemd_slice, "_SYSTEMD_SLICE=" },
204
0
        { hf_sj_systemd_unit, "_SYSTEMD_UNIT=" },
205
0
        { hf_sj_systemd_user_unit, "_SYSTEMD_USER_UNIT=" },
206
0
        { hf_sj_systemd_session, "_SYSTEMD_SESSION=" },
207
0
        { hf_sj_systemd_owner_uid, "_SYSTEMD_OWNER_UID=" },
208
209
0
        { hf_sj_selinux_context, "_SELINUX_CONTEXT=" },
210
0
        { hf_sj_source_realtime_timestamp, "_SOURCE_REALTIME_TIMESTAMP=" },
211
0
        { hf_sj_source_monotonic_timestamp, "_SOURCE_MONOTONIC_TIMESTAMP=" },
212
0
        { hf_sj_boot_id, "_BOOT_ID=" },
213
0
        { hf_sj_machine_id, "_MACHINE_ID=" },
214
0
        { hf_sj_systemd_invocation_id, "_SYSTEMD_INVOCATION_ID=" },
215
0
        { hf_sj_hostname, "_HOSTNAME=" },
216
0
        { hf_sj_transport, "_TRANSPORT=" },
217
0
        { hf_sj_stream_id, "_STREAM_ID=" },
218
0
        { hf_sj_line_break, "_LINE_BREAK=" },
219
220
0
        { hf_sj_kernel_device, "_KERNEL_DEVICE=" },
221
0
        { hf_sj_kernel_subsystem, "_KERNEL_SUBSYSTEM=" },
222
0
        { hf_sj_udev_sysname, "_UDEV_SYSNAME=" },
223
0
        { hf_sj_udev_devnode, "_UDEV_DEVNODE=" },
224
0
        { hf_sj_udev_devlink, "_UDEV_DEVLINK=" },
225
226
0
        { hf_sj_coredump_unit, "COREDUMP_UNIT=" },
227
0
        { hf_sj_coredump_user_unit, "COREDUMP_USER_UNIT=" },
228
0
        { hf_sj_object_pid, "OBJECT_PID=" },
229
0
        { hf_sj_object_uid, "OBJECT_UID=" },
230
0
        { hf_sj_object_gid, "OBJECT_GID=" },
231
0
        { hf_sj_object_comm, "OBJECT_COMM=" },
232
0
        { hf_sj_object_exe, "OBJECT_EXE=" },
233
0
        { hf_sj_object_cmdline, "OBJECT_CMDLINE=" },
234
0
        { hf_sj_object_audit_session, "OBJECT_AUDIT_SESSION=" },
235
0
        { hf_sj_object_audit_loginuid, "OBJECT_AUDIT_LOGINUID=" },
236
0
        { hf_sj_object_cap_effective, "OBJECT_CAP_EFFECTIVE=" },
237
0
        { hf_sj_object_selinux_context, "OBJECT_SELINUX_CONTEXT=" },
238
0
        { hf_sj_object_systemd_cgroup, "OBJECT_SYSTEMD_CGROUP=" },
239
0
        { hf_sj_object_systemd_session, "OBJECT_SYSTEMD_SESSION=" },
240
0
        { hf_sj_object_systemd_owner_uid, "OBJECT_SYSTEMD_OWNER_UID=" },
241
0
        { hf_sj_object_systemd_unit, "OBJECT_SYSTEMD_UNIT=" },
242
0
        { hf_sj_object_systemd_user_unit, "OBJECT_SYSTEMD_USER_UNIT=" },
243
0
        { hf_sj_object_systemd_slice, "OBJECT_SYSTEMD_SLICE=" },
244
0
        { hf_sj_object_systemd_user_slice, "OBJECT_SYSTEMD_USER_SLICE=" },
245
0
        { hf_sj_object_systemd_invocation_id, "OBJECT_SYSTEMD_INVOCATION_ID=" },
246
247
0
        { hf_sj_cursor, "__CURSOR=" },
248
0
        { hf_sj_realtime_timestamp, "__REALTIME_TIMESTAMP=" },
249
0
        { hf_sj_monotonic_timestamp, "__MONOTONIC_TIMESTAMP=" },
250
251
        // Unofficial?
252
0
        { hf_sj_journal_name, "JOURNAL_NAME=" }, // systemd-journald: Runtime journal (/run/log/journal/) is ...
253
0
        { hf_sj_journal_path, "JOURNAL_PATH=" }, // ""
254
0
        { hf_sj_current_use, "CURRENT_USE=" }, // ""
255
0
        { hf_sj_current_use_pretty, "CURRENT_USE_PRETTY=" }, // ""
256
0
        { hf_sj_max_use, "MAX_USE=" }, // ""
257
0
        { hf_sj_max_use_pretty, "MAX_USE_PRETTY=" }, // ""
258
0
        { hf_sj_disk_keep_free, "DISK_KEEP_FREE=" }, // ""
259
0
        { hf_sj_disk_keep_free_pretty, "DISK_KEEP_FREE_PRETTY=" }, // ""
260
0
        { hf_sj_disk_available, "DISK_AVAILABLE=" }, // ""
261
0
        { hf_sj_disk_available_pretty, "DISK_AVAILABLE_PRETTY=" }, // ""
262
0
        { hf_sj_limit, "LIMIT=" }, // ""
263
0
        { hf_sj_limit_pretty, "LIMIT_PRETTY=" }, // ""
264
0
        { hf_sj_available, "AVAILABLE=" }, // ""
265
0
        { hf_sj_available_pretty, "AVAILABLE_PRETTY=" }, // ""
266
0
        { hf_sj_code_func, "CODE_FUNCTION=" }, // Dup / alias of CODE_FUNC?
267
0
        { hf_sj_systemd_user_unit, "UNIT=" }, // Dup / alias of _SYSTEMD_UNIT?
268
0
        { hf_sj_systemd_user_unit, "USER_UNIT=" }, // Dup / alias of _SYSTEMD_USER_UNIT?
269
0
        { hf_sj_audit_type, "_AUDIT_TYPE=" },
270
0
        { hf_sj_audit_id, "_AUDIT_ID=" },
271
0
        { hf_sj_audit_field_apparmor, "_AUDIT_FIELD_APPARMOR=" },
272
0
        { hf_sj_audit_field_operation, "_AUDIT_FIELD_OPERATION=" },
273
0
        { hf_sj_audit_field_profile, "_AUDIT_FIELD_PROFILE=" },
274
0
        { hf_sj_audit_field_name, "_AUDIT_FIELD_NAME=" },
275
0
        { hf_sj_seat_id, "SEAT_ID=" },
276
0
        { hf_sj_kernel_usec, "KERNEL_USEC=" },
277
0
        { hf_sj_userspace_usec, "USERSPACE_USEC=" },
278
0
        { hf_sj_session_id, "SESSION_ID=" },
279
0
        { hf_sj_user_id, "USER_ID=" },
280
0
        { hf_sj_leader, "LEADER=" },
281
0
        { hf_sj_job_type, "JOB_TYPE=" },
282
0
        { hf_sj_job_result, "JOB_RESULT=" },
283
0
        { hf_sj_user_invocation_id, "USER_INVOCATION_ID=" },
284
0
        { hf_sj_systemd_user_slice, "_SYSTEMD_USER_SLICE=" },
285
0
        { 0, NULL }
286
0
    };
287
0
    jf_to_hf = (journal_field_hf_map*) g_memdup2(jhmap, sizeof(jhmap));
288
0
}
289
290
static void
291
0
dissect_sjle_time_usecs(proto_tree *tree, packet_info* pinfo, int hf_idx, tvbuff_t *tvb, int offset, int len) {
292
0
    uint64_t rt_ts = 0;
293
0
    char *time_str = tvb_format_text(pinfo->pool, tvb, offset, len);
294
0
    bool ok = ws_strtou64(time_str, NULL, &rt_ts);
295
0
    if (ok) {
296
0
        nstime_t ts;
297
0
        ts.secs = (time_t) (rt_ts / 1000000);
298
0
        ts.nsecs = (rt_ts % 1000000) * 1000;
299
0
        proto_tree_add_time(tree, hf_idx, tvb, offset, len, &ts);
300
0
    } else {
301
0
        proto_tree_add_expert_format(tree, NULL, &ei_undecoded_field, tvb, offset, len, "Invalid time value %s", time_str);
302
0
    }
303
0
}
304
305
static void
306
0
dissect_sjle_uint(proto_tree *tree, packet_info* pinfo _U_, int hf_idx, tvbuff_t *tvb, int offset, int len) {
307
0
    uint32_t uint_val;
308
0
    tvb_get_string_uint(tvb, offset, len, ENC_STR_DEC, &uint_val, NULL);
309
0
    proto_tree_add_uint(tree, hf_idx, tvb, offset, len, uint_val);
310
0
}
311
312
static void
313
0
dissect_sjle_int(proto_tree *tree, packet_info* pinfo _U_, int hf_idx, tvbuff_t *tvb, int offset, int len) {
314
0
    int32_t int_val;
315
0
    tvb_get_string_int(tvb, offset, len, ENC_STR_DEC, &int_val, NULL);
316
0
    proto_tree_add_int(tree, hf_idx, tvb, offset, len, int_val);
317
0
}
318
319
/* Dissect a line-based journal export entry */
320
static int
321
dissect_systemd_journal_line_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
322
0
{
323
0
    proto_item *ti;
324
0
    proto_tree *sje_tree;
325
0
    unsigned    offset = 0, next_offset = 0;
326
327
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "systemd Journal");
328
0
    col_clear(pinfo->cinfo, COL_INFO);
329
0
    col_set_str(pinfo->cinfo, COL_INFO, "Journal Entry");
330
331
0
    ti = proto_tree_add_item(tree, proto_systemd_journal, tvb, 0, -1, ENC_NA);
332
0
    sje_tree = proto_item_add_subtree(ti, ett_systemd_journal_entry);
333
334
0
    while (tvb_offset_exists(tvb, offset)) {
335
0
        unsigned line_len;
336
0
        tvb_find_line_end_remaining(tvb, offset, &line_len, &next_offset);
337
0
        if (line_len < 3) {
338
            // Invalid or zero length.
339
            // XXX Add an expert item for non-empty lines.
340
0
            offset = next_offset;
341
0
            continue;
342
0
        }
343
0
        bool found = false;
344
0
        unsigned val_off;
345
0
        if (tvb_find_uint8_length(tvb, offset, line_len, '=', &val_off)) {
346
            // Text field.
347
            // XXX - We should only need to try the text fields in this case.
348
0
            val_off++;
349
0
        } else {
350
0
            val_off = 0;
351
0
        }
352
0
        unsigned val_len = offset + line_len - val_off;
353
354
0
        for (int i = 0; jf_to_hf[i].name; i++) {
355
0
            if (tvb_memeql(tvb, offset, (const uint8_t*) jf_to_hf[i].name, strlen(jf_to_hf[i].name)) == 0) {
356
0
                int hf_idx = jf_to_hf[i].hfid;
357
0
                switch (proto_registrar_get_ftype(hf_idx)) {
358
0
                case FT_ABSOLUTE_TIME:
359
0
                case FT_RELATIVE_TIME:
360
0
                    dissect_sjle_time_usecs(sje_tree, pinfo, hf_idx, tvb, val_off, val_len);
361
0
                    break;
362
0
                case FT_UINT32:
363
0
                case FT_UINT16:
364
0
                case FT_UINT8:
365
0
                    dissect_sjle_uint(sje_tree, pinfo, hf_idx, tvb, val_off, val_len);
366
0
                    break;
367
0
                case FT_INT32:
368
0
                case FT_INT16:
369
0
                case FT_INT8:
370
0
                    dissect_sjle_int(sje_tree, pinfo, hf_idx, tvb, val_off, val_len);
371
0
                    break;
372
0
                case FT_STRING:
373
0
                    proto_tree_add_item(sje_tree, jf_to_hf[i].hfid, tvb, val_off, val_len, ENC_UTF_8|ENC_NA);
374
0
                    break;
375
0
                default:
376
0
                {
377
0
                    proto_item *expert_ti = proto_tree_add_item(sje_tree, hf_sj_unhandled_field_type, tvb, offset, line_len,
378
0
                                                                    ENC_UTF_8);
379
0
                    expert_add_info(pinfo, expert_ti, &ei_unhandled_field_type);
380
0
                    break;
381
0
                }
382
0
                }
383
0
                if (hf_idx == hf_sj_message) {
384
0
                    col_clear(pinfo->cinfo, COL_INFO);
385
0
                    col_add_str(pinfo->cinfo, COL_INFO, (char *) tvb_get_string_enc(pinfo->pool, tvb, val_off, val_len, ENC_UTF_8));
386
0
                }
387
0
                found = true;
388
0
            }
389
0
        }
390
391
0
        if (!found && val_off > offset + 1) {
392
0
            proto_item *unk_ti = proto_tree_add_none_format(sje_tree, hf_sj_unknown_field, tvb, offset, line_len,
393
0
                                                            "Unknown text field: %s", tvb_get_string_enc(pinfo->pool, tvb, offset, val_off - offset - 1, ENC_UTF_8));
394
0
            proto_tree *unk_tree = proto_item_add_subtree(unk_ti, ett_systemd_unknown_field);
395
0
            proto_tree_add_item(unk_tree, hf_sj_unknown_field_name, tvb, offset, val_off - offset - 1, ENC_UTF_8);
396
0
            proto_tree_add_item(unk_tree, hf_sj_unknown_field_value, tvb, val_off, val_len, ENC_UTF_8);
397
0
            offset = next_offset;
398
0
            continue;
399
0
        }
400
401
        // Try again, looking for binary fields.
402
0
        if (!found) {
403
0
            for (int i = 0; jf_to_hf[i].name; i++) {
404
0
                unsigned noeql_len = (unsigned) strlen(jf_to_hf[i].name) - 1;
405
0
                if (tvb_memeql(tvb, offset, (const uint8_t *) jf_to_hf[i].name, (size_t) noeql_len) == 0 && tvb_memeql(tvb, offset+noeql_len, (const uint8_t *) "\n", 1) == 0) {
406
0
                    int hf_idx = jf_to_hf[i].hfid;
407
0
                    uint64_t data_len = tvb_get_letoh64(tvb, offset + noeql_len + 1);
408
0
                    unsigned data_off = offset + noeql_len + 1 + 8; // \n + data len
409
0
                    if (proto_registrar_get_ftype(hf_idx) == FT_STRING) {
410
0
                        proto_item *bin_ti = proto_tree_add_item(sje_tree, hf_idx, tvb, data_off, (int) data_len, ENC_UTF_8);
411
0
                        proto_tree *bin_tree = proto_item_add_subtree(bin_ti, ett_systemd_binary_data);
412
0
                        proto_tree_add_item(bin_tree, hf_sj_binary_data_len, tvb, offset + noeql_len + 1, 8, ENC_LITTLE_ENDIAN);
413
0
                        if (hf_idx == hf_sj_message) {
414
0
                            col_clear(pinfo->cinfo, COL_INFO);
415
0
                            col_add_str(pinfo->cinfo, COL_INFO, tvb_format_text(pinfo->pool, tvb, data_off, (unsigned) data_len));
416
0
                        }
417
0
                    } else {
418
0
                        proto_item *unk_ti = proto_tree_add_none_format(sje_tree, hf_sj_unknown_field, tvb, offset, line_len,
419
0
                                                                        "Unknown data field: %s", tvb_format_text(pinfo->pool, tvb, offset, noeql_len));
420
0
                        proto_tree *unk_tree = proto_item_add_subtree(unk_ti, ett_systemd_unknown_field);
421
0
                        proto_item *expert_ti = proto_tree_add_item(unk_tree, hf_sj_unknown_field_name, tvb, offset, noeql_len, ENC_UTF_8);
422
0
                        proto_tree_add_item(unk_tree, hf_sj_unknown_field_data, tvb, data_off, (int) data_len, ENC_UTF_8);
423
0
                        expert_add_info(pinfo, expert_ti, &ei_nonbinary_field);
424
0
                    }
425
0
                    if (ckd_add(&next_offset, data_off + 1, data_len)) {
426
0
                        next_offset = tvb_reported_length(tvb);
427
0
                    }
428
0
                }
429
0
            }
430
0
        }
431
0
        offset = next_offset;
432
0
    }
433
434
0
    return offset;
435
0
}
436
437
/*
438
 * Register the protocol with Stratoshark.
439
 */
440
void
441
event_register_systemd_journal(void)
442
0
{
443
0
    expert_module_t *expert_systemd_journal;
444
445
0
    static hf_register_info hf[] = {
446
0
        { &hf_sj_message,
447
0
          { "Message", "systemd_journal.message",
448
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
449
0
        },
450
0
        { &hf_sj_message_id,
451
0
          { "Message ID", "systemd_journal.message_id",
452
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
453
0
        },
454
0
        { &hf_sj_priority,
455
0
          { "Priority", "systemd_journal.priority",
456
0
            FT_UINT8, BASE_DEC, VALS(syslog_level_vals), 0x0, NULL, HFILL }
457
0
        },
458
0
        { &hf_sj_code_file,
459
0
          { "Code file", "systemd_journal.code_file",
460
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
461
0
        },
462
0
        { &hf_sj_code_line,
463
0
          { "Code line", "systemd_journal.code_line",
464
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
465
0
        },
466
0
        { &hf_sj_code_func,
467
0
          { "Code func", "systemd_journal.code_func",
468
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
469
0
        },
470
0
        { &hf_sj_errno,
471
0
          { "Errno", "systemd_journal.errno",
472
0
            FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
473
0
        },
474
0
        { &hf_sj_syslog_facility,
475
0
          { "Syslog facility", "systemd_journal.syslog_facility",
476
0
            FT_UINT8, BASE_NONE, VALS(syslog_facility_vals), 0x0, NULL, HFILL }
477
0
        },
478
0
        { &hf_sj_syslog_identifier,
479
0
          { "Syslog identifier", "systemd_journal.syslog_id",
480
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
481
0
        },
482
0
        { &hf_sj_syslog_pid,
483
0
          { "Syslog PID", "systemd_journal.syslog_pid",
484
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
485
0
        },
486
487
0
        { &hf_sj_pid,
488
0
          { "PID", "systemd_journal.pid",
489
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
490
0
        },
491
0
        { &hf_sj_uid,
492
0
          { "UID", "systemd_journal.uid",
493
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
494
0
        },
495
0
        { &hf_sj_gid,
496
0
          { "GID", "systemd_journal.gid",
497
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
498
0
        },
499
0
        { &hf_sj_comm,
500
0
          { "Command name", "systemd_journal.comm",
501
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
502
0
        },
503
0
        { &hf_sj_exe,
504
0
          { "Executable path", "systemd_journal.exe",
505
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
506
0
        },
507
0
        { &hf_sj_cmdline,
508
0
          { "Command line", "systemd_journal.cmdline",
509
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
510
0
        },
511
0
        { &hf_sj_cap_effective,
512
0
          { "Effective capability", "systemd_journal.cap_effective",
513
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
514
0
        },
515
0
        { &hf_sj_audit_session,
516
0
          { "Audit session", "systemd_journal.audit_session",
517
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
518
0
        },
519
0
        { &hf_sj_audit_loginuid,
520
0
          { "Audit login UID", "systemd_journal.audit_loginuid",
521
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
522
0
        },
523
524
0
        { &hf_sj_systemd_cgroup,
525
0
          { "Systemd cgroup", "systemd_journal.systemd_cgroup",
526
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
527
0
        },
528
0
        { &hf_sj_systemd_slice,
529
0
          { "Systemd slice", "systemd_journal.systemd_slice",
530
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
531
0
        },
532
0
        { &hf_sj_systemd_unit,
533
0
          { "Systemd unit", "systemd_journal.systemd_unit",
534
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
535
0
        },
536
0
        { &hf_sj_systemd_user_unit,
537
0
          { "Systemd user unit", "systemd_journal.systemd_user_unit",
538
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
539
0
        },
540
0
        { &hf_sj_systemd_session,
541
0
          { "Systemd session", "systemd_journal.systemd_session",
542
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
543
0
        },
544
0
        { &hf_sj_systemd_owner_uid,
545
0
          { "Systemd owner UID", "systemd_journal.systemd_owner_uid",
546
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
547
0
        },
548
549
0
        { &hf_sj_selinux_context,
550
0
          { "SELinux context", "systemd_journal.selinux_context",
551
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
552
0
        },
553
0
        { &hf_sj_source_realtime_timestamp,
554
0
          { "Source realtime timestamp", "systemd_journal.source_realtime_timestamp",
555
0
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL }
556
0
        },
557
0
        { &hf_sj_boot_id,
558
0
          { "Boot ID", "systemd_journal.boot_id",
559
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
560
0
        },
561
0
        { &hf_sj_machine_id,
562
0
          { "Machine ID", "systemd_journal.machine_id",
563
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
564
0
        },
565
0
        { &hf_sj_systemd_invocation_id,
566
0
          { "Systemd invocation ID", "systemd_journal.systemd_invocation_id",
567
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
568
0
        },
569
0
        { &hf_sj_hostname,
570
0
          { "Hostname", "systemd_journal.hostname",
571
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
572
0
        },
573
0
        { &hf_sj_transport,
574
0
          { "Transport", "systemd_journal.transport",
575
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
576
0
        },
577
0
        { &hf_sj_stream_id,
578
0
          { "Stream ID", "systemd_journal.stream_id",
579
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
580
0
        },
581
0
        { &hf_sj_line_break,
582
0
          { "Line break", "systemd_journal.line_break",
583
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
584
0
        },
585
586
0
        { &hf_sj_kernel_device,
587
0
          { "Kernel device", "systemd_journal.kernel_device",
588
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
589
0
        },
590
0
        { &hf_sj_kernel_subsystem,
591
0
          { "Kernel subsystem", "systemd_journal.kernel_subsystem",
592
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
593
0
        },
594
0
        { &hf_sj_udev_sysname,
595
0
          { "Device tree name", "systemd_journal.udev_sysname",
596
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
597
0
        },
598
0
        { &hf_sj_udev_devnode,
599
0
          { "Device tree node", "systemd_journal.udev_devnode",
600
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
601
0
        },
602
0
        { &hf_sj_udev_devlink,
603
0
          { "Device tree symlink", "systemd_journal.udev_devlink",
604
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
605
0
        },
606
607
0
        { &hf_sj_coredump_unit,
608
0
          { "Coredump unit", "systemd_journal.coredump_unit",
609
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
610
0
        },
611
0
        { &hf_sj_coredump_user_unit,
612
0
          { "Coredump user unit", "systemd_journal.coredump_user_unit",
613
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
614
0
        },
615
0
        { &hf_sj_object_pid,
616
0
          { "Object PID", "systemd_journal.object_pid",
617
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
618
0
        },
619
0
        { &hf_sj_object_uid,
620
0
          { "Object UID", "systemd_journal.object_uid",
621
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
622
0
        },
623
0
        { &hf_sj_object_gid,
624
0
          { "Object GID", "systemd_journal.object_gid",
625
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
626
0
        },
627
0
        { &hf_sj_object_comm,
628
0
          { "Object command name", "systemd_journal.object_comm",
629
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
630
0
        },
631
0
        { &hf_sj_object_exe,
632
0
          { "Object executable path", "systemd_journal.object_exe",
633
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
634
0
        },
635
0
        { &hf_sj_object_cmdline,
636
0
          { "Object command line", "systemd_journal.object_cmdline",
637
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
638
0
        },
639
0
        { &hf_sj_object_audit_session,
640
0
          { "Object audit session", "systemd_journal.object_audit_session",
641
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
642
0
        },
643
0
        { &hf_sj_object_audit_loginuid,
644
0
          { "Object audit login UID", "systemd_journal.object_audit_loginuid",
645
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
646
0
        },
647
0
        { &hf_sj_object_cap_effective,
648
0
          { "Object effective capability", "systemd_journal.object_cap_effective",
649
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
650
0
        },
651
0
        { &hf_sj_object_selinux_context,
652
0
          { "Object SELinux context", "systemd_journal.object_selinux_context",
653
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
654
0
        },
655
0
        { &hf_sj_object_systemd_cgroup,
656
0
          { "Object systemd cgroup", "systemd_journal.object_systemd_cgroup",
657
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
658
0
        },
659
0
        { &hf_sj_object_systemd_session,
660
0
          { "Object systemd session", "systemd_journal.object_systemd_session",
661
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
662
0
        },
663
0
        { &hf_sj_object_systemd_owner_uid,
664
0
          { "Object systemd owner UID", "systemd_journal.object_systemd_owner_uid",
665
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
666
0
        },
667
0
        { &hf_sj_object_systemd_unit,
668
0
          { "Object systemd unit", "systemd_journal.object_systemd_unit",
669
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
670
0
        },
671
0
        { &hf_sj_object_systemd_user_unit,
672
0
          { "Object systemd user unit", "systemd_journal.object_systemd_user_unit",
673
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
674
0
        },
675
0
        { &hf_sj_object_systemd_slice,
676
0
          { "Object systemd slice", "systemd_journal.object_systemd_slice",
677
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
678
0
        },
679
0
        { &hf_sj_object_systemd_user_slice,
680
0
          { "Object systemd user slice", "systemd_journal.object_systemd_user_slice",
681
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
682
0
        },
683
0
        { &hf_sj_object_systemd_invocation_id,
684
0
          { "Object systemd invocation ID", "systemd_journal.object_systemd_invocation_id",
685
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
686
0
        },
687
688
0
        { &hf_sj_cursor,
689
0
          { "Cursor", "systemd_journal.cursor",
690
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
691
0
        },
692
0
        { &hf_sj_realtime_timestamp,
693
0
          { "Realtime Timestamp", "systemd_journal.realtime_timestamp",
694
0
            FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL }
695
0
        },
696
0
        { &hf_sj_monotonic_timestamp,
697
0
          { "Monotonic Timestamp", "systemd_journal.monotonic_timestamp",
698
0
            FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }
699
0
        },
700
701
0
        { &hf_sj_journal_name,
702
0
          { "Journal name", "systemd_journal.journal_name",
703
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
704
0
        },
705
0
        { &hf_sj_journal_path,
706
0
          { "Journal path", "systemd_journal.journal_path",
707
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
708
0
        },
709
0
        { &hf_sj_current_use,
710
0
          { "Current use", "systemd_journal.current_use",
711
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
712
0
        },
713
0
        { &hf_sj_current_use_pretty,
714
0
          { "Human readable current use", "systemd_journal.current_use_pretty",
715
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
716
0
        },
717
0
        { &hf_sj_max_use,
718
0
          { "Max use", "systemd_journal.max_use",
719
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
720
0
        },
721
0
        { &hf_sj_max_use_pretty,
722
0
          { "Human readable max use", "systemd_journal.max_use_pretty",
723
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
724
0
        },
725
0
        { &hf_sj_disk_keep_free,
726
0
          { "Disk keep free", "systemd_journal.disk_keep_free",
727
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
728
0
        },
729
0
        { &hf_sj_disk_keep_free_pretty,
730
0
          { "Human readable disk keep free", "systemd_journal.disk_keep_free_pretty",
731
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
732
0
        },
733
0
        { &hf_sj_disk_available,
734
0
          { "Disk available", "systemd_journal.disk_available",
735
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
736
0
        },
737
0
        { &hf_sj_disk_available_pretty,
738
0
          { "Human readable disk available", "systemd_journal.disk_available_pretty",
739
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
740
0
        },
741
0
        { &hf_sj_limit,
742
0
          { "Limit", "systemd_journal.limit",
743
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
744
0
        },
745
0
        { &hf_sj_limit_pretty,
746
0
          { "Human readable limit", "systemd_journal.limit_pretty",
747
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
748
0
        },
749
0
        { &hf_sj_available,
750
0
          { "Available", "systemd_journal.available",
751
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
752
0
        },
753
0
        { &hf_sj_available_pretty,
754
0
          { "Human readable available", "systemd_journal.available_pretty",
755
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
756
0
        },
757
0
        { &hf_sj_result,
758
0
          { "Result", "systemd_journal.result",
759
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
760
0
        },
761
0
        { &hf_sj_source_monotonic_timestamp,
762
0
          { "Source monotonic timestamp", "systemd_journal.source_monotonic_timestamp",
763
0
            FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }
764
0
        },
765
0
        { &hf_sj_audit_type,
766
0
          { "Audit type", "systemd_journal.audit_type",
767
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
768
0
        },
769
0
        { &hf_sj_audit_id,
770
0
          { "Audit ID", "systemd_journal.audit_id",
771
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
772
0
        },
773
0
        { &hf_sj_audit_field_apparmor,
774
0
          { "Audit field AppArmor", "systemd_journal.audit_field_apparmor",
775
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
776
0
        },
777
0
        { &hf_sj_audit_field_operation,
778
0
          { "Audit field operation", "systemd_journal.audit_field_operation",
779
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
780
0
        },
781
0
        { &hf_sj_audit_field_profile,
782
0
          { "Audit field profile", "systemd_journal.audit_field_profile",
783
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
784
0
        },
785
0
        { &hf_sj_audit_field_name,
786
0
          { "Audit field name", "systemd_journal.audit_field_name",
787
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
788
0
        },
789
0
        { &hf_sj_seat_id,
790
0
          { "Seat ID", "systemd_journal.seat_id",
791
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
792
0
        },
793
0
        { &hf_sj_kernel_usec,
794
0
          { "Kernel microseconds", "systemd_journal.kernel_usec",
795
0
            FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }
796
0
        },
797
0
        { &hf_sj_userspace_usec,
798
0
          { "Userspace microseconds", "systemd_journal.userspace_usec",
799
0
            FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }
800
0
        },
801
0
        { &hf_sj_session_id,
802
0
          { "Session ID", "systemd_journal.session_id",
803
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
804
0
        },
805
0
        { &hf_sj_user_id,
806
0
          { "User ID", "systemd_journal.user_id",
807
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
808
0
        },
809
0
        { &hf_sj_leader,
810
0
          { "Leader", "systemd_journal.leader",
811
0
            FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }
812
0
        },
813
0
        { &hf_sj_job_type,
814
0
          { "Job type", "systemd_journal.job_type",
815
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
816
0
        },
817
0
        { &hf_sj_job_result,
818
0
          { "Job result", "systemd_journal.job_result",
819
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
820
0
        },
821
0
        { &hf_sj_user_invocation_id,
822
0
          { "User invocation ID", "systemd_journal.user_invocation_id",
823
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
824
0
        },
825
0
        { &hf_sj_systemd_user_slice,
826
0
          { "Systemd user slice", "systemd_journal.systemd_user_slice",
827
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
828
0
        },
829
830
0
        { &hf_sj_binary_data_len,
831
0
          { "Binary data length", "systemd_journal.binary_data_len",
832
0
            FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }
833
0
        },
834
0
        { &hf_sj_unknown_field,
835
0
          { "Unknown field", "systemd_journal.field",
836
0
            FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }
837
0
        },
838
0
        { &hf_sj_unknown_field_name,
839
0
          { "Field name", "systemd_journal.field.name",
840
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
841
0
        },
842
0
        { &hf_sj_unknown_field_value,
843
0
          { "Field value", "systemd_journal.field.value",
844
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
845
0
        },
846
0
        { &hf_sj_unknown_field_data,
847
0
          { "Field data", "systemd_journal.field.data",
848
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
849
0
        },
850
0
        { &hf_sj_unhandled_field_type,
851
0
          { "Field data", "systemd_journal.unhandled_field_type",
852
0
            FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }
853
0
        }
854
0
    };
855
856
    /* Setup protocol subtree array */
857
0
    static int *ett[] = {
858
0
        &ett_systemd_journal_entry,
859
0
        &ett_systemd_binary_data,
860
0
        &ett_systemd_unknown_field
861
0
    };
862
863
    /* Setup protocol expert items */
864
0
    static ei_register_info ei[] = {
865
0
        { &ei_unhandled_field_type,
866
0
          { "systemd_journal.unhandled_field_type.undecoded", PI_UNDECODED, PI_ERROR,
867
0
            "Unhandled field type", EXPFILL }
868
0
        },
869
0
        { &ei_nonbinary_field,
870
0
          { "systemd_journal.nonbinary_field", PI_UNDECODED, PI_WARN,
871
0
            "Field shouldn't be binary", EXPFILL }
872
0
        },
873
0
        { &ei_undecoded_field,
874
0
          { "systemd_journal.undecoded_field", PI_UNDECODED, PI_WARN,
875
0
            "Unable to decode field", EXPFILL }
876
0
        }
877
0
    };
878
879
    /* Register the protocol name and description */
880
0
    proto_systemd_journal = proto_register_protocol("systemd Journal Entry", "systemd Journal", "systemd_journal");
881
882
    /* Required function calls to register the header fields and subtrees */
883
0
    proto_register_field_array(proto_systemd_journal, hf, array_length(hf));
884
0
    proto_register_subtree_array(ett, array_length(ett));
885
886
    /* Required function calls to register expert items */
887
0
    expert_systemd_journal = expert_register_protocol(proto_systemd_journal);
888
0
    expert_register_field_array(expert_systemd_journal, ei, array_length(ei));
889
890
0
    sje_handle = register_dissector("systemd_journal", dissect_systemd_journal_line_entry,
891
0
                proto_systemd_journal);
892
893
0
    init_jf_to_hf_map();
894
0
}
895
896
0
#define BLOCK_TYPE_SYSTEMD_JOURNAL_EXPORT 0x0000009
897
898
void
899
event_reg_handoff_systemd_journal(void)
900
0
{
901
0
    int file_type_subtype_systemd_journal;
902
903
0
    file_type_subtype_systemd_journal = wtap_name_to_file_type_subtype("systemd_journal");
904
0
    if (file_type_subtype_systemd_journal != -1)
905
0
        dissector_add_uint("wtap_fts_rec", file_type_subtype_systemd_journal, sje_handle);
906
0
    dissector_add_uint("pcapng.block_type", BLOCK_TYPE_SYSTEMD_JOURNAL_EXPORT, sje_handle);
907
    // It's possible to ship journal entries over HTTP/HTTPS using
908
    // systemd-journal-remote. Dissecting them on the wire isn't very
909
    // useful since it's easy to end up with a packet containing a
910
    // single, huge reassembled journal with many entries.
911
0
    dissector_add_string("media_type", "application/vnd.fdo.journal", sje_handle);
912
0
}
913
914
/*
915
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
916
 *
917
 * Local variables:
918
 * c-basic-offset: 4
919
 * tab-width: 8
920
 * indent-tabs-mode: nil
921
 * End:
922
 *
923
 * vi: set shiftwidth=4 tabstop=8 expandtab:
924
 * :indentSize=4:tabSize=8:noTabs=true:
925
 */