diff --git a/CHANGES b/CHANGES index 48a48493df..25e7de274c 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,8 @@ DayOfTheWeek, Month DD, YYYY / The Tcpdump Group Finalize moving of bpf_filter.c. (GH #1166) Address a few compiler warnings on Haiku. struct pcap: Update buffer type from "void *" to "u_char *". + Add pcap_dump1 and pcap_dump_close1 functions that propagates + write errors to the caller. Link-layer types: Add LINKTYPE_ETW/DLT_ETW. Add LINKTYPE_NETANALYZER_NG/DLT_NETANALYZER_NG (pull request diff --git a/CMakeLists.txt b/CMakeLists.txt index 7090eced23..42ac615b89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3555,7 +3555,9 @@ if(NOT MSVC) install(FILES ${MAN3PCAP} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_datalink_val_to_name.3pcap pcap_datalink_val_to_description.3pcap ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_datalink_val_to_name.3pcap pcap_datalink_val_to_description_or_dlt.3pcap ${CMAKE_INSTALL_MANDIR}/man3) + install_manpage_symlink(pcap_dump_close.3pcap pcap_dump_close1.3pcap ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_dump_open.3pcap pcap_dump_fopen.3pcap ${CMAKE_INSTALL_MANDIR}/man3) + install_manpage_symlink(pcap_dump.3pcap pcap_dump1.3pcap ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_findalldevs.3pcap pcap_freealldevs.3pcap ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_geterr.3pcap pcap_perror.3pcap ${CMAKE_INSTALL_MANDIR}/man3) install_manpage_symlink(pcap_inject.3pcap pcap_sendpacket.3pcap ${CMAKE_INSTALL_MANDIR}/man3) diff --git a/Makefile.in b/Makefile.in index df26df32b6..7795999a9d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -627,8 +627,12 @@ install: install-shared install-archive libpcap.pc pcap-config @INSTALL_RPCAPD@ rm -f pcap_datalink_val_to_description_or_dlt.3pcap && \ $(LN_S) pcap_datalink_val_to_name.3pcap \ pcap_datalink_val_to_description_or_dlt.3pcap && \ + rm -f pcap_dump_close1.3pcap && \ + $(LN_S) pcap_dump_close.3pcap pcap_dump_close1.3pcap && \ rm -f pcap_dump_fopen.3pcap && \ $(LN_S) pcap_dump_open.3pcap pcap_dump_fopen.3pcap && \ + rm -f pcap_dump1.3pcap && \ + $(LN_S) pcap_dump.3pcap pcap_dump1.3pcap && \ rm -f pcap_freealldevs.3pcap && \ $(LN_S) pcap_findalldevs.3pcap pcap_freealldevs.3pcap && \ rm -f pcap_perror.3pcap && \ diff --git a/pcap/pcap.h b/pcap/pcap.h index 74cac40a0e..5dab8d6684 100644 --- a/pcap/pcap.h +++ b/pcap/pcap.h @@ -786,11 +786,18 @@ PCAP_AVAILABLE_0_8 PCAP_API int pcap_dump_flush(pcap_dumper_t *); PCAP_AVAILABLE_0_4 +PCAP_DEPRECATED("use 'pcap_dump_close1'") PCAP_API void pcap_dump_close(pcap_dumper_t *); +PCAP_AVAILABLE_1_11 +PCAP_API int pcap_dump_close1(pcap_dumper_t *); + PCAP_AVAILABLE_0_4 PCAP_API void pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *); +PCAP_AVAILABLE_1_11 +PCAP_API int pcap_dump1(u_char *, const struct pcap_pkthdr *, const u_char *); + PCAP_AVAILABLE_0_7 PCAP_API int pcap_findalldevs(pcap_if_t **, char *); diff --git a/pcap_dump.3pcap b/pcap_dump.3pcap index e38c96ce05..dd94306d19 100644 --- a/pcap_dump.3pcap +++ b/pcap_dump.3pcap @@ -19,7 +19,7 @@ .\" .TH PCAP_DUMP 3PCAP "8 March 2015" .SH NAME -pcap_dump \- write a packet to a capture file +pcap_dump, pcap_dump1 \- write a packet to a capture file .SH SYNOPSIS .nf .ft B @@ -29,6 +29,9 @@ pcap_dump \- write a packet to a capture file .ft B void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp); +.ti +8 +int pcap_dump1(u_char *user, struct pcap_pkthdr *h, + u_char *sp); .ft .fi .SH DESCRIPTION @@ -45,5 +48,11 @@ parameter is of type .B pcap_dumper_t as returned by .BR pcap_dump_open (). +.SH RETURN VALUE +Returns +.B 0 +on success and +.B PCAP_ERROR +on failure. .SH SEE ALSO .BR pcap (3PCAP) diff --git a/pcap_dump_close.3pcap b/pcap_dump_close.3pcap index a62eb34dbf..7569a6db9d 100644 --- a/pcap_dump_close.3pcap +++ b/pcap_dump_close.3pcap @@ -19,7 +19,7 @@ .\" .TH PCAP_DUMP_CLOSE 3PCAP "3 January 2014" .SH NAME -pcap_dump_close \- close a savefile being written to +pcap_dump_close, pcap_dump_close1 \- close a savefile being written to .SH SYNOPSIS .nf .ft B @@ -28,11 +28,18 @@ pcap_dump_close \- close a savefile being written to .LP .ft B void pcap_dump_close(pcap_dumper_t *p); +int pcap_dump_close1(pcap_dumper_t *p); .ft .fi .SH DESCRIPTION .BR pcap_dump_close () closes the ``savefile.'' +.SH RETURN VALUE +Returns +.B 0 +on success and +.B PCAP_ERROR +on failure. .SH SEE ALSO .BR pcap (3PCAP), .BR pcap_dump_open (3PCAP), diff --git a/sf-pcap.c b/sf-pcap.c index 2c31077323..d5fa37b495 100644 --- a/sf-pcap.c +++ b/sf-pcap.c @@ -744,6 +744,12 @@ sf_write_header(pcap_t *p, FILE *fp, int linktype, int snaplen) */ void pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) +{ + (void)pcap_dump1(user, h, sp); +} + +int +pcap_dump1(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) { register FILE *f; struct pcap_sf_pkthdr sf_hdr; @@ -766,7 +772,7 @@ pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) * http://pubs.opengroup.org/onlinepubs/009695399/functions/fwrite.html */ if (ferror(f)) - return; + return (-1); /* * Better not try writing pcap files after * 2038-01-19 03:14:07 UTC; switch to pcapng. @@ -783,9 +789,14 @@ pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) * way to set ferror() to prevent future writes from being * attempted, but it is better than nothing. */ - if (fwrite(&sf_hdr, sizeof(sf_hdr), 1, f) == 1) { - (void)fwrite(sp, h->caplen, 1, f); + if (fwrite(&sf_hdr, 1, sizeof(sf_hdr), f) != sizeof(sf_hdr)) { + return (-1); + } + if (fwrite(sp, 1, h->caplen, f) != h->caplen) { + return (-1); } + + return (0); } static pcap_dumper_t * @@ -1181,11 +1192,14 @@ pcap_dump_flush(pcap_dumper_t *p) void pcap_dump_close(pcap_dumper_t *p) { + (void)pcap_dump_close1(p); +} -#ifdef notyet - if (ferror((FILE *)p)) - return-an-error; - /* XXX should check return from fclose() too */ -#endif - (void)fclose((FILE *)p); +int +pcap_dump_close1(pcap_dumper_t *p) +{ + if (fclose((FILE *)p) == EOF) { + return (-1); + } + return (0); }