1570af302Sopenharmony_ci#include <stdlib.h>
2570af302Sopenharmony_ci#include <netinet/ether.h>
3570af302Sopenharmony_ci#include <stdio.h>
4570af302Sopenharmony_ci#include <unsupported_api.h>
5570af302Sopenharmony_ci#ifdef __LITEOS_A__
6570af302Sopenharmony_ci#include <string.h>
7570af302Sopenharmony_ci#include <errno.h>
8570af302Sopenharmony_ci
9570af302Sopenharmony_ci#define ETHER_FILE_PATH "/etc/ethers"
10570af302Sopenharmony_ci#define BUFFER_SIZE     200
11570af302Sopenharmony_ci#endif
12570af302Sopenharmony_ci
13570af302Sopenharmony_cistruct ether_addr *ether_aton_r (const char *x, struct ether_addr *p_a)
14570af302Sopenharmony_ci{
15570af302Sopenharmony_ci	struct ether_addr a;
16570af302Sopenharmony_ci	char *y;
17570af302Sopenharmony_ci	for (int ii = 0; ii < 6; ii++) {
18570af302Sopenharmony_ci		unsigned long int n;
19570af302Sopenharmony_ci		if (ii != 0) {
20570af302Sopenharmony_ci			if (x[0] != ':') return 0; /* bad format */
21570af302Sopenharmony_ci			else x++;
22570af302Sopenharmony_ci		}
23570af302Sopenharmony_ci		n = strtoul (x, &y, 16);
24570af302Sopenharmony_ci		x = y;
25570af302Sopenharmony_ci		if (n > 0xFF) return 0; /* bad byte */
26570af302Sopenharmony_ci		a.ether_addr_octet[ii] = n;
27570af302Sopenharmony_ci	}
28570af302Sopenharmony_ci	if (x[0] != 0) return 0; /* bad format */
29570af302Sopenharmony_ci	*p_a = a;
30570af302Sopenharmony_ci	return p_a;
31570af302Sopenharmony_ci}
32570af302Sopenharmony_ci
33570af302Sopenharmony_cistruct ether_addr *ether_aton (const char *x)
34570af302Sopenharmony_ci{
35570af302Sopenharmony_ci	static struct ether_addr a;
36570af302Sopenharmony_ci	return ether_aton_r (x, &a);
37570af302Sopenharmony_ci}
38570af302Sopenharmony_ci
39570af302Sopenharmony_cichar *ether_ntoa_r (const struct ether_addr *p_a, char *x) {
40570af302Sopenharmony_ci	char *y;
41570af302Sopenharmony_ci	y = x;
42570af302Sopenharmony_ci	for (int ii = 0; ii < 6; ii++) {
43570af302Sopenharmony_ci		x += sprintf (x, ii == 0 ? "%.2X" : ":%.2X", p_a->ether_addr_octet[ii]);
44570af302Sopenharmony_ci	}
45570af302Sopenharmony_ci	return y;
46570af302Sopenharmony_ci}
47570af302Sopenharmony_ci
48570af302Sopenharmony_cichar *ether_ntoa (const struct ether_addr *p_a) {
49570af302Sopenharmony_ci	static char x[18];
50570af302Sopenharmony_ci	return ether_ntoa_r (p_a, x);
51570af302Sopenharmony_ci}
52570af302Sopenharmony_ci
53570af302Sopenharmony_ciint ether_line(const char *line, struct ether_addr *addr, char *hostname)
54570af302Sopenharmony_ci{
55570af302Sopenharmony_ci#ifdef __LITEOS_A__
56570af302Sopenharmony_ci	char buf[BUFFER_SIZE], *ch, *ptr = NULL;
57570af302Sopenharmony_ci	if (line[0] == '#') {
58570af302Sopenharmony_ci		errno = EINVAL;
59570af302Sopenharmony_ci		return -1;
60570af302Sopenharmony_ci	}
61570af302Sopenharmony_ci	strcpy(buf, line);
62570af302Sopenharmony_ci	ch = strchr(buf, '#');
63570af302Sopenharmony_ci	if (ch)
64570af302Sopenharmony_ci		*ch = '\0';
65570af302Sopenharmony_ci	ch = strtok_r(buf, " \t\n", &ptr);
66570af302Sopenharmony_ci	ch = strtok_r(NULL, " \t\n", &ptr);
67570af302Sopenharmony_ci	if (ch == NULL) {
68570af302Sopenharmony_ci		errno = EINVAL;
69570af302Sopenharmony_ci		return -1;
70570af302Sopenharmony_ci	}
71570af302Sopenharmony_ci	strcpy(hostname, ch);
72570af302Sopenharmony_ci
73570af302Sopenharmony_ci	unsigned int ret;
74570af302Sopenharmony_ci	ch = &buf[0];
75570af302Sopenharmony_ci	for (int i = 0; i < 6; i++) {
76570af302Sopenharmony_ci		ch = strtok_r(ch, ":", &ptr);
77570af302Sopenharmony_ci		if (ch == NULL || sscanf(ch, "%x", &ret) != 1) {
78570af302Sopenharmony_ci			errno = EINVAL;
79570af302Sopenharmony_ci			return -1;
80570af302Sopenharmony_ci		}
81570af302Sopenharmony_ci		addr->ether_addr_octet[i] = (uint8_t)ret;
82570af302Sopenharmony_ci		ch = NULL;
83570af302Sopenharmony_ci	}
84570af302Sopenharmony_ci
85570af302Sopenharmony_ci	return 0;
86570af302Sopenharmony_ci#else
87570af302Sopenharmony_ci	return -1;
88570af302Sopenharmony_ci#endif
89570af302Sopenharmony_ci}
90570af302Sopenharmony_ci
91570af302Sopenharmony_ciint ether_ntohost(char *hostname, const struct ether_addr *addr)
92570af302Sopenharmony_ci{
93570af302Sopenharmony_ci#ifdef __LITEOS_A__
94570af302Sopenharmony_ci	FILE *f = NULL;
95570af302Sopenharmony_ci	char buf[BUFFER_SIZE + 1];
96570af302Sopenharmony_ci	char temp_name[BUFFER_SIZE];
97570af302Sopenharmony_ci	struct ether_addr *temp_addr;
98570af302Sopenharmony_ci
99570af302Sopenharmony_ci	if (!(f = fopen(ETHER_FILE_PATH, "r")))
100570af302Sopenharmony_ci		return ENOENT;
101570af302Sopenharmony_ci	temp_addr = (struct ether_addr *)malloc(sizeof(struct ether_addr));
102570af302Sopenharmony_ci	if (temp_addr == NULL) {
103570af302Sopenharmony_ci		fclose(f);
104570af302Sopenharmony_ci		return ENOMEM;
105570af302Sopenharmony_ci	}
106570af302Sopenharmony_ci	while (fgets(buf, BUFFER_SIZE, f)) {
107570af302Sopenharmony_ci		if (ether_line(buf, temp_addr, temp_name) != 0)
108570af302Sopenharmony_ci			continue;
109570af302Sopenharmony_ci		if (memcmp(addr, temp_addr, 6) == 0) {
110570af302Sopenharmony_ci			strcpy(hostname, temp_name);
111570af302Sopenharmony_ci			free(temp_addr);
112570af302Sopenharmony_ci			fclose(f);
113570af302Sopenharmony_ci			return 0;
114570af302Sopenharmony_ci		}
115570af302Sopenharmony_ci	}
116570af302Sopenharmony_ci
117570af302Sopenharmony_ci	free(temp_addr);
118570af302Sopenharmony_ci	fclose(f);
119570af302Sopenharmony_ci	return -1;
120570af302Sopenharmony_ci#else
121570af302Sopenharmony_ci	return -1;
122570af302Sopenharmony_ci#endif
123570af302Sopenharmony_ci}
124570af302Sopenharmony_ci
125570af302Sopenharmony_ci
126570af302Sopenharmony_ciint ether_hostton(const char *hostname, struct ether_addr *addr)
127570af302Sopenharmony_ci{
128570af302Sopenharmony_ci#ifdef __LITEOS_A__
129570af302Sopenharmony_ci	FILE *f = NULL;
130570af302Sopenharmony_ci	char buf[BUFFER_SIZE + 1];
131570af302Sopenharmony_ci	char temp_name[BUFFER_SIZE];
132570af302Sopenharmony_ci	struct ether_addr *temp_addr;
133570af302Sopenharmony_ci
134570af302Sopenharmony_ci	temp_addr = (struct ether_addr *)malloc(sizeof(struct ether_addr));
135570af302Sopenharmony_ci	if (temp_addr == NULL)
136570af302Sopenharmony_ci		return ENOMEM;
137570af302Sopenharmony_ci	if (!(f = fopen(ETHER_FILE_PATH, "r"))) {
138570af302Sopenharmony_ci		free(temp_addr);
139570af302Sopenharmony_ci		return ENOENT;
140570af302Sopenharmony_ci	}
141570af302Sopenharmony_ci	while (fgets(buf, BUFFER_SIZE, f)) {
142570af302Sopenharmony_ci		if (ether_line(buf, temp_addr, temp_name) != 0)
143570af302Sopenharmony_ci			continue;
144570af302Sopenharmony_ci		if (strcmp(hostname, temp_name) == 0) {
145570af302Sopenharmony_ci			memcpy(addr, temp_addr, 6);
146570af302Sopenharmony_ci			free(temp_addr);
147570af302Sopenharmony_ci			fclose(f);
148570af302Sopenharmony_ci			return 0;
149570af302Sopenharmony_ci		}
150570af302Sopenharmony_ci	}
151570af302Sopenharmony_ci
152570af302Sopenharmony_ci	free(temp_addr);
153570af302Sopenharmony_ci	fclose(f);
154570af302Sopenharmony_ci	return -1;
155570af302Sopenharmony_ci#else
156570af302Sopenharmony_ci	return -1;
157570af302Sopenharmony_ci#endif
158570af302Sopenharmony_ci}
159