@@ -895,6 +895,54 @@ get_next_file(FILE *VFile, char *ptr)
895895 return ret ;
896896}
897897
898+ static int
899+ open_pcap_file (const char * path , const netdissect_options * ndo )
900+ {
901+ int dlt ;
902+ const char * dlt_name ;
903+ char ebuf [PCAP_ERRBUF_SIZE ];
904+ static int sll_warning_printed = 0 ;
905+ #ifdef HAVE_CAPSICUM
906+ cap_rights_t rights ;
907+ #endif /* HAVE_CAPSICUM */
908+
909+ #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
910+ pd = pcap_open_offline_with_tstamp_precision (path ,
911+ ndo -> ndo_tstamp_precision , ebuf );
912+ #else
913+ pd = pcap_open_offline (path , ebuf );
914+ #endif
915+
916+ if (pd == NULL )
917+ error ("%s" , ebuf );
918+ #ifdef HAVE_CAPSICUM
919+ cap_rights_init (& rights , CAP_READ );
920+ if (cap_rights_limit (fileno (pcap_file (pd )), & rights ) < 0 &&
921+ errno != ENOSYS ) {
922+ error ("unable to limit pcap descriptor" );
923+ }
924+ #endif
925+ dlt = pcap_datalink (pd );
926+ dlt_name = pcap_datalink_val_to_name (dlt );
927+ fprintf (stderr , "reading from file %s" , path );
928+ if (dlt_name == NULL ) {
929+ fprintf (stderr , ", link-type %u" , dlt );
930+ } else {
931+ fprintf (stderr , ", link-type %s (%s)" , dlt_name ,
932+ pcap_datalink_val_to_description (dlt ));
933+ }
934+ fprintf (stderr , ", snapshot length %d\n" , pcap_snapshot (pd ));
935+ #ifdef DLT_LINUX_SLL2
936+ if (!sll_warning_printed && dlt == DLT_LINUX_SLL2 )
937+ {
938+ fprintf (stderr , "Warning: interface names might be incorrect\n" );
939+ sll_warning_printed = 1 ;
940+ }
941+ #endif
942+
943+ return dlt ;
944+ }
945+
898946#ifdef HAVE_CASPER
899947static cap_channel_t *
900948capdns_setup (void )
@@ -1476,7 +1524,6 @@ main(int argc, char **argv)
14761524 char * endp ;
14771525 pcap_handler callback ;
14781526 int dlt ;
1479- const char * dlt_name ;
14801527 struct bpf_program fcode ;
14811528#ifndef _WIN32
14821529 void (* oldhandler )(int );
@@ -2121,36 +2168,7 @@ main(int argc, char **argv)
21212168 RFileName = VFileLine ;
21222169 }
21232170
2124- #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
2125- pd = pcap_open_offline_with_tstamp_precision (RFileName ,
2126- ndo -> ndo_tstamp_precision , ebuf );
2127- #else
2128- pd = pcap_open_offline (RFileName , ebuf );
2129- #endif
2130-
2131- if (pd == NULL )
2132- error ("%s" , ebuf );
2133- #ifdef HAVE_CAPSICUM
2134- cap_rights_init (& rights , CAP_READ );
2135- if (cap_rights_limit (fileno (pcap_file (pd )), & rights ) < 0 &&
2136- errno != ENOSYS ) {
2137- error ("unable to limit pcap descriptor" );
2138- }
2139- #endif
2140- dlt = pcap_datalink (pd );
2141- dlt_name = pcap_datalink_val_to_name (dlt );
2142- fprintf (stderr , "reading from file %s" , RFileName );
2143- if (dlt_name == NULL ) {
2144- fprintf (stderr , ", link-type %u" , dlt );
2145- } else {
2146- fprintf (stderr , ", link-type %s (%s)" , dlt_name ,
2147- pcap_datalink_val_to_description (dlt ));
2148- }
2149- fprintf (stderr , ", snapshot length %d\n" , pcap_snapshot (pd ));
2150- #ifdef DLT_LINUX_SLL2
2151- if (dlt == DLT_LINUX_SLL2 )
2152- fprintf (stderr , "Warning: interface names might be incorrect\n" );
2153- #endif
2171+ dlt = open_pcap_file (RFileName , ndo );
21542172 } else if (dflag && !device ) {
21552173 int dump_dlt = DLT_EN10MB ;
21562174 /*
@@ -2604,6 +2622,8 @@ DIAG_ON_ASSIGN_ENUM
26042622 * to a file from the -V file). Print a message to
26052623 * the standard error on UN*X.
26062624 */
2625+ const char * dlt_name ;
2626+
26072627 if (!ndo -> ndo_vflag && !WFileName ) {
26082628 (void )fprintf (stderr ,
26092629 "%s: verbose output suppressed, use -v[v]... for full protocol decode\n" ,
@@ -2683,17 +2703,7 @@ DIAG_ON_ASSIGN_ENUM
26832703 int new_dlt ;
26842704
26852705 RFileName = VFileLine ;
2686- pd = pcap_open_offline (RFileName , ebuf );
2687- if (pd == NULL )
2688- error ("%s" , ebuf );
2689- #ifdef HAVE_CAPSICUM
2690- cap_rights_init (& rights , CAP_READ );
2691- if (cap_rights_limit (fileno (pcap_file (pd )),
2692- & rights ) < 0 && errno != ENOSYS ) {
2693- error ("unable to limit pcap descriptor" );
2694- }
2695- #endif
2696- new_dlt = pcap_datalink (pd );
2706+ new_dlt = open_pcap_file (RFileName , ndo );
26972707 if (new_dlt != dlt ) {
26982708 /*
26992709 * The new file has a different
@@ -2735,20 +2745,6 @@ DIAG_ON_ASSIGN_ENUM
27352745 */
27362746 if (pcap_setfilter (pd , & fcode ) < 0 )
27372747 error ("%s" , pcap_geterr (pd ));
2738-
2739- /*
2740- * Report the new file.
2741- */
2742- dlt_name = pcap_datalink_val_to_name (dlt );
2743- fprintf (stderr , "reading from file %s" , RFileName );
2744- if (dlt_name == NULL ) {
2745- fprintf (stderr , ", link-type %u" , dlt );
2746- } else {
2747- fprintf (stderr , ", link-type %s (%s)" ,
2748- dlt_name ,
2749- pcap_datalink_val_to_description (dlt ));
2750- }
2751- fprintf (stderr , ", snapshot length %d\n" , pcap_snapshot (pd ));
27522748 }
27532749 }
27542750 }
0 commit comments