]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Add SIGINFO handler from LBL
[tcpdump] / tcpdump.c
index 2a2c106cb43daa652a1b72e970b6749b17904ba5..1ec0a0ff7b0278713b87af6f5c59858f43d447eb 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
  *     The Regents of the University of California.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 #ifndef lint
 static const char copyright[] =
-    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997\n\
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.163 2001-06-18 08:52:54 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.166 2001-07-04 22:03:13 fenner Exp $ (LBL)";
 #endif
 
 /*
@@ -81,6 +81,8 @@ char *espsecret = NULL;               /* ESP secret key */
 
 int packettype;
 
+int infodelay;
+int infoprint;
 
 char *program_name;
 
@@ -89,6 +91,9 @@ int32_t thiszone;             /* seconds offset from gmt to local time */
 /* Forwards */
 static RETSIGTYPE cleanup(int);
 static void usage(void) __attribute__((noreturn));
+#ifdef SIGINFO
+RETSIGTYPE requestinfo(int);
+#endif
 
 /* Length of saved portion of packet. */
 int snaplen = DEFAULT_SNAPLEN;
@@ -131,6 +136,9 @@ static struct printer printers[] = {
 #ifdef DLT_PPP_SERIAL
        { ppp_hdlc_if_print,    DLT_PPP_SERIAL },
 #endif
+#ifdef DLT_PPP_ETHER
+       { pppoe_if_print,       DLT_PPP_ETHER },
+#endif
 #ifdef DLT_LINUX_SLL
        { sll_if_print,         DLT_LINUX_SLL },
 #endif
@@ -433,6 +441,9 @@ main(int argc, char **argv)
        } else {
                printer = lookup_printer(pcap_datalink(pd));
                pcap_userdata = 0;
+#ifdef SIGINFO
+               (void)setsignal(SIGINFO, requestinfo);
+#endif
        }
        if (RFileName == NULL) {
                (void)fprintf(stderr, "%s: listening on %s\n",
@@ -452,25 +463,36 @@ main(int argc, char **argv)
 static RETSIGTYPE
 cleanup(int signo)
 {
-       struct pcap_stat stat;
 
        /* Can't print the summary if reading from a savefile */
        if (pd != NULL && pcap_file(pd) == NULL) {
                (void)fflush(stdout);
                putc('\n', stderr);
-               if (pcap_stats(pd, &stat) < 0)
-                       (void)fprintf(stderr, "pcap_stats: %s\n",
-                           pcap_geterr(pd));
-               else {
-                       (void)fprintf(stderr, "%d packets received by filter\n",
-                           stat.ps_recv);
-                       (void)fprintf(stderr, "%d packets dropped by kernel\n",
-                           stat.ps_drop);
-               }
+               info(1);
        }
        exit(0);
 }
 
+void
+info(register int verbose)
+{
+       struct pcap_stat stat;
+
+       if (pcap_stats(pd, &stat) < 0) {
+               (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
+               return;
+       }
+       if (!verbose)
+               fprintf(stderr, "%s: ", program_name);
+       (void)fprintf(stderr, "%d packets received by filter", stat.ps_recv);
+       if (!verbose)
+               fputs(", ", stderr);
+       else
+               putc('\n', stderr);
+       (void)fprintf(stderr, "%d packets dropped by kernel\n", stat.ps_drop);
+       infoprint = 0;
+}
+
 /* Like default_print() but data need not be aligned */
 void
 default_print_unaligned(register const u_char *cp, register u_int length)
@@ -506,6 +528,16 @@ default_print(register const u_char *bp, register u_int length)
        default_print_unaligned(bp, length);
 }
 
+#ifdef SIGINFO
+RETSIGTYPE requestinfo(int signo)
+{
+       if (infodelay)
+               ++infoprint;
+       else
+               info(0);
+}
+#endif
+
 static void
 usage(void)
 {
@@ -520,5 +552,5 @@ usage(void)
 "\t\t[ -i interface ] [ -r file ] [ -s snaplen ]\n");
        (void)fprintf(stderr,
 "\t\t[ -T type ] [ -w file ] [ expression ]\n");
-       exit(-1);
+       exit(1);
 }