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