suricata
util-print.c
Go to the documentation of this file.
1 /* Copyright (C) 2007-2010 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  *
23  * Print utility functions
24  */
25 
26 #include "suricata-common.h"
27 #include "util-print.h"
28 #include "util-error.h"
29 #include "util-debug.h"
30 #include "util-validate.h"
31 #include "rust.h"
32 
33 /**
34  * \brief print a buffer as hex on a single line
35  *
36  * Prints in the format "00 AA BB"
37  *
38  * \param nbuf buffer into which the output is written
39  * \param offset of where to start writting into the buffer
40  * \param max_size the size of the output buffer
41  * \param buf buffer to print from
42  * \param buflen length of the input buffer
43  */
44 void PrintBufferRawLineHex(char *nbuf, int *offset, int max_size, const uint8_t *buf, uint32_t buflen)
45 {
46  uint32_t u = 0;
47 
48  for (u = 0; u < buflen; u++) {
49  PrintBufferData(nbuf, offset, max_size, "%02X ", buf[u]);
50  }
51 }
52 
53 /**
54  * \brief print a buffer as hex on a single line in to retbuf buffer
55  *
56  * Prints in the format "00 AA BB"
57  *
58  * \param retbuf pointer to the buffer which will have the result
59  * \param rebuflen length of the buffer
60  * \param buf buffer to print from
61  * \param buflen length of the input buffer
62  */
63 void PrintRawLineHexBuf(char *retbuf, uint32_t retbuflen, const uint8_t *buf, uint32_t buflen)
64 {
65  uint32_t offset = 0;
66  uint32_t u = 0;
67 
68  for (u = 0; u < buflen; u++) {
69  PrintBufferData(retbuf, &offset, retbuflen, "%02X ", buf[u]);
70  }
71 }
72 
73 void PrintRawJsonFp(FILE *fp, uint8_t *buf, uint32_t buflen)
74 {
75 #define BUFFER_LENGTH 2048
76  char nbuf[BUFFER_LENGTH] = "";
77  uint32_t offset = 0;
78  uint32_t u = 0;
79 
80  for (u = 0; u < buflen; u++) {
81  if (buf[u] == '\\' || buf[u] == '/' || buf[u] == '\"') {
83  "\\%c", buf[u]);
84  } else if (isprint(buf[u])) {
86  "%c", buf[u]);
87  } else {
89  "\\\\x%02X", buf[u]);
90  }
91  }
92  fprintf(fp, "%s", nbuf);
93 }
94 
95 void PrintRawUriFp(FILE *fp, uint8_t *buf, uint32_t buflen)
96 {
97 #define BUFFER_LENGTH 2048
98  char nbuf[BUFFER_LENGTH] = "";
99  uint32_t offset = 0;
100  uint32_t u = 0;
101 
102  for (u = 0; u < buflen; u++) {
103  if (isprint(buf[u]) && buf[u] != '\"') {
104  if (buf[u] == '\\') {
106  "\\\\");
107  } else {
109  "%c", buf[u]);
110  }
111  } else {
113  "\\x%02X", buf[u]);
114  }
115  }
116 
117  fprintf(fp, "%s", nbuf);
118 }
119 
120 void PrintRawUriBuf(char *retbuf, uint32_t *offset, uint32_t retbuflen,
121  uint8_t *buf, uint32_t buflen)
122 {
123  uint32_t u = 0;
124 
125  for (u = 0; u < buflen; u++) {
126  if (isprint(buf[u]) && buf[u] != '\"') {
127  if (buf[u] == '\\') {
128  PrintBufferData(retbuf, offset, retbuflen,
129  "\\\\");
130  } else {
131  PrintBufferData(retbuf, offset, retbuflen,
132  "%c", buf[u]);
133  }
134  } else {
135  PrintBufferData(retbuf, offset, retbuflen,
136  "\\x%02X", buf[u]);
137  }
138  }
139 
140  return;
141 }
142 
143 void PrintRawDataFp(FILE *fp, const uint8_t *buf, uint32_t buflen)
144 {
145  int ch = 0;
146  uint32_t u = 0;
147 
148  if (buf == NULL) {
149  fprintf(fp, " (null)\n");
150  return;
151  }
152  for (u = 0; u < buflen; u+=16) {
153  fprintf(fp ," %04X ", u);
154  for (ch = 0; (u+ch) < buflen && ch < 16; ch++) {
155  fprintf(fp, "%02X ", (uint8_t)buf[u+ch]);
156 
157  if (ch == 7) fprintf(fp, " ");
158  }
159  if (ch == 16) fprintf(fp, " ");
160  else if (ch < 8) {
161  int spaces = (16 - ch) * 3 + 2 + 1;
162  int s = 0;
163  for ( ; s < spaces; s++) fprintf(fp, " ");
164  } else if(ch < 16) {
165  int spaces = (16 - ch) * 3 + 2;
166  int s = 0;
167  for ( ; s < spaces; s++) fprintf(fp, " ");
168  }
169 
170  for (ch = 0; (u+ch) < buflen && ch < 16; ch++) {
171  fprintf(fp, "%c", isprint((uint8_t)buf[u+ch]) ? (uint8_t)buf[u+ch] : '.');
172 
173  if (ch == 7) fprintf(fp, " ");
174  if (ch == 15) fprintf(fp, "\n");
175  }
176  }
177  if (ch != 16)
178  fprintf(fp, "\n");
179 }
180 
181 void PrintRawDataToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size,
182  const uint8_t *src_buf, uint32_t src_buf_len)
183 {
184  int ch = 0;
185  uint32_t u = 0;
186 
187  for (u = 0; u < src_buf_len; u+=16) {
188  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
189  " %04X ", u);
190  for (ch = 0; (u + ch) < src_buf_len && ch < 16; ch++) {
191  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
192  "%02X ", (uint8_t)src_buf[u + ch]);
193 
194  if (ch == 7) {
195  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
196  " ");
197  }
198  }
199  if (ch == 16) {
200  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, " ");
201  } else if (ch < 8) {
202  int spaces = (16 - ch) * 3 + 2 + 1;
203  int s = 0;
204  for ( ; s < spaces; s++)
205  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, " ");
206  } else if(ch < 16) {
207  int spaces = (16 - ch) * 3 + 2;
208  int s = 0;
209  for ( ; s < spaces; s++)
210  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, " ");
211  }
212 
213  for (ch = 0; (u+ch) < src_buf_len && ch < 16; ch++) {
214  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
215  "%c",
216  isprint((uint8_t)src_buf[u + ch]) ? (uint8_t)src_buf[u + ch] : '.');
217 
218  if (ch == 7)
219  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, " ");
220  if (ch == 15)
221  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, "\n");
222  }
223  }
224  if (ch != 16)
225  PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size, "\n");
226 
227  return;
228 }
229 
230 void PrintStringsToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size,
231  const uint8_t *src_buf, const uint32_t src_buf_len)
232 {
233  uint32_t ch = 0;
234  for (ch = 0; ch < src_buf_len && *dst_buf_offset_ptr < dst_buf_size;
235  ch++, (*dst_buf_offset_ptr)++) {
236  if (isprint((uint8_t)src_buf[ch]) || src_buf[ch] == '\n' || src_buf[ch] == '\r') {
237  dst_buf[*dst_buf_offset_ptr] = src_buf[ch];
238  } else {
239  dst_buf[*dst_buf_offset_ptr] = '.';
240  }
241  }
242  dst_buf[dst_buf_size - 1] = 0;
243 
244  return;
245 }
246 
247 #ifndef s6_addr16
248 # define s6_addr16 __u6_addr.__u6_addr16
249 #endif
250 
251 static const char *PrintInetIPv6(const void *src, char *dst, socklen_t size)
252 {
253  int i;
254  char s_part[6];
255  uint16_t x[8];
256  memcpy(&x, src, 16);
257 
258  /* current IPv6 format is fixed size */
259  if (size < 8 * 5) {
260  SCLogWarning(SC_ERR_ARG_LEN_LONG, "Too small buffer to write IPv6 address");
261  return NULL;
262  }
263  memset(dst, 0, size);
264  for(i = 0; i < 8; i++) {
265  snprintf(s_part, sizeof(s_part), "%04x:", htons(x[i]));
266  strlcat(dst, s_part, size);
267  }
268  /* suppress last ':' */
269  dst[strlen(dst) - 1] = 0;
270 
271  return dst;
272 }
273 
274 const char *PrintInet(int af, const void *src, char *dst, socklen_t size)
275 {
276  switch (af) {
277  case AF_INET:
278 #if defined(OS_WIN32) && NTDDI_VERSION >= NTDDI_VISTA
279 {
280  // because Windows has to provide a non-conformant inet_ntop, of
281  // course!
282  struct in_addr _src;
283  memcpy(&_src, src, sizeof(struct in_addr));
284  return inet_ntop(af, &_src, dst, size);
285 }
286 #else
287  return inet_ntop(af, src, dst, size);
288 #endif
289  case AF_INET6:
290  /* Format IPv6 without deleting zeroes */
291  return PrintInetIPv6(src, dst, size);
292  default:
293  SCLogError(SC_ERR_INVALID_VALUE, "Unsupported protocol: %d", af);
294  }
295  return NULL;
296 }
297 
298 void PrintHexString(char *str, size_t size, uint8_t *buf, size_t buf_len)
299 {
300  DEBUG_VALIDATE_BUG_ON(size < 2 * buf_len);
301  rs_to_hex((uint8_t *)str, size, buf, buf_len);
302 }
BUFFER_LENGTH
#define BUFFER_LENGTH
offset
uint64_t offset
Definition: util-streaming-buffer.h:0
SC_ERR_INVALID_VALUE
@ SC_ERR_INVALID_VALUE
Definition: util-error.h:160
PrintHexString
void PrintHexString(char *str, size_t size, uint8_t *buf, size_t buf_len)
Definition: util-print.c:298
rust.h
PrintStringsToBuffer
void PrintStringsToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size, const uint8_t *src_buf, const uint32_t src_buf_len)
Definition: util-print.c:230
util-debug.h
util-error.h
PrintRawDataToBuffer
void PrintRawDataToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size, const uint8_t *src_buf, uint32_t src_buf_len)
Definition: util-print.c:181
PrintBufferRawLineHex
void PrintBufferRawLineHex(char *nbuf, int *offset, int max_size, const uint8_t *buf, uint32_t buflen)
print a buffer as hex on a single line
Definition: util-print.c:44
strlcat
size_t strlcat(char *, const char *src, size_t siz)
Definition: util-strlcatu.c:45
util-print.h
PrintInet
const char * PrintInet(int af, const void *src, char *dst, socklen_t size)
Definition: util-print.c:274
PrintRawDataFp
void PrintRawDataFp(FILE *fp, const uint8_t *buf, uint32_t buflen)
Definition: util-print.c:143
PrintBufferData
#define PrintBufferData(buf, buf_offset_ptr, buf_size,...)
Definition: util-print.h:29
suricata-common.h
SCLogError
#define SCLogError(err_code,...)
Macro used to log ERROR messages.
Definition: util-debug.h:255
util-validate.h
PrintRawUriFp
void PrintRawUriFp(FILE *fp, uint8_t *buf, uint32_t buflen)
Definition: util-print.c:95
str
#define str(s)
Definition: suricata-common.h:272
SCLogWarning
#define SCLogWarning(err_code,...)
Macro used to log WARNING messages.
Definition: util-debug.h:242
src
uint16_t src
Definition: app-layer-dnp3.h:5
PrintRawJsonFp
void PrintRawJsonFp(FILE *fp, uint8_t *buf, uint32_t buflen)
Definition: util-print.c:73
PrintRawUriBuf
void PrintRawUriBuf(char *retbuf, uint32_t *offset, uint32_t retbuflen, uint8_t *buf, uint32_t buflen)
Definition: util-print.c:120
af
uint16_t af
Definition: decode-gre.h:0
SC_ERR_ARG_LEN_LONG
@ SC_ERR_ARG_LEN_LONG
Definition: util-error.h:93
dst
uint16_t dst
Definition: app-layer-dnp3.h:4
DEBUG_VALIDATE_BUG_ON
#define DEBUG_VALIDATE_BUG_ON(exp)
Definition: util-validate.h:111
PrintRawLineHexBuf
void PrintRawLineHexBuf(char *retbuf, uint32_t retbuflen, const uint8_t *buf, uint32_t buflen)
print a buffer as hex on a single line in to retbuf buffer
Definition: util-print.c:63