| #include <netinet/ether.h> |
| #include <stdio.h> |
| #include <sys/mman.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <stdlib.h> |
| |
| /* glibc 2.4 has no ETHER_FILE_NAME, host compile fails without this */ |
| #ifndef ETHER_FILE_NAME |
| #define ETHER_FILE_NAME "/etc/ethers" |
| #endif |
| |
| #define ETHER_LINE_LEN 256 |
| |
| /* This test requires /etc/ethers to exist |
| * and to have nonzero length |
| */ |
| |
| int main(void) |
| { |
| struct ether_addr addr; |
| char hostname[ETHER_LINE_LEN]; |
| int fd, i; |
| const char *ethers; |
| struct stat statb; |
| |
| if ((fd = open(ETHER_FILE_NAME, O_RDONLY)) == -1) { |
| perror ("Cannot open file"); |
| exit(1); |
| } |
| |
| if (fstat(fd, &statb)) { |
| perror("Stat failed"); |
| exit(1); |
| } |
| ethers = mmap(NULL, statb.st_size, PROT_READ, MAP_SHARED, fd, 0); |
| |
| if (ethers == MAP_FAILED) { |
| perror("File mapping failed"); |
| exit(1); |
| } |
| |
| ether_line(ethers, &addr, hostname); |
| |
| for (i = 0; i < 6; i++) { |
| printf("%02x", addr.ether_addr_octet[i]); |
| if (i < 5) |
| printf(":"); |
| } |
| printf(" %s\n", hostname); |
| |
| return 0; |
| } |