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

📄 send_arp.c

📁 linux集群服务器软件代码包
💻 C
📖 第 1 页 / 共 2 页
字号:
 *     Previously set to MAC address being associated with the VIP */#ifdef HAVE_LIBNET_1_0_APIintsend_arp(struct libnet_link_int *l, u_long ip, u_char *device, u_char *macaddr, u_char *broadcast, u_char *netmask, u_short arptype){	int n;	u_char *buf;	u_char *target_mac;	u_char device_mac[6];	u_char bcast_mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};	u_char zero_mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};	if (libnet_init_packet(LIBNET_ARP_H + LIBNET_ETH_H, &buf) == -1) {	syslog(LOG_ERR, "libnet_init_packet memory:");		return -1;	}	/* Convert ASCII Mac Address to 6 Hex Digits. */	/* Ethernet header */	if (get_hw_addr(device, device_mac) < 0) {		syslog(LOG_ERR, "Cannot find mac address for %s",				device);		return -1;	}	if (libnet_build_ethernet(bcast_mac, device_mac, ETHERTYPE_ARP, NULL, 0	,	buf) == -1) {		syslog(LOG_ERR, "libnet_build_ethernet failed:");		libnet_destroy_packet(&buf);		return -1;	}	if (arptype == ARPOP_REQUEST) {		target_mac = zero_mac;	}	else if (arptype == ARPOP_REPLY) {		target_mac = macaddr;	}	else {		syslog(LOG_ERR, "unkonwn arptype:");		return -1;	}	/*	 *  ARP header	 */	if (libnet_build_arp(ARPHRD_ETHER,	/* Hardware address type */		ETHERTYPE_IP,			/* Protocol address type */		6,				/* Hardware address length */		4,				/* Protocol address length */		arptype,			/* ARP operation */		macaddr,			/* Source hardware addr */		(u_char *)&ip,			/* Target hardware addr */		target_mac,			/* Destination hw addr */		(u_char *)&ip,			/* Target protocol address */		NULL,				/* Payload */		0,				/* Payload length */		buf + LIBNET_ETH_H) == -1) {	        syslog(LOG_ERR, "libnet_build_arp failed:");		libnet_destroy_packet(&buf);		return -1;	}	n = libnet_write_link_layer(l, device, buf, LIBNET_ARP_H + LIBNET_ETH_H);	if (n == -1) {		syslog(LOG_ERR, "libnet_build_ethernet failed:");	}	libnet_destroy_packet(&buf);	return (n);}#endif /* HAVE_LIBNET_1_0_API */#ifdef HAVE_LIBNET_1_1_APIintsend_arp(libnet_t* lntag, u_long ip, u_char *device, u_char macaddr[6], u_char *broadcast, u_char *netmask, u_short arptype){	int n;	u_char *target_mac;	u_char device_mac[6];	u_char bcast_mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};	u_char zero_mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};	if (arptype == ARPOP_REQUEST) {		target_mac = zero_mac;	}	else if (arptype == ARPOP_REPLY) {		target_mac = macaddr;	}	else {		syslog(LOG_ERR, "unkonwn arptype:");		return -1;	}	/*	 *  ARP header	 */	if (libnet_build_arp(ARPHRD_ETHER,	/* hardware address type */		ETHERTYPE_IP,	/* protocol address type */		6,		/* Hardware address length */		4,		/* protocol address length */		arptype,	/* ARP operation type */		macaddr,	/* sender Hardware address */		(u_char *)&ip,	/* sender protocol address */		target_mac,	/* target hardware address */		(u_char *)&ip,	/* target protocol address */		NULL,		/* Payload */		0,		/* Length of payload */		lntag,		/* libnet context pointer */		0		/* packet id */	) == -1 ) {		syslog(LOG_ERR, "libnet_build_arp failed:");		return -1;	}	/* Ethernet header */	if (get_hw_addr(device, device_mac) < 0) {		syslog(LOG_ERR, "Cannot find mac address for %s",				device);		return -1;	}	if (libnet_build_ethernet(bcast_mac, device_mac, ETHERTYPE_ARP, NULL, 0	,	lntag, 0) == -1 ) {		syslog(LOG_ERR, "libnet_build_ethernet failed:");		return -1;	}	n = libnet_write(lntag);	if (n == -1) {		syslog(LOG_ERR, "libnet_build_ethernet failed:");	}	libnet_clear_packet(lntag);	return (n);}#endif /* HAVE_LIBNET_1_1_API */intcreate_pid_directory(const char *pidfilename)  {	int	status;	struct stat stat_buf;	char    *pidfilename_cpy;	char    *dir;	pidfilename_cpy = strdup(pidfilename);	if (!pidfilename_cpy) {		syslog(LOG_INFO, "Memory allocation failure: %s\n",				strerror(errno));		return -1;	}		dir = dirname(pidfilename_cpy);	status = stat(dir, &stat_buf); 	if (status < 0 && errno != ENOENT && errno != ENOTDIR) {		syslog(LOG_INFO, "Could not stat pid-file directory "				"[%s]: %s", dir, strerror(errno));		free(pidfilename_cpy);		return -1;	}		if (!status) {		if (S_ISDIR(stat_buf.st_mode)) {			return 0;		}		syslog(LOG_INFO, "Pid-File directory exists but is "				"not a directory [%s]", dir);		free(pidfilename_cpy);		return -1;        }	if (mkdir(dir, S_IRUSR|S_IWUSR|S_IXUSR | S_IRGRP|S_IXGRP) < 0) {		syslog(LOG_INFO, "Could not create pid-file directory "				"[%s]: %s", dir, strerror(errno));		free(pidfilename_cpy);		return -1;	}	free(pidfilename_cpy);	return 0;}intwrite_pid_file(const char *pidfilename)  {	int     	pidfilefd;	char    	pidbuf[11];	unsigned long   pid;	ssize_t 	bytes;	if (*pidfilename != '/') {		syslog(LOG_INFO, "Invalid pid-file name, must begin with a "				"'/' [%s]\n", pidfilename);		return -1;	}	if (create_pid_directory(pidfilename) < 0) {		return -1;	}	while (1) {		pidfilefd = open(pidfilename, O_CREAT|O_EXCL|O_RDWR, 				S_IRUSR|S_IWUSR);		if (pidfilefd < 0) {			if (errno != EEXIST) { /* Old PID file */				syslog(LOG_INFO, "Could not open pid-file "						"[%s]: %s", pidfilename, 						strerror(errno));				return -1;			}		}		else {			break;		}		pidfilefd = open(pidfilename, O_RDONLY, S_IRUSR|S_IWUSR);		if (pidfilefd < 0) {			syslog(LOG_INFO, "Could not open pid-file " 					"[%s]: %s", pidfilename, 					strerror(errno));			return -1;		}		while (1) {			bytes = read(pidfilefd, pidbuf, sizeof(pidbuf)-1);			if (bytes < 0) {				if (errno == EINTR) {					continue;				}				syslog(LOG_INFO, "Could not read pid-file " 						"[%s]: %s", pidfilename, 						strerror(errno));				return -1;			}			pidbuf[bytes] = '\0';			break;		}		if(unlink(pidfilename) < 0) {			syslog(LOG_INFO, "Could not delete pid-file "	 				"[%s]: %s", pidfilename, 					strerror(errno));			return -1;		}		if (!bytes) {			syslog(LOG_INFO, "Invalid pid in pid-file "	 				"[%s]: %s", pidfilename, 					strerror(errno));			return -1;		}		close(pidfilefd);		pid = strtoul(pidbuf, NULL, 10);		if (pid == ULONG_MAX && errno == ERANGE) {			syslog(LOG_INFO, "Invalid pid in pid-file "	 				"[%s]: %s", pidfilename, 					strerror(errno));			return -1;		}		if (kill(pid, SIGKILL) < 0 && errno != ESRCH) {			syslog(LOG_INFO, "Error killing old proccess [%lu] "	 				"from pid-file [%s]: %s", pid,					pidfilename, strerror(errno));			return -1;		}		syslog(LOG_INFO, "Killed old send_arp process [%lu]\n",				pid);	}	if (snprintf(pidbuf, sizeof(pidbuf), "%u"	,	getpid()) >= (int)sizeof(pidbuf)) {		syslog(LOG_INFO, "Pid too long for buffer [%u]", getpid());		return -1;	}	while (1) {		bytes = write(pidfilefd, pidbuf, strlen(pidbuf));		if (bytes != strlen(pidbuf)) {			if (bytes < 0 && errno == EINTR) {				continue;			}			syslog(LOG_INFO, "Could not write pid-file "					"[%s]: %s", pidfilename,					strerror(errno));			return -1;		}		break;	}	close(pidfilefd);	return 0;}/* * $Log: send_arp.c,v $ * Revision 1.13  2004/09/10 02:03:00  alan * BEAM FIX:  A variable was declared unsigned that should have been declared signed. * 	This is the result of a previous size_t fix that should have used ssize_t instead. * * Revision 1.12  2004/06/15 01:49:04  horms * Changes to make gratuitous ARP Packets RFC2002 (4.6) compliant * * Revision 1.11  2004/04/27 11:55:54  horms * Slightly better error checking * * Revision 1.10  2004/04/27 09:49:32  horms * Fix for pid code for FreeBSD (and others) * * Revision 1.9  2004/03/19 15:07:43  alan * Put in a fix provided by Michael Dipper <md@LF.net> * A '/' is missing from the pidfile pathname for send_arp. * * Revision 1.8  2004/02/17 22:11:57  lars * Pet peeve removal: _Id et al now gone, replaced with consistent Id header. * * Revision 1.7  2004/01/22 01:53:35  alan * Changed send_arp to exit(0) when killed by SIGTERM. * * Revision 1.6  2003/12/11 22:58:04  alan * Put in a patch from Werner Schulthei

⌨️ 快捷键说明

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