diff options
-rw-r--r-- | dumpcap.c | 41 | ||||
-rw-r--r-- | pcapio.c | 31 | ||||
-rw-r--r-- | pcapio.h | 12 | ||||
-rw-r--r-- | ringbuffer.c | 18 | ||||
-rw-r--r-- | ringbuffer.h | 5 |
5 files changed, 63 insertions, 44 deletions
@@ -213,6 +213,7 @@ typedef struct _loop_data { /* output file */ FILE *pdh; int linktype; + int file_snaplen; gint wtap_linktype; long bytes_written; @@ -1454,7 +1455,6 @@ capture_loop_init_filter(pcap_t *pcap_h, gboolean from_cap_pipe, gchar * iface, /* set up to write to the already-opened capture output file/files */ static gboolean capture_loop_init_output(capture_options *capture_opts, int save_file_fd, loop_data *ld, char *errmsg, int errmsg_len) { - int file_snaplen; int err; @@ -1462,19 +1462,25 @@ capture_loop_init_output(capture_options *capture_opts, int save_file_fd, loop_d /* get snaplen */ if (ld->from_cap_pipe) { - file_snaplen = ld->cap_pipe_hdr.snaplen; + ld->file_snaplen = ld->cap_pipe_hdr.snaplen; } else { - file_snaplen = pcap_snapshot(ld->pcap_h); + ld->file_snaplen = pcap_snapshot(ld->pcap_h); } /* Set up to write to the capture file. */ if (capture_opts->multi_files_on) { - ld->pdh = ringbuf_init_libpcap_fdopen(ld->linktype, file_snaplen, - &ld->bytes_written, &err); + ld->pdh = ringbuf_init_libpcap_fdopen(&err); } else { - ld->pdh = libpcap_fdopen(save_file_fd, ld->linktype, file_snaplen, - &ld->bytes_written, &err); + ld->pdh = libpcap_fdopen(save_file_fd, &err); + } + if (ld->pdh) { + ld->bytes_written = 0; + if (!libpcap_write_file_header(ld->pdh, ld->linktype, ld->file_snaplen, + &ld->bytes_written, &err)) { + fclose(ld->pdh); + ld->pdh = NULL; + } } if (ld->pdh == NULL) { @@ -1980,8 +1986,16 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct /* Switch to the next ringbuffer file */ if (ringbuf_switch_file(&global_ld.pdh, &capture_opts->save_file, - &save_file_fd, &global_ld.bytes_written, &global_ld.err)) { + &save_file_fd, &global_ld.err)) { /* File switch succeeded: reset the conditions */ + global_ld.bytes_written = 0; + if (!libpcap_write_file_header(global_ld.pdh, global_ld.linktype, global_ld.file_snaplen, + &global_ld.bytes_written, &global_ld.err)) { + fclose(global_ld.pdh); + global_ld.pdh = NULL; + global_ld.go = FALSE; + continue; + } cnd_reset(cnd_autostop_size); if (cnd_file_duration) { cnd_reset(cnd_file_duration); @@ -2053,9 +2067,16 @@ capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct /* Switch to the next ringbuffer file */ if (ringbuf_switch_file(&global_ld.pdh, &capture_opts->save_file, - &save_file_fd, &global_ld.bytes_written, - &global_ld.err)) { + &save_file_fd, &global_ld.err)) { /* file switch succeeded: reset the conditions */ + global_ld.bytes_written = 0; + if (!libpcap_write_file_header(global_ld.pdh, global_ld.linktype, global_ld.file_snaplen, + &global_ld.bytes_written, &global_ld.err)) { + fclose(global_ld.pdh); + global_ld.pdh = NULL; + global_ld.go = FALSE; + continue; + } cnd_reset(cnd_file_duration); if(cnd_autostop_size) cnd_reset(cnd_autostop_size); @@ -92,21 +92,27 @@ struct pcaprec_hdr { guint32 orig_len; /* actual length of packet */ }; -/* Returns a FILE * to write to on success, NULL on failure; sets "*err" to - an error code, or 0 for a short write, on failure */ +/* Returns a FILE * to write to on success, NULL on failure */ FILE * -libpcap_fdopen(int fd, int linktype, int snaplen, long *bytes_written, - int *err) +libpcap_fdopen(int fd, int *err) { FILE *fp; - struct pcap_hdr file_hdr; - size_t nwritten; fp = fdopen(fd, "wb"); if (fp == NULL) { *err = errno; - return NULL; } + return fp; +} + +/* Write the file header to a dump file. + Returns TRUE on success, FALSE on failure. + Sets "*err" to an error code, or 0 for a short write, on failure*/ +gboolean +libpcap_write_file_header(FILE *fp, int linktype, int snaplen, long *bytes_written, int *err) +{ + struct pcap_hdr file_hdr; + size_t nwritten; file_hdr.magic = PCAP_MAGIC; /* current "libpcap" format is 2.4 */ @@ -116,18 +122,17 @@ libpcap_fdopen(int fd, int linktype, int snaplen, long *bytes_written, file_hdr.sigfigs = 0; /* unknown, but also apparently unused */ file_hdr.snaplen = snaplen; file_hdr.network = linktype; - nwritten = fwrite(&file_hdr, 1, sizeof file_hdr, fp); - if (nwritten != sizeof file_hdr) { + nwritten = fwrite(&file_hdr, 1, sizeof(file_hdr), fp); + if (nwritten != sizeof(file_hdr)) { if (nwritten == 0 && ferror(fp)) *err = errno; else *err = 0; /* short write */ - fclose(fp); - return NULL; + return FALSE; } - *bytes_written = sizeof file_hdr; + *bytes_written += sizeof(file_hdr); - return fp; + return TRUE; } /* Write a record for a packet to a dump file. @@ -25,11 +25,15 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Returns a FILE * to write to on success, NULL on failure; sets "*err" to - an error code, or 0 for a short write, on failure */ +/* Returns a FILE * to write to on success, NULL on failure */ extern FILE * -libpcap_fdopen(int fd, int linktype, int snaplen, long *bytes_written, - int *err); +libpcap_fdopen(int fd, int *err); + +/* Write the file header to a dump file. + Returns TRUE on success, FALSE on failure. + Sets "*err" to an error code, or 0 for a short write, on failure*/ +extern gboolean +libpcap_write_file_header(FILE *fp, int linktype, int snaplen, long *bytes_written, int *err); /* Write a record for a packet to a dump file. Returns TRUE on success, FALSE on failure. */ diff --git a/ringbuffer.c b/ringbuffer.c index 1cced9a163..b32f03caf2 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -83,8 +83,6 @@ typedef struct _ringbuf_data { gchar *fprefix; /* Filename prefix */ gchar *fsuffix; /* Filename suffix */ gboolean unlimited; /* TRUE if unlimited number of files */ - int linktype; - int snaplen; int fd; /* Current ringbuffer file descriptor */ FILE *pdh; @@ -230,15 +228,9 @@ const gchar *ringbuf_current_filename(void) * Calls libpcap_fdopen() for the current ringbuffer file */ FILE * -ringbuf_init_libpcap_fdopen(int linktype, int snaplen, - long *bytes_written, int *err) +ringbuf_init_libpcap_fdopen(int *err) { - - rb_data.linktype = linktype; - rb_data.snaplen = snaplen; - - rb_data.pdh = libpcap_fdopen(rb_data.fd, linktype, snaplen, bytes_written, - err); + rb_data.pdh = libpcap_fdopen(rb_data.fd, err); return rb_data.pdh; } @@ -246,8 +238,7 @@ ringbuf_init_libpcap_fdopen(int linktype, int snaplen, * Switches to the next ringbuffer file */ gboolean -ringbuf_switch_file(FILE **pdh, gchar **save_file, int *save_file_fd, - long *bytes_written, int *err) +ringbuf_switch_file(FILE **pdh, gchar **save_file, int *save_file_fd, int *err) { int next_file_index; rb_file *next_rfile = NULL; @@ -274,8 +265,7 @@ ringbuf_switch_file(FILE **pdh, gchar **save_file, int *save_file_fd, return FALSE; } - if (ringbuf_init_libpcap_fdopen(rb_data.linktype, rb_data.snaplen, - bytes_written, err) == NULL) { + if (ringbuf_init_libpcap_fdopen(err) == NULL) { return FALSE; } diff --git a/ringbuffer.h b/ringbuffer.h index 9ecf237c76..a0c3cc6a8a 100644 --- a/ringbuffer.h +++ b/ringbuffer.h @@ -40,10 +40,9 @@ int ringbuf_init(const char *capture_name, guint num_files); const gchar *ringbuf_current_filename(void); -FILE *ringbuf_init_libpcap_fdopen(int linktype, int snaplen, - long *bytes_written, int *err); +FILE *ringbuf_init_libpcap_fdopen(int *err); gboolean ringbuf_switch_file(FILE **pdh, gchar **save_file, int *save_file_fd, - long *bytes_written, int *err); + int *err); gboolean ringbuf_libpcap_dump_close(gchar **save_file, int *err); void ringbuf_free(void); void ringbuf_error_cleanup(void); |