1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Copyright (c) 1998-2004 Hannes Gredler <hannes@tcpdump.org>
3*b636d99dSDavid van Moolenbroek * The TCPDUMP project
4*b636d99dSDavid van Moolenbroek *
5*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code
7*b636d99dSDavid van Moolenbroek * distributions retain the above copyright notice and this paragraph
8*b636d99dSDavid van Moolenbroek * in its entirety, and (2) distributions including binary code include
9*b636d99dSDavid van Moolenbroek * the above copyright notice and this paragraph in its entirety in
10*b636d99dSDavid van Moolenbroek * the documentation or other materials provided with the distribution.
11*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
12*b636d99dSDavid van Moolenbroek * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
13*b636d99dSDavid van Moolenbroek * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*b636d99dSDavid van Moolenbroek * FOR A PARTICULAR PURPOSE.
15*b636d99dSDavid van Moolenbroek */
16*b636d99dSDavid van Moolenbroek
17*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
18*b636d99dSDavid van Moolenbroek #ifndef lint
19*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-syslog.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
20*b636d99dSDavid van Moolenbroek #endif
21*b636d99dSDavid van Moolenbroek
22*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
23*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
24*b636d99dSDavid van Moolenbroek #include "config.h"
25*b636d99dSDavid van Moolenbroek #endif
26*b636d99dSDavid van Moolenbroek
27*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
28*b636d99dSDavid van Moolenbroek
29*b636d99dSDavid van Moolenbroek #include "interface.h"
30*b636d99dSDavid van Moolenbroek #include "extract.h"
31*b636d99dSDavid van Moolenbroek
32*b636d99dSDavid van Moolenbroek static const char tstr[] = "[|syslog]";
33*b636d99dSDavid van Moolenbroek
34*b636d99dSDavid van Moolenbroek /*
35*b636d99dSDavid van Moolenbroek * tokenlists and #defines taken from Ethereal - Network traffic analyzer
36*b636d99dSDavid van Moolenbroek * by Gerald Combs <gerald@ethereal.com>
37*b636d99dSDavid van Moolenbroek */
38*b636d99dSDavid van Moolenbroek
39*b636d99dSDavid van Moolenbroek #define SYSLOG_SEVERITY_MASK 0x0007 /* 0000 0000 0000 0111 */
40*b636d99dSDavid van Moolenbroek #define SYSLOG_FACILITY_MASK 0x03f8 /* 0000 0011 1111 1000 */
41*b636d99dSDavid van Moolenbroek #define SYSLOG_MAX_DIGITS 3 /* The maximum number if priority digits to read in. */
42*b636d99dSDavid van Moolenbroek
43*b636d99dSDavid van Moolenbroek static const struct tok syslog_severity_values[] = {
44*b636d99dSDavid van Moolenbroek { 0, "emergency" },
45*b636d99dSDavid van Moolenbroek { 1, "alert" },
46*b636d99dSDavid van Moolenbroek { 2, "critical" },
47*b636d99dSDavid van Moolenbroek { 3, "error" },
48*b636d99dSDavid van Moolenbroek { 4, "warning" },
49*b636d99dSDavid van Moolenbroek { 5, "notice" },
50*b636d99dSDavid van Moolenbroek { 6, "info" },
51*b636d99dSDavid van Moolenbroek { 7, "debug" },
52*b636d99dSDavid van Moolenbroek { 0, NULL },
53*b636d99dSDavid van Moolenbroek };
54*b636d99dSDavid van Moolenbroek
55*b636d99dSDavid van Moolenbroek static const struct tok syslog_facility_values[] = {
56*b636d99dSDavid van Moolenbroek { 0, "kernel" },
57*b636d99dSDavid van Moolenbroek { 1, "user" },
58*b636d99dSDavid van Moolenbroek { 2, "mail" },
59*b636d99dSDavid van Moolenbroek { 3, "daemon" },
60*b636d99dSDavid van Moolenbroek { 4, "auth" },
61*b636d99dSDavid van Moolenbroek { 5, "syslog" },
62*b636d99dSDavid van Moolenbroek { 6, "lpr" },
63*b636d99dSDavid van Moolenbroek { 7, "news" },
64*b636d99dSDavid van Moolenbroek { 8, "uucp" },
65*b636d99dSDavid van Moolenbroek { 9, "cron" },
66*b636d99dSDavid van Moolenbroek { 10, "authpriv" },
67*b636d99dSDavid van Moolenbroek { 11, "ftp" },
68*b636d99dSDavid van Moolenbroek { 12, "ntp" },
69*b636d99dSDavid van Moolenbroek { 13, "security" },
70*b636d99dSDavid van Moolenbroek { 14, "console" },
71*b636d99dSDavid van Moolenbroek { 15, "cron" },
72*b636d99dSDavid van Moolenbroek { 16, "local0" },
73*b636d99dSDavid van Moolenbroek { 17, "local1" },
74*b636d99dSDavid van Moolenbroek { 18, "local2" },
75*b636d99dSDavid van Moolenbroek { 19, "local3" },
76*b636d99dSDavid van Moolenbroek { 20, "local4" },
77*b636d99dSDavid van Moolenbroek { 21, "local5" },
78*b636d99dSDavid van Moolenbroek { 22, "local6" },
79*b636d99dSDavid van Moolenbroek { 23, "local7" },
80*b636d99dSDavid van Moolenbroek { 0, NULL },
81*b636d99dSDavid van Moolenbroek };
82*b636d99dSDavid van Moolenbroek
83*b636d99dSDavid van Moolenbroek void
syslog_print(netdissect_options * ndo,register const u_char * pptr,register u_int len)84*b636d99dSDavid van Moolenbroek syslog_print(netdissect_options *ndo,
85*b636d99dSDavid van Moolenbroek register const u_char *pptr, register u_int len)
86*b636d99dSDavid van Moolenbroek {
87*b636d99dSDavid van Moolenbroek uint16_t msg_off = 0;
88*b636d99dSDavid van Moolenbroek uint16_t pri = 0;
89*b636d99dSDavid van Moolenbroek uint16_t facility,severity;
90*b636d99dSDavid van Moolenbroek
91*b636d99dSDavid van Moolenbroek /* extract decimal figures that are
92*b636d99dSDavid van Moolenbroek * encapsulated within < > tags
93*b636d99dSDavid van Moolenbroek * based on this decimal figure extract the
94*b636d99dSDavid van Moolenbroek * severity and facility values
95*b636d99dSDavid van Moolenbroek */
96*b636d99dSDavid van Moolenbroek
97*b636d99dSDavid van Moolenbroek ND_TCHECK2(*pptr, 1);
98*b636d99dSDavid van Moolenbroek if (*(pptr+msg_off) == '<') {
99*b636d99dSDavid van Moolenbroek msg_off++;
100*b636d99dSDavid van Moolenbroek ND_TCHECK2(*(pptr + msg_off), 1);
101*b636d99dSDavid van Moolenbroek while ( *(pptr+msg_off) >= '0' &&
102*b636d99dSDavid van Moolenbroek *(pptr+msg_off) <= '9' &&
103*b636d99dSDavid van Moolenbroek msg_off <= SYSLOG_MAX_DIGITS) {
104*b636d99dSDavid van Moolenbroek pri = pri * 10 + (*(pptr+msg_off) - '0');
105*b636d99dSDavid van Moolenbroek msg_off++;
106*b636d99dSDavid van Moolenbroek ND_TCHECK2(*(pptr + msg_off), 1);
107*b636d99dSDavid van Moolenbroek }
108*b636d99dSDavid van Moolenbroek if (*(pptr+msg_off) != '>') {
109*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", tstr));
110*b636d99dSDavid van Moolenbroek return;
111*b636d99dSDavid van Moolenbroek }
112*b636d99dSDavid van Moolenbroek msg_off++;
113*b636d99dSDavid van Moolenbroek } else {
114*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", tstr));
115*b636d99dSDavid van Moolenbroek return;
116*b636d99dSDavid van Moolenbroek }
117*b636d99dSDavid van Moolenbroek
118*b636d99dSDavid van Moolenbroek facility = (pri & SYSLOG_FACILITY_MASK) >> 3;
119*b636d99dSDavid van Moolenbroek severity = pri & SYSLOG_SEVERITY_MASK;
120*b636d99dSDavid van Moolenbroek
121*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag < 1 )
122*b636d99dSDavid van Moolenbroek {
123*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "SYSLOG %s.%s, length: %u",
124*b636d99dSDavid van Moolenbroek tok2str(syslog_facility_values, "unknown (%u)", facility),
125*b636d99dSDavid van Moolenbroek tok2str(syslog_severity_values, "unknown (%u)", severity),
126*b636d99dSDavid van Moolenbroek len));
127*b636d99dSDavid van Moolenbroek return;
128*b636d99dSDavid van Moolenbroek }
129*b636d99dSDavid van Moolenbroek
130*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "SYSLOG, length: %u\n\tFacility %s (%u), Severity %s (%u)\n\tMsg: ",
131*b636d99dSDavid van Moolenbroek len,
132*b636d99dSDavid van Moolenbroek tok2str(syslog_facility_values, "unknown (%u)", facility),
133*b636d99dSDavid van Moolenbroek facility,
134*b636d99dSDavid van Moolenbroek tok2str(syslog_severity_values, "unknown (%u)", severity),
135*b636d99dSDavid van Moolenbroek severity));
136*b636d99dSDavid van Moolenbroek
137*b636d99dSDavid van Moolenbroek /* print the syslog text in verbose mode */
138*b636d99dSDavid van Moolenbroek for (; msg_off < len; msg_off++) {
139*b636d99dSDavid van Moolenbroek ND_TCHECK2(*(pptr + msg_off), 1);
140*b636d99dSDavid van Moolenbroek safeputchar(ndo, *(pptr + msg_off));
141*b636d99dSDavid van Moolenbroek }
142*b636d99dSDavid van Moolenbroek
143*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag > 1)
144*b636d99dSDavid van Moolenbroek print_unknown_data(ndo, pptr, "\n\t", len);
145*b636d99dSDavid van Moolenbroek
146*b636d99dSDavid van Moolenbroek return;
147*b636d99dSDavid van Moolenbroek
148*b636d99dSDavid van Moolenbroek trunc:
149*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "%s", tstr));
150*b636d99dSDavid van Moolenbroek }
151