*/
#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.13 1995/07/04 12:36:47 paulus Exp $";
#endif
/*
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");
u_int32_t ipaddr;
struct sockaddr *hwaddr;
{
- struct ifreq *ifr, *ifend, *ifp;
+ struct ifreq *ifr, *ifend;
u_int32_t ina, mask;
- struct sockaddr_dl *dla;
struct ifreq ifreq;
struct ifconf ifc;
struct ifreq ifs[MAX_IFS];
+ struct ifdevea ifdevea;
ifc.ifc_len = sizeof(ifs);
ifc.ifc_req = ifs;
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;
}
/*
}
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.
*/