X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-ultrix.c;h=06c6f4f41e77cc132bb3ac3b442ef5eba8099de5;hp=d8653f141d2af8cf4a249f9ec5bde93465838b0e;hb=e46557418647a48bb018edf58a2bdb6ff9e57ef6;hpb=416f33f79891785c39465e6b3f1010ee92fb78aa diff --git a/pppd/sys-ultrix.c b/pppd/sys-ultrix.c index d8653f1..06c6f4f 100644 --- a/pppd/sys-ultrix.c +++ b/pppd/sys-ultrix.c @@ -19,7 +19,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-ultrix.c,v 1.9 1995/04/27 00:45:24 paulus Exp $"; +static char rcsid[] = "$Id: sys-ultrix.c,v 1.12 1995/06/30 00:40:06 paulus Exp $"; #endif /* @@ -401,6 +401,15 @@ void restore_tty() { if (restore_term) { + if (!default_device) { + /* + * Turn off echoing, because otherwise we can get into + * a loop with the tty and the modem echoing to each other. + * We presume we are the sole user of this tty device, so + * when we close it, it will revert to its defaults anyway. + */ + inittermios.c_lflag &= ~(ECHO | ECHONL); + } if (tcsetattr(fd, TCSAFLUSH, &inittermios) < 0) if (errno != ENXIO) syslog(LOG_WARNING, "tcsetattr: %m"); @@ -906,6 +915,7 @@ get_ether_addr(ipaddr, hwaddr) struct ifreq ifreq; struct ifconf ifc; struct ifreq ifs[MAX_IFS]; + struct ifdevea ifdevea; ifc.ifc_len = sizeof(ifs); ifc.ifc_req = ifs; @@ -952,26 +962,17 @@ get_ether_addr(ipaddr, hwaddr) syslog(LOG_INFO, "found interface %s for proxy arp", ifr->ifr_name); /* - * Now scan through again looking for a link-level address - * for this interface. + * Grab the physical address for this interface. */ - ifp = ifr; - for (ifr = ifc.ifc_req; ifr < ifend; ) { - if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0 - && ifr->ifr_addr.sa_family == AF_DLI) { - /* - * Found the link-level address - copy it out - */ - dla = (struct sockaddr_dl *)&ifr->ifr_addr; - hwaddr->sa_family = AF_UNSPEC; - BCOPY(dla, hwaddr->sa_data, sizeof(hwaddr->sa_data)); - return 1; - } - ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + sizeof(struct sockaddr) -); + strncpy(ifdevea.ifr_name, ifr->ifr_name, sizeof(ifdevea.ifr_name)); + if (ioctl(sockfd, SIOCRPHYSADDR, &ifdevea) < 0) { + syslog(LOG_ERR, "Couldn't get h/w address for %s: %m", ifr->ifr_name); + return 0; } - return 0; + hwaddr->sa_family = AF_UNSPEC; + BCOPY(ifdevea.current_pa, hwaddr->sa_data, 6); + return 1; } /* @@ -1012,7 +1013,7 @@ GetMask(addr) } ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len); for (ifr = ifc.ifc_req; ifr < ifend; ifr = (struct ifreq *) - ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len)) { + ((char *)&ifr->ifr_addr + sizeof(struct sockaddr))) { /* * Check the interface's internet address. */