42 #if (defined (__SVR4) && defined (__sun))
43 extern int vasprintf(
char **,
const char *, __va_list);
47 #define CORSARO_FILE_ASCII_CHECK "# CORSARO"
50 #define CORSARO_FILE_TRACE_FORMAT "pcapfile:"
85 size_t flen, rlen, len;
90 corsaro_log(__func__, corsaro,
"could not malloc new corsaro_file_t");
100 flen = strlen(CORSARO_FILE_TRACE_FORMAT);
101 rlen = strlen(filename);
103 if((ptr = traceuri = malloc(len)) == NULL)
105 corsaro_log(__func__, corsaro,
"could not malloc traceuri");
108 strncpy(traceuri, CORSARO_FILE_TRACE_FORMAT, flen);
110 strncpy(ptr, filename, rlen);
111 traceuri[len-1] =
'\0';
112 f->trace_io = trace_create_output(traceuri);
115 if (trace_is_err_output(f->trace_io))
117 corsaro_log(__func__, corsaro,
"trace_create_output failed for %s",
121 if(trace_config_output(f->trace_io, TRACE_OPTION_OUTPUT_COMPRESS,
123 trace_config_output(f->trace_io, TRACE_OPTION_OUTPUT_COMPRESSTYPE,
124 &compress_type) != 0)
126 corsaro_log(__func__, corsaro,
127 "could not set compression levels for trace");
130 if (trace_start_output(f->trace_io) == -1) {
131 corsaro_log(__func__, corsaro,
"trace_start_output failed for %s",
140 if((f->wand_io = wandio_wcreate(filename, compress_type,
141 compress_level, flags)) == NULL)
143 corsaro_log(__func__, corsaro,
"wandio could not create file %s",
151 corsaro_log(__func__, corsaro,
"invalid file mode %d", mode);
165 assert(file->wand_io != NULL);
167 return wandio_wwrite(file->wand_io, buffer, len);
173 uint8_t *pkt_buf = NULL;
174 libtrace_linktype_t linktype;
179 assert(file->wand_io != NULL);
180 #ifdef HAVE_LIBPACKETDUMP
181 corsaro_log(__func__, corsaro,
182 "libpacketdump currently does not support dumping "
186 corsaro_log(__func__, corsaro,
187 "corsaro must be built with libpacketdump to dump "
188 "a packet to ASCII");
194 assert(file->wand_io != NULL);
195 if((pkt_buf = trace_get_packet_buffer(packet,
196 &linktype, NULL)) == NULL)
198 corsaro_log(__func__, corsaro,
"could not get packet buffer");
201 return corsaro_file_write(corsaro, file, pkt_buf,
202 trace_get_capture_length(packet));
205 assert(file->trace_io != NULL);
206 return trace_write_packet(file->trace_io, packet);
209 corsaro_log(__func__, corsaro,
"invalid corsaro file mode %d", file->
mode);
216 static size_t wiovprintf(iow_t *io,
const char *fmt, va_list args)
222 if ((ret = vasprintf(&buf, fmt, args)) < 0)
225 len = len == (unsigned)len ? (
size_t)wandio_wwrite(io, buf,
232 const char *format, va_list args)
237 assert(file->wand_io != NULL);
239 return wiovprintf(file->wand_io, format, args);
248 va_start(ap, format);
249 return corsaro_file_vprintf(corsaro, file, format, ap);
266 if(file->wand_io != NULL)
268 wandio_wdestroy(file->wand_io);
269 file->wand_io = NULL;
272 file->trace_io = NULL;
276 if(file->trace_io != NULL)
278 trace_destroy_output(file->trace_io);
279 file->trace_io = NULL;
282 file->wand_io = NULL;
286 corsaro_log(__func__, corsaro,
"corsaro_file_t freed more than once?");
287 corsaro_log(__func__, corsaro,
"the file mode was %d", file->
mode);
303 corsaro_log_in(__func__, corsaro,
"could not malloc new corsaro_file_in_t");
310 if(strchr(filename,
':') != NULL)
315 f->trace_io = trace_create(filename);
317 if(trace_is_err(f->trace_io))
319 corsaro_log_in(__func__, corsaro,
"trace_create failed for %s", filename);
324 if (trace_start(f->trace_io) == -1) {
325 corsaro_log_in(__func__, corsaro,
"trace_start failed for %s", filename);
335 if((f->wand_io = wandio_create(filename)) == NULL)
337 corsaro_log_in(__func__, corsaro,
"wandio could not open file %s",
343 len = wandio_peek(f->wand_io, buffer,
sizeof(buffer));
346 if(len >= strlen(CORSARO_FILE_ASCII_CHECK) &&
347 memcmp(CORSARO_FILE_ASCII_CHECK, buffer,
348 strlen(CORSARO_FILE_ASCII_CHECK)) == 0)
355 else if(len >= 4 && buffer[0] ==
'E' && buffer[1] ==
'D' &&
356 buffer[2] ==
'G' && buffer[3] ==
'R')
363 corsaro_log_in(__func__, corsaro,
364 "could not determine the file type for %s",
366 corsaro_log_in(__func__, corsaro,
367 "if this is a libtrace file, make sure you have "
368 "specified the uri properly (with a ':')");
383 assert(file->wand_io != NULL);
385 return wandio_read(file->wand_io, buffer, len);
392 assert(file != NULL);
395 assert(file->wand_io != NULL);
402 if(buffer == NULL || len <= 0)
407 for(i=0; !done && i < len-1; i++)
409 if((rval = wandio_read(file->wand_io, &cbuf, 1)) < 0)
420 ((
char*)buffer)[i] = cbuf;
428 ((
char*)buffer)[i] =
'\0';
434 libtrace_packet_t *packet,
442 if((pktbuf = malloc(len)) == NULL)
444 fprintf(stderr,
"could not malloc the packet buffer\n");
447 if(wandio_read(file->wand_io, pktbuf, len) != len)
449 fprintf(stderr,
"could not read packet into buffer\n");
452 trace_construct_packet(packet, TRACE_TYPE_ETH,
458 return trace_read_packet(file->trace_io, packet);
477 assert(file->wand_io != NULL);
479 return wandio_peek(file->wand_io, buffer, len);
488 assert(file->wand_io != NULL);
490 return wandio_seek(file->wand_io, offset, whence);
498 assert(file->wand_io != NULL);
500 return wandio_tell(file->wand_io);
510 if(file->wand_io != NULL)
512 wandio_destroy(file->wand_io);
513 file->wand_io = NULL;
516 file->trace_io = NULL;
520 if(file->trace_io != NULL)
522 trace_destroy(file->trace_io);
523 file->trace_io = NULL;
526 file->wand_io = NULL;
529 corsaro_log_in(__func__, corsaro,
"corsaro_file_in_t freed more than once?");