pcap-nit.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 189 行
C
189 行
/* * Copyright (c) 1988, 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * SCCSID: @(#)pcap-nit.c 4.1 ULTRIX 1/25/91 * Based on: * rcsid[] = "@(#)$Header: pcap-nit.c,v 1.12 90/12/04 17:13:24 mccanne Exp $ (LBL)" */#include <stdio.h>#include <netdb.h>#include <ctype.h>#include <signal.h>#include <errno.h>#include <sys/types.h>#include <sys/time.h>#include <sys/timeb.h>#include <sys/socket.h>#include <sys/file.h>#include <sys/ioctl.h>#include <net/nit.h>#include <net/if.h>#include <netinet/in.h>#include <netinet/in_systm.h>#include <netinet/ip.h>#include <netinet/if_ether.h>#include <netinet/ip_var.h>#include <netinet/udp.h>#include <netinet/udp_var.h>#include <netinet/tcp.h>#include <netinet/tcpip.h>#include <net/bpf.h>#include "interface.h"/* * The chunk size for NIT. This is the amount of buffering * done for read calls. */#define CHUNKSIZE (2*1024)/* * The total buffer space used by NIT. */#define BUFSPACE (4*CHUNKSIZE)voidreadloop(cnt, if_fd, fp, printit) int cnt; int if_fd; struct bpf_program *fp; void (*printit)();{ u_char buf[CHUNKSIZE]; struct bpf_insn *fcode; int cc, i; fcode = fp->bf_insns; i = 0; while ((cc = read(if_fd, (char *)buf, sizeof(buf))) > 0) { register u_char *bp, *bstop; register u_char *sp; register struct nit_hdr *nh; register int datalen = 0; int caplen; /* * Loop through each packet. The increment expression * rounds up to the next int boundary past the end of * the previous packet. */ bstop = buf + cc; for (bp = buf; bp < bstop; bp += ((sizeof(struct nit_hdr)+datalen+sizeof(int)-1) & ~(sizeof(int)-1))) { nh = (struct nit_hdr *)bp; sp = bp + sizeof(*nh); switch (nh->nh_state) { case NIT_CATCH: datalen = nh->nh_datalen; break; case NIT_SEQNO: case NIT_NOMBUF: case NIT_NOCLUSTER: case NIT_NOSPACE: datalen = 0; continue; default: (void)fprintf(stderr, "bad nit state %d\n", nh->nh_state); exit(1); } caplen = nh->nh_wirelen; if (caplen > snaplen) caplen = snaplen; if (bpf_filter(fcode, sp, nh->nh_wirelen, caplen)) { (*printit)(sp, &nh->nh_timestamp, nh->nh_wirelen, caplen); if (cflag && ++i >= cnt) { wrapup(if_fd); return; } } } } perror("read"); exit(-1);}wrapup(fd) int fd;{ close(fd);}intinitdevice(device, pflag, linktype) char *device; int pflag; int *linktype;{ struct sockaddr_nit snit; struct nit_ioc nioc; int if_fd; if (snaplen < 96) /* * NIT requires a snapshot length of at least 96. */ snaplen = 96; if_fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW); if (if_fd < 0) { perror("nit socket"); exit(-1); } snit.snit_family = AF_NIT; (void)strncpy(snit.snit_ifname, device, NITIFSIZ); if (bind(if_fd, (struct sockaddr *)&snit, sizeof(snit))) { perror(snit.snit_ifname); exit(1); } bzero((char *)&nioc, sizeof(nioc)); nioc.nioc_bufspace = BUFSPACE; nioc.nioc_chunksize = CHUNKSIZE; nioc.nioc_typetomatch = NT_ALLTYPES; nioc.nioc_snaplen = snaplen; nioc.nioc_bufalign = sizeof(int); nioc.nioc_bufoffset = 0; nioc.nioc_flags = pflag ? NF_TIMEOUT : NF_PROMISC|NF_TIMEOUT; nioc.nioc_timeout.tv_sec = 1; nioc.nioc_timeout.tv_usec = 0; if (ioctl(if_fd, SIOCSNIT, &nioc) != 0) { perror("nit ioctl"); exit(1); } /* * NIT supports only ethernets. */ *linktype = DLT_EN10MB; return if_fd;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?