xref: /minix3/external/bsd/tcpdump/dist/print-syslog.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
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