123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- #include "config.h"
- #ifdef HAVE_DLPI
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <unistd.h>
- #include <string.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/sockio.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <sys/dlpi.h>
- #include <net/if.h>
- #include "dlcommon.h"
- extern char *split_dname(char *device, int *unitp);
- extern char *strncpy2(char *dest, char *src, int n);
- extern char *strncat2(char *dest, char *src, int n);
- int
- get_addrs_dlpi(char *interface, char if_hw_addr[], struct in_addr *if_ip_addr)
- {
- int got_hw_addr = 0;
- int got_ip_addr = 0;
- int fd;
- long buf[MAXDLBUF];
- union DL_primitives *dlp;
- char *cp;
- int unit_num = 0;
- int sap = 0;
- char *devname = NULL;
- char *devname2 = NULL;
- char fulldevpath[256];
- struct ifreq ifr = {};
-
- memset(if_hw_addr, 0, 6);
-
-
- if (strncmp(interface, "/dev/", strlen("/dev/")) == 0) {
- devname = interface + strlen("/dev/");
- } else {
- devname = interface;
- }
- strncpy2(fulldevpath, "/dev/", sizeof(fulldevpath)-1);
- cp = strncat2(fulldevpath, interface, sizeof(fulldevpath));
- if (strlen(cp) != 0) {
- fprintf(stderr, "device name buffer overflow %s\n", fulldevpath);
- return -1;
- }
- fprintf(stderr,"interface: %s\n", devname);
-
-
-
- devname2 = strdup(fulldevpath);
- cp = split_dname(devname2, &unit_num);
- if (cp == NULL) {
- free(devname2);
- goto get_ip_address;
- } else {
- *cp = '\0';
- }
-
-
- if ((fd = open(devname2, O_RDWR)) < 0) {
- if (errno != ENOENT) {
- fprintf(stderr, "Couldn't open %s\n", devname2);
- free(devname2);
- goto get_ip_address;
- } else {
- if ((fd = open(fulldevpath, O_RDWR)) < 0) {
- fprintf(stderr, "Couldn't open %s\n", fulldevpath);
- free(devname2);
- goto get_ip_address;
- }
- }
- }
- free(devname2);
- devname2 = NULL;
-
- dlp = (union DL_primitives*) buf;
-
- dlattachreq(fd, unit_num);
- dlokack(fd, buf);
-
- dlbindreq(fd, sap, 0, DL_CLDLS, 0, 0);
- dlbindack(fd, buf);
-
- dlinforeq(fd);
- dlinfoack(fd, buf);
-
- if (dlp->info_ack.dl_addr_length + dlp->info_ack.dl_sap_length == 6) {
- memcpy(if_hw_addr,
- OFFADDR(dlp, dlp->info_ack.dl_addr_offset),
- dlp->info_ack.dl_addr_length);
- got_hw_addr = 1;
- } else {
- fprintf(stderr, "Error, bad length for hardware interface %s -- %d\n",
- interface,
- dlp->info_ack.dl_addr_length);
- }
- close(fd);
- get_ip_address:
-
- #ifdef SIOCGIFADDR
- fd = socket(PF_INET, SOCK_DGRAM, 0);
- strncpy(ifr.ifr_name, interface, IFNAMSIZ);
- (*(struct sockaddr_in *) &ifr.ifr_addr).sin_family = AF_INET;
- if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
- fprintf(stderr, "Error getting IP address for interface: %s\n", "ge0");
- perror("ioctl(SIOCGIFADDR)");
- } else {
- memcpy(if_ip_addr, &((*(struct sockaddr_in *) &ifr.ifr_addr).sin_addr), sizeof(struct in_addr));
- got_ip_addr = 2;
- }
- #else
- fprintf(stderr, "Cannot obtain IP address on this platform\n");
- #endif
- close(fd);
-
- return got_hw_addr + got_ip_addr;
- }
- char *
- split_dname(char *device, int *unitp)
- {
- char *cp;
- char *eos;
- int unit;
-
-
- cp = device + strlen(device) - 1;
- if (*cp < '0' || *cp > '9') {
- fprintf(stderr, "%s missing unit number", device);
- return (NULL);
- }
-
-
- while (cp-1 >= device && *(cp-1) >= '0' && *(cp-1) <= '9')
- cp--;
-
- unit = (int) strtol(cp, &eos, 10);
- if (*eos != '\0') {
- fprintf(stderr, "%s bad unit number", device);
- return (NULL);
- }
- *unitp = unit;
- return (cp);
- }
- char *
- strncpy2(char *dest, char *src, int n)
- {
- int
- i = 0;
- char
- *char_ptr;
-
- if ((!dest) || (!src))
- return(src);
- char_ptr = dest;
- while ((i++ < n) && *src)
- *char_ptr++ = *src++;
- *char_ptr = '\0';
- return(src);
- }
- char *
- strncat2(char *dest, char *src, int n)
- {
- int
- i = 0;
- char
- *dest_ptr,
- *src_ptr;
-
- if (!dest || !src)
- return NULL;
- dest_ptr = dest;
- src_ptr = src;
-
- while ((i < (n-1)) && *dest_ptr)
- {
- i++;
- dest_ptr++;
- }
-
- while ((i++ < (n-1)) && *src_ptr)
- *dest_ptr++ = *src_ptr++;
-
- if ((i == n) && *src_ptr)
- {
-
- }
- *dest_ptr = '\0';
-
-
- return(src_ptr);
- }
- #endif
|