📄 pcap.c
字号:
(u_char)'\254', (u_char)'\255', (u_char)'\256', (u_char)'\257', (u_char)'\260', (u_char)'\261', (u_char)'\262', (u_char)'\263', (u_char)'\264', (u_char)'\265', (u_char)'\266', (u_char)'\267', (u_char)'\270', (u_char)'\271', (u_char)'\272', (u_char)'\273', (u_char)'\274', (u_char)'\275', (u_char)'\276', (u_char)'\277', (u_char)'\300', (u_char)'\341', (u_char)'\342', (u_char)'\343', (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347', (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353', (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357', (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363', (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367', (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\333', (u_char)'\334', (u_char)'\335', (u_char)'\336', (u_char)'\337', (u_char)'\340', (u_char)'\341', (u_char)'\342', (u_char)'\343', (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347', (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353', (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357', (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363', (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367', (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\373', (u_char)'\374', (u_char)'\375', (u_char)'\376', (u_char)'\377',};intpcap_strcasecmp(const char *s1, const char *s2){ register const u_char *cm = charmap, *us1 = (u_char *)s1, *us2 = (u_char *)s2; while (cm[*us1] == cm[*us2++]) if (*us1++ == '\0') return(0); return (cm[*us1] - cm[*--us2]);}intpcap_datalink_name_to_val(const char *name){ int i; for (i = 0; dlt_choices[i].name != NULL; i++) { if (pcap_strcasecmp(dlt_choices[i].name + sizeof("DLT_") - 1, name) == 0) return (dlt_choices[i].dlt); } return (-1);}const char *pcap_datalink_val_to_name(int dlt){ int i; for (i = 0; dlt_choices[i].name != NULL; i++) { if (dlt_choices[i].dlt == dlt) return (dlt_choices[i].name + sizeof("DLT_") - 1); } return (NULL);}const char *pcap_datalink_val_to_description(int dlt){ int i; for (i = 0; dlt_choices[i].name != NULL; i++) { if (dlt_choices[i].dlt == dlt) return (dlt_choices[i].description); } return (NULL);}intpcap_snapshot(pcap_t *p){ return (p->snapshot);}intpcap_is_swapped(pcap_t *p){ return (p->sf.swapped);}intpcap_major_version(pcap_t *p){ return (p->sf.version_major);}intpcap_minor_version(pcap_t *p){ return (p->sf.version_minor);}FILE *pcap_file(pcap_t *p){ return (p->sf.rfile);}intpcap_fileno(pcap_t *p){#ifndef WIN32 return (p->fd);#else if (p->adapter != NULL) return ((int)(DWORD)p->adapter->hFile); else return (-1);#endif}#ifndef WIN32intpcap_get_selectable_fd(pcap_t *p){ return (p->selectable_fd);}#endifvoidpcap_perror(pcap_t *p, char *prefix){ fprintf(stderr, "%s: %s\n", prefix, p->errbuf);}char *pcap_geterr(pcap_t *p){ return (p->errbuf);}intpcap_getnonblock(pcap_t *p, char *errbuf){ return p->getnonblock_op(p, errbuf);}/* * Get the current non-blocking mode setting, under the assumption that * it's just the standard POSIX non-blocking flag. * * We don't look at "p->nonblock", in case somebody tweaked the FD * directly. */#ifndef WIN32intpcap_getnonblock_fd(pcap_t *p, char *errbuf){ int fdflags; fdflags = fcntl(p->fd, F_GETFL, 0); if (fdflags == -1) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s", pcap_strerror(errno)); return (-1); } if (fdflags & O_NONBLOCK) return (1); else return (0);}#endifintpcap_setnonblock(pcap_t *p, int nonblock, char *errbuf){ return p->setnonblock_op(p, nonblock, errbuf);}#ifndef WIN32/* * Set non-blocking mode, under the assumption that it's just the * standard POSIX non-blocking flag. (This can be called by the * per-platform non-blocking-mode routine if that routine also * needs to do some additional work.) */intpcap_setnonblock_fd(pcap_t *p, int nonblock, char *errbuf){ int fdflags; fdflags = fcntl(p->fd, F_GETFL, 0); if (fdflags == -1) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s", pcap_strerror(errno)); return (-1); } if (nonblock) fdflags |= O_NONBLOCK; else fdflags &= ~O_NONBLOCK; if (fcntl(p->fd, F_SETFL, fdflags) == -1) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_SETFL: %s", pcap_strerror(errno)); return (-1); } return (0);}#endif#ifdef WIN32/* * Generate a string for the last Win32-specific error (i.e. an error generated when * calling a Win32 API). * For errors occurred during standard C calls, we still use pcap_strerror() */char *pcap_win32strerror(void){ DWORD error; static char errbuf[PCAP_ERRBUF_SIZE+1]; int errlen; error = GetLastError(); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, errbuf, PCAP_ERRBUF_SIZE, NULL); /* * "FormatMessage()" "helpfully" sticks CR/LF at the end of the * message. Get rid of it. */ errlen = strlen(errbuf); if (errlen >= 2) { errbuf[errlen - 1] = '\0'; errbuf[errlen - 2] = '\0'; } return (errbuf);}#endif/* * Not all systems have strerror(). */char *pcap_strerror(int errnum){#ifdef HAVE_STRERROR return (strerror(errnum));#else extern int sys_nerr; extern const char *const sys_errlist[]; static char ebuf[20]; if ((unsigned int)errnum < sys_nerr) return ((char *)sys_errlist[errnum]); (void)snprintf(ebuf, sizeof ebuf, "Unknown error: %d", errnum); return(ebuf);#endif}intpcap_setfilter(pcap_t *p, struct bpf_program *fp){ return p->setfilter_op(p, fp);}intpcap_stats(pcap_t *p, struct pcap_stat *ps){ return p->stats_op(p, ps);}static intpcap_stats_dead(pcap_t *p, struct pcap_stat *ps){ snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Statistics aren't available from a pcap_open_dead pcap_t"); return (-1);}static voidpcap_close_dead(pcap_t *p){ /* Nothing to do. */}pcap_t *pcap_open_dead(int linktype, int snaplen){ pcap_t *p; p = malloc(sizeof(*p)); if (p == NULL) return NULL; memset (p, 0, sizeof(*p)); p->snapshot = snaplen; p->linktype = linktype; p->stats_op = pcap_stats_dead; p->close_op = pcap_close_dead; return p;}voidpcap_close(pcap_t *p){ p->close_op(p); if (p->dlt_list != NULL) free(p->dlt_list); pcap_freecode(&p->fcode); free(p);}/* * We make the version string static, and return a pointer to it, rather * than exporting the version string directly. On at least some UNIXes, * if you import data from a shared library into an program, the data is * bound into the program binary, so if the string in the version of the * library with which the program was linked isn't the same as the * string in the version of the library with which the program is being * run, various undesirable things may happen (warnings, the string * being the one from the version of the library with which the program * was linked, or even weirder things, such as the string being the one * from the library but being truncated). */#ifdef WIN32/* * XXX - it'd be nice if we could somehow generate the WinPcap and libpcap * version numbers when building WinPcap. (It'd be nice to do so for * the packet.dll version number as well.) */static const char wpcap_version_string[] = "3.0";static const char pcap_version_string_fmt[] = "WinPcap version %s, based on libpcap version 0.8";static const char pcap_version_string_packet_dll_fmt[] = "WinPcap version %s (packet.dll version %s), based on libpcap version 0.8";static char *pcap_version_string;const char *pcap_lib_version(void){ char *packet_version_string; size_t pcap_version_string_len; if (pcap_version_string == NULL) { /* * Generate the version string. */ packet_version_string = PacketGetVersion(); if (strcmp(wpcap_version_string, packet_version_string) == 0) { /* * WinPcap version string and packet.dll version * string are the same; just report the WinPcap * version. */ pcap_version_string_len = (sizeof pcap_version_string_fmt - 2) + strlen(wpcap_version_string); pcap_version_string = malloc(pcap_version_string_len); sprintf(pcap_version_string, pcap_version_string_fmt, wpcap_version_string); } else { /* * WinPcap version string and packet.dll version * string are different; that shouldn't be the * case (the two libraries should come from the * same version of WinPcap), so we report both * versions. */ pcap_version_string_len = (sizeof pcap_version_string_packet_dll_fmt - 4) + strlen(wpcap_version_string) + strlen(packet_version_string); pcap_version_string = malloc(pcap_version_string_len); sprintf(pcap_version_string, pcap_version_string_packet_dll_fmt, wpcap_version_string, packet_version_string); } } return (pcap_version_string);}#else#include "version.h"const char *pcap_lib_version(void){ return (pcap_version_string);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -