⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arp.c

📁 SinFP是一种新的识别对方计算机操作系统类型的工具
💻 C
字号:
/* * arp.c * * Copyright (c) 2001 Dug Song <dugsong@monkey.org> * * $Id: arp.c,v 1.10 2002/05/08 04:55:32 dugsong Exp $ */#include "config.h"#include <sys/types.h>#include <err.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include "dnet.h"#include "aton.h"#include "mod.h"voidarp_usage(void){	fprintf(stderr, "Usage: dnet arp [op|sha|spa|tha|tpa <value>] ...\n"	                "       dnet arp show\n"	                "       dnet arp get <host>\n"	                "       dnet arp add <host> <mac>\n"	                "       dnet arp delete <host>\n");	exit(1);}static intprint_arp(const struct arp_entry *entry, void *arg){	printf("%s at %s\n", addr_ntoa(&entry->arp_pa),	    addr_ntoa(&entry->arp_ha));	return (0);}static intarp_kern_main(int argc, char *argv[]){	struct arp_entry entry;	arp_t *arp;	char *cmd;	if (argc < 2)		arp_usage();		cmd = argv[1];	if ((arp = arp_open()) == NULL)		err(1, "arp_open");		if (strcmp(cmd, "show") == 0) {		if (arp_loop(arp, print_arp, NULL) < 0)			err(1, "arp_loop");	} else if (strcmp(cmd, "get") == 0) {		if (addr_pton(argv[2], &entry.arp_pa) < 0)			err(1, "addr_pton");		if (arp_get(arp, &entry) < 0)			err(1, "arp_get");		print_arp(&entry, NULL);	} else if (strcmp(cmd, "add") == 0) {		if (addr_pton(argv[2], &entry.arp_pa) < 0 ||		    addr_pton(argv[3], &entry.arp_ha) < 0)			err(1, "addr_pton");		if (arp_add(arp, &entry) < 0)			err(1, "arp_add");		printf("%s added\n", addr_ntoa(&entry.arp_pa));	} else if (strcmp(cmd, "delete") == 0) {		if (addr_pton(argv[2], &entry.arp_pa) < 0)			err(1, "addr_pton");		if (arp_delete(arp, &entry) < 0)			err(1, "arp_delete");		printf("%s deleted\n", addr_ntoa(&entry.arp_pa));	} else		arp_usage();		arp_close(arp);	return (0);}intarp_main(int argc, char *argv[]){	struct arp_hdr *arp;	struct arp_ethip *ethip;	struct addr addr;	u_char *p, buf[ETH_MTU];	/* XXX */	char *name, *value;	int c, len;	if (argc == 1 || *(argv[1]) == '-')		arp_usage();		/* XXX - total trash */	if (argc > 1 &&	    (strcmp(argv[1], "show") == 0 || strcmp(argv[1], "get") == 0 ||		strcmp(argv[1], "add") == 0 || strcmp(argv[1], "delete") == 0))		return (arp_kern_main(argc, argv));		srand(time(NULL));	arp = (struct arp_hdr *)buf;	arp->ar_hrd = htons(ARP_HRD_ETH);	arp->ar_pro = htons(ARP_PRO_IP);	arp->ar_hln = ETH_ADDR_LEN;	arp->ar_pln = IP_ADDR_LEN;	arp->ar_op = ARP_OP_REQUEST;	ethip = (struct arp_ethip *)(buf + ARP_HDR_LEN);	memset(ethip, 0, sizeof(*ethip));	for (c = 1; c + 1 < argc; c += 2) {		name = argv[c];		value = argv[c + 1];				if (strcmp(name, "op") == 0) {			if (op_aton(value, &arp->ar_op) < 0)				arp_usage();		} else if (strcmp(name, "sha") == 0) {			if (addr_aton(value, &addr) < 0)				arp_usage();			memcpy(ethip->ar_sha, &addr.addr_eth, ETH_ADDR_LEN);		} else if (strcmp(name, "spa") == 0) {						if (addr_aton(value, &addr) < 0)				arp_usage();			memcpy(ethip->ar_spa, &addr.addr_ip, IP_ADDR_LEN);		} else if (strcmp(name, "tha") == 0) {			if (addr_aton(value, &addr) < 0)				arp_usage();			memcpy(ethip->ar_tha, &addr.addr_eth, ETH_ADDR_LEN);		} else if (strcmp(name, "tpa") == 0) {			if (addr_aton(value, &addr) < 0)				arp_usage();			memcpy(ethip->ar_tpa, &addr.addr_ip, IP_ADDR_LEN);		}		else			arp_usage();	}	argc -= c;	argv += c;	if (argc != 0)		arp_usage();	p = buf + ARP_HDR_LEN + ARP_ETHIP_LEN;		if (!isatty(STDIN_FILENO)) {		len = sizeof(buf) - (p - buf);		while ((c = read(STDIN_FILENO, p, len)) > 0) {			p += c;			len -= c;		}	}	len = p - buf;		if (write(STDOUT_FILENO, buf, len) != len)		err(1, "write");	return (0);}struct mod mod_arp = {	"arp",	MOD_TYPE_ENCAP|MOD_TYPE_KERN,	arp_main};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -