From abe15ba10ddc3548c528ccb088097d7abf5be48b Mon Sep 17 00:00:00 2001
From: Li xin <lixin.fnst@cn.fujitsu.com>
Date: Tue, 18 Nov 2014 18:14:07 +0900
Subject: [PATCH 5/5] ethernet.c : remove it

Signed-off-by: Li Xin <lixin.fnst@cn.fujitsu.com>
---
 ethernet.c | 224 -------------------------------------------------------------
 1 file changed, 224 deletions(-)
 delete mode 100644 ethernet.c

diff --git a/ethernet.c b/ethernet.c
deleted file mode 100644
index d682b63..0000000
--- a/ethernet.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 1990, 1993 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.
- */
-#ifndef lint
-static char rcsid[] =
-    "@(#) $Header: etherent.c,v 1.4 96/06/14 20:34:25 leres Exp $ (LBL)";
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifndef ETHERS_FILE
-#define ETHERS_FILE "/etc/ethers"
-#endif
-
-struct etherent {
-        u_char addr[6];
-        char name[122];
-};
-
-static FILE *ether_fp = NULL;
-
-
-/* Hex digit to integer. */
-static inline int
-xdtoi(c)
-	int c;
-{
-
-	if (isdigit(c))
-		return c - '0';
-	else if (islower(c))
-		return c - 'a' + 10;
-	else
-		return c - 'A' + 10;
-}
-
-static inline int
-skip_space(f)
-	FILE *f;
-{
-	int c;
-
-	do {
-		c = getc(f);
-	} while (isspace(c) && c != '\n');
-
-	return c;
-}
-
-static inline int
-skip_line(f)
-	FILE *f;
-{
-	int c;
-
-	do
-		c = getc(f);
-	while (c != '\n' && c != EOF);
-
-	return c;
-}
-
-static struct etherent *
-next_etherent(fp)
-	FILE *fp;
-{
-	register int c, d, i;
-	char *bp;
-	static struct etherent e;
-	static int nline = 1;
- top:
-	while (nline) {
-		/* Find addr */
-		c = skip_space(fp);
-		if (c == '\n')
-			continue;
-		/* If this is a comment, or first thing on line
-		   cannot be etehrnet address, skip the line. */
-		else if (!isxdigit(c))
-			c = skip_line(fp);
-		else {
-			/* must be the start of an address */
-			for (i = 0; i < 6; i += 1) {
-				d = xdtoi(c);
-				c = getc(fp);
-				if (c != ':') {
-					d <<= 4;
-					d |= xdtoi(c);
-					c = getc(fp);
-				}
-				e.addr[i] = d;
-				if (c != ':')
-					break;
-				c = getc(fp);
-			}
-			nline = 0;
-		}
-		if (c == EOF)
-			return NULL;
-	}
-	
-	/* If we started a new line, 'c' holds the char past the ether addr,
-	   which we assume is white space.  If we are continuing a line,
-	   'c' is garbage.  In either case, we can throw it away. */
-	   
-	c = skip_space(fp);
-	if (c == '\n') {
-		nline = 1;
-		goto top;
-	}
-	else if (c == '#') {
-		(void)skip_line(fp);
-		nline = 1;
-		goto top;
-	}
-	else if (c == EOF)
-		return NULL;
-	
-	/* Must be a name. */
-	bp = e.name;
-	/* Use 'd' to prevent buffer overflow. */
-	d = sizeof(e.name) - 1;
-	do {
-		*bp++ = c;
-		c = getc(fp);
-	} while (!isspace(c) && c != EOF && --d > 0);
-	*bp = '\0';
-	if (c == '\n')
-		nline = 1;
-
-	return &e;
-}
-
-/* Open/rewind the ethers files; returns 1 if file was reopened */
-int
-ether_rewind()
-{
-	struct stat st;
-	static long mtime = 0, ctime = 0;
-
-	if (ether_fp != NULL) {
-		if (fstat(fileno(ether_fp), &st) < 0 ||
-		    mtime != st.st_mtime || ctime != st.st_ctime ||
-		    fseek(ether_fp, 0L, SEEK_SET) < 0) {
-			fclose(ether_fp);
-			ether_fp = NULL;
-		}
-	}
-	if (ether_fp == NULL) {
-		ether_fp = fopen(ETHERS_FILE, "r");
-		if (ether_fp == NULL)
-			return (-1);
-		if (fstat(fileno(ether_fp), &st) < 0) {
-			fclose(ether_fp);
-			ether_fp = NULL;
-			return (-1);
-		}
-		mtime = st.st_mtime;
-		ctime = st.st_ctime;
-		return (1);
-	}
-	return (0);
-}
-
-/* Map an ethernet address to a name; returns 0 on success, else 1. */
-int
-ether_ntohost(name, ea)
-	register char *name;
-	register u_char *ea;
-{
-	register struct etherent *ep;
-
-	if (ether_rewind() < 0)
-		return (1);
-
-	while ((ep = next_etherent(ether_fp)) != NULL)
-		if (bcmp(ep->addr, ea, 6) == 0) {
-			strcpy(name, ep->name);
-			return (0);
-		}
-	return (1);
-}
-
-/* Map an ethernet name to an address; returns 0 on success, else 1. */
-int
-ether_hostton(name, ea)
-	register char *name;
-	register u_char *ea;
-{
-	register struct etherent *ep;
-
-	if (ether_rewind() < 0)
-		return (1);
-
-	while ((ep = next_etherent(ether_fp)) != NULL)
-		if (strcmp(ep->name, name) == 0) {
-			bcopy(ep->addr, ea, 6);
-			return (0);
-		}
-	return (1);
-}
-- 
1.8.4.2

