static void print_datalinks(const char *dev) { int *linktypes; int err, i, nlinktypes; char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; handle = pcap_create(dev, errbuf); if(!handle) return; err = pcap_activate(handle); if(err) return; nlinktypes = pcap_list_datalinks(handle, &linktypes); if(nlinktypes > 0) printf(" Linktypes:%s", options.verbose > 1 ? "\n" : " "); if(options.verbose > 1) for(i = 0; i < nlinktypes; ++i) printf(" %-20s %s\n" , pcap_datalink_val_to_name(linktypes[i]) , pcap_datalink_val_to_description(linktypes[i])); else for(i = 0; i < nlinktypes; ++i) printf("%s%s", pcap_datalink_val_to_name(linktypes[i]) , i + 1 > nlinktypes ? ", " : "\n"); pcap_free_datalinks(linktypes); pcap_close(handle); }
static void show_dlts_and_exit(pcap_t *pd) { int n_dlts; int *dlts = 0; const char *dlt_name; n_dlts = pcap_list_datalinks(pd, &dlts); if (n_dlts < 0) error("%s", pcap_geterr(pd)); else if (n_dlts == 0 || !dlts) error("No data link types."); (void) fprintf(stderr, "Data link types (use option -y to set):\n"); while (--n_dlts >= 0) { dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]); if (dlt_name != NULL) { (void) fprintf(stderr, " %s (%s)", dlt_name, pcap_datalink_val_to_description(dlts[n_dlts])); /* * OK, does tcpdump handle that type? */ if (lookup_printer(dlts[n_dlts]) == NULL) (void) fprintf(stderr, " (not supported)"); putchar('\n'); } else { (void) fprintf(stderr, " DLT %d (not supported)\n", dlts[n_dlts]); } } free(dlts); exit(0); }
static void show_dlts_and_exit(const char *device, pcap_t *pd) { int n_dlts; int *dlts = 0; const char *dlt_name; n_dlts = pcap_list_datalinks(pd, &dlts); if (n_dlts < 0) error("%s", pcap_geterr(pd)); else if (n_dlts == 0 || !dlts) error("No data link types."); /* * If the interface is known to support monitor mode, indicate * whether these are the data link types available when not in * monitor mode, if -I wasn't specified, or when in monitor mode, * when -I was specified (the link-layer types available in * monitor mode might be different from the ones available when * not in monitor mode). */ if (supports_monitor_mode) (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n", device, Iflag ? "when in monitor mode" : "when not in monitor mode"); else (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n", device); while (--n_dlts >= 0) { dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]); if (dlt_name != NULL) { (void) fprintf(stderr, " %s (%s)", dlt_name, pcap_datalink_val_to_description(dlts[n_dlts])); /* * OK, does tcpdump handle that type? */ if (lookup_printer(dlts[n_dlts]) == NULL && lookup_ndo_printer(dlts[n_dlts]) == NULL) (void) fprintf(stderr, " (printing not supported)"); putchar('\n'); } else { (void) fprintf(stderr, " DLT %d (printing not supported)\n", dlts[n_dlts]); } } free(dlts); exit(0); }