From: Paul Mackerras Date: Mon, 24 Apr 1995 05:37:17 +0000 (+0000) Subject: sundry fixes and reformattings X-Git-Tag: RELEASE_2_3_6~784 X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=aeac87f641d5b7678c6bbe8173e67a9d0b1baf2b sundry fixes and reformattings --- diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index 19755b0..7d203c7 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -22,27 +22,30 @@ * TODO: */ +#include +#include +#include +#include +#include + #include +#include #include #include #include #include #include -#include -#include -#include -#include -#include #include +#include +#include #include #include #include -#include -#include +#include +#include #include #include -#include #include "pppd.h" #include "fsm.h" @@ -91,27 +94,10 @@ void sys_init(void) } } -/* - * ccp_fatal_error - returns 1 if decompression was disabled as a - * result of an error detected after decompression of a packet, - * 0 otherwise. This is necessary because of patent nonsense. - */ -int ccp_fatal_error (int unit) -{ - int x; - - if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { - syslog(LOG_ERR, "ioctl(PPPIOCGFLAGS): %m"); - return 0; - } - return x & SC_DC_FERROR; -} - /* * note_debug_level - note a change in the debug level. */ - -void note_debug_level(void) +void note_debug_level (void) { if (debug) { syslog(LOG_INFO, "Debug turned ON, Level %d", debug); @@ -226,99 +212,97 @@ void disestablish_ppp(void) * List of valid speeds. */ struct speed { - unsigned int speed_int; - int speed_val; + int speed_int, speed_val; } speeds[] = { #ifdef B50 - { 50U, B50 }, + { 50, B50 }, #endif #ifdef B75 - { 75U, B75 }, + { 75, B75 }, #endif #ifdef B110 - { 110U, B110 }, + { 110, B110 }, #endif #ifdef B134 - { 134U, B134 }, + { 134, B134 }, #endif #ifdef B150 - { 150U, B150 }, + { 150, B150 }, #endif #ifdef B200 - { 200U, B200 }, + { 200, B200 }, #endif #ifdef B300 - { 300U, B300 }, + { 300, B300 }, #endif #ifdef B600 - { 600U, B600 }, + { 600, B600 }, #endif #ifdef B1200 - { 1200U, B1200 }, + { 1200, B1200 }, #endif #ifdef B1800 - { 1800U, B1800 }, + { 1800, B1800 }, #endif #ifdef B2000 - { 2000U, B2000 }, + { 2000, B2000 }, #endif #ifdef B2400 - { 2400U, B2400 }, + { 2400, B2400 }, #endif #ifdef B3600 - { 3600U, B3600 }, + { 3600, B3600 }, #endif #ifdef B4800 - { 4800U, B4800 }, + { 4800, B4800 }, #endif #ifdef B7200 - { 7200U, B7200 }, + { 7200, B7200 }, #endif #ifdef B9600 - { 9600U, B9600 }, + { 9600, B9600 }, #endif #ifdef B19200 - { 19200U, B19200 }, + { 19200, B19200 }, #endif #ifdef B38400 - { 38400U, B38400 }, + { 38400, B38400 }, #endif #ifdef EXTA - { 19200U, EXTA }, + { 19200, EXTA }, #endif #ifdef EXTB - { 38400U, EXTB }, + { 38400, EXTB }, #endif #ifdef B57600 - { 57600U, B57600 }, + { 57600, B57600 }, #endif #ifdef B115200 - { 115200U, B115200 }, + { 115200, B115200 }, #endif - { 0U, 0 } + { 0, 0 } }; /* * Translate from bits/second to a speed_t. */ -int translate_speed (unsigned int bps) +int translate_speed (int bps) { struct speed *speedp; - if (bps == 0U) + if (bps == 0) return 0; for (speedp = speeds; speedp->speed_int; speedp++) if (bps == speedp->speed_int) return speedp->speed_val; - syslog(LOG_WARNING, "speed %u not supported", bps); + syslog(LOG_WARNING, "speed %d not supported", bps); return 0; } /* * Translate from a speed_t to bits/second. */ - -unsigned int baud_rate_of (int speed) +int baud_rate_of (int speed) { struct speed *speedp; @@ -335,11 +319,9 @@ unsigned int baud_rate_of (int speed) * at the requested speed, etc. If `local' is true, set CLOCAL * regardless of whether the modem option was specified. */ - void set_up_tty (int fd, int local) { - unsigned int speed; - int x; + int speed, x; struct termios tios; if (tcgetattr(fd, &tios) < 0) { @@ -350,22 +332,26 @@ void set_up_tty (int fd, int local) if (!restore_term) inittermios = tios; - tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL | CRTSCTS); + tios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CLOCAL); if (crtscts == 1) tios.c_cflag |= CRTSCTS; + else if (crtscts < 0) + tios.c_cflag &= ~CRTSCTS; tios.c_cflag |= CS8 | CREAD | HUPCL; + if (local || !modem) tios.c_cflag |= CLOCAL; - tios.c_iflag = IGNBRK | IGNPAR; - tios.c_oflag = 0; - tios.c_lflag = 0; - tios.c_cc[VMIN] = 1; - tios.c_cc[VTIME] = 0; + + tios.c_iflag = IGNBRK | IGNPAR; + tios.c_oflag = 0; + tios.c_lflag = 0; + tios.c_cc[VMIN] = 1; + tios.c_cc[VTIME] = 0; if (crtscts == 2) { - tios.c_iflag |= IXOFF; - tios.c_cc[VSTOP] = 0x13; /* DC3 = XOFF = ^S */ + tios.c_iflag |= IXOFF; + tios.c_cc[VSTOP] = 0x13; /* DC3 = XOFF = ^S */ tios.c_cc[VSTART] = 0x11; /* DC1 = XON = ^Q */ } @@ -409,7 +395,8 @@ void setdtr (int fd, int on) /* * restore_tty - restore the terminal to the saved settings. */ -void restore_tty(void) + +void restore_tty (void) { if (restore_term) { if (tcsetattr(fd, TCSAFLUSH, &inittermios) < 0) @@ -442,7 +429,6 @@ void output (int unit, unsigned char *p, int len) * for the length of time specified by *timo (indefinite * if timo is NULL). */ - void wait_input (struct timeval *timo) { fd_set ready; @@ -457,7 +443,6 @@ void wait_input (struct timeval *timo) } } - /* * read_packet - get a PPP packet from the serial device. */ @@ -562,114 +547,148 @@ void ppp_recv_config (int unit,int mru,u_int32_t asyncmap,int pcomp,int accomp) * is acceptable for use. */ int ccp_test (int unit, u_char *opt_ptr, int opt_len, int for_transmit) -{ + { struct ppp_option_data data; - data.ptr = opt_ptr; - data.length = opt_len; + data.ptr = opt_ptr; + data.length = opt_len; data.transmit = for_transmit; + return ioctl(fd, PPPIOCSCOMPRESS, (caddr_t) &data) >= 0; -} + } /* * ccp_flags_set - inform kernel about the current state of CCP. */ + void ccp_flags_set (int unit, int isopen, int isup) -{ + { int x; - if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) + { syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); - return; - } - x = isopen? x | SC_CCP_OPEN: x &~ SC_CCP_OPEN; - x = isup? x | SC_CCP_UP: x &~ SC_CCP_UP; - if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) - syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); -} + } + else + { + x = isopen? x | SC_CCP_OPEN : x &~ SC_CCP_OPEN; + x = isup? x | SC_CCP_UP : x &~ SC_CCP_UP; + + if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) + { + syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); + } + } + } + +/* + * ccp_fatal_error - returns 1 if decompression was disabled as a + * result of an error detected after decompression of a packet, + * 0 otherwise. This is necessary because of patent nonsense. + */ + +int ccp_fatal_error (int unit) + { + int x; + + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) + { + syslog(LOG_ERR, "ioctl(PPPIOCGFLAGS): %m"); + return 0; + } + return x & SC_DC_FERROR; + } /* * sifvjcomp - config tcp header compression */ int sifvjcomp (int u, int vjcomp, int cidcomp, int maxcid) -{ + { u_int x; - if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) { + if (ioctl(fd, PPPIOCGFLAGS, (caddr_t) &x) < 0) + { syslog(LOG_ERR, "ioctl (PPPIOCGFLAGS): %m"); return 0; - } + } x = vjcomp ? x | SC_COMP_TCP : x &~ SC_COMP_TCP; x = cidcomp ? x & ~SC_NO_TCP_CCID : x | SC_NO_TCP_CCID; - if(ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) { + if (ioctl(fd, PPPIOCSFLAGS, (caddr_t) &x) < 0) + { syslog(LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); return 0; - } + } - if (vjcomp) { - if (ioctl (fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) { + if (vjcomp) + { + if (ioctl (fd, PPPIOCSMAXCID, (caddr_t) &maxcid) < 0) + { syslog (LOG_ERR, "ioctl(PPPIOCSFLAGS): %m"); return 0; - } - } + } + } return 1; -} + } /* * sifup - Config the interface up and enable IP packets to pass. */ int sifup (int u) -{ + { struct ifreq ifr; strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) + { syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m"); return 0; - } + } ifr.ifr_flags |= (IFF_UP | IFF_POINTOPOINT); - if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) + { syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); return 0; - } + } return 1; -} + } /* * sifdown - Config the interface down and disable IP. */ int sifdown (int u) -{ + { struct ifreq ifr; strncpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) + { syslog(LOG_ERR, "ioctl (SIOCGIFFLAGS): %m"); return 0; - } + } ifr.ifr_flags &= ~IFF_UP; ifr.ifr_flags |= IFF_POINTOPOINT; - if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) + { syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); return 0; - } + } return 1; -} + } /* * sifaddr - Config the interface IP addresses and netmask. */ int sifaddr (int unit, int our_adr, int his_adr, int net_mask) -{ + { struct ifreq ifr; struct rtentry rt; @@ -682,31 +701,39 @@ int sifaddr (int unit, int our_adr, int his_adr, int net_mask) * Set our IP address */ ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr = our_adr; - if (ioctl(sockfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFADDR, (caddr_t) &ifr) < 0) + { if (errno != EEXIST) + { syslog (LOG_ERR, "ioctl(SIOCAIFADDR): %m"); + } else + { syslog (LOG_WARNING, "ioctl(SIOCAIFADDR): Address already exists"); + } return (0); - } + } /* * Set the gateway address */ ((struct sockaddr_in *) &ifr.ifr_dstaddr)->sin_addr.s_addr = his_adr; - if (ioctl(sockfd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFDSTADDR, (caddr_t) &ifr) < 0) + { syslog (LOG_ERR, "ioctl(SIOCSIFDSTADDR): %m"); return (0); - } + } /* * Set the netmask */ - if (net_mask != 0) { + if (net_mask != 0) + { ((struct sockaddr_in *) &ifr.ifr_netmask)->sin_addr.s_addr = net_mask; - if (ioctl(sockfd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) { + if (ioctl(sockfd, SIOCSIFNETMASK, (caddr_t) &ifr) < 0) + { syslog (LOG_ERR, "ioctl(SIOCSIFNETMASK): %m"); return (0); - } - } + } + } /* * Add the device route */ @@ -720,12 +747,13 @@ int sifaddr (int unit, int our_adr, int his_adr, int net_mask) ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr = his_adr; rt.rt_flags = RTF_UP | RTF_HOST; - if (ioctl(sockfd, SIOCADDRT, &rt) < 0) { + if (ioctl(sockfd, SIOCADDRT, &rt) < 0) + { syslog (LOG_ERR, "ioctl(SIOCADDRT) device route: %m"); return (0); - } + } return 1; -} + } /* * cifaddr - Clear the interface IP addresses, and delete routes @@ -733,7 +761,7 @@ int sifaddr (int unit, int our_adr, int his_adr, int net_mask) */ int cifaddr (int unit, int our_adr, int his_adr) -{ + { struct rtentry rt; /* * Delete the route through the device @@ -748,12 +776,13 @@ int cifaddr (int unit, int our_adr, int his_adr) ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr = his_adr; rt.rt_flags = RTF_UP | RTF_HOST; - if (ioctl(sockfd, SIOCDELRT, &rt) < 0) { + if (ioctl(sockfd, SIOCDELRT, &rt) < 0) + { syslog (LOG_ERR, "ioctl(SIOCDELRT) device route: %m"); return (0); - } + } return 1; -} + } /* * path_to_route - determine the path to the proc file system data @@ -773,17 +802,22 @@ static int defaultroute_exists (void); */ static char *path_to_route (void) -{ + { struct mntent *mntent; FILE *fp; fp = fopen (MOUNTED, "r"); - if (fp != 0) { - while ((mntent = getmntent (fp)) != 0) { + if (fp != 0) + { + while ((mntent = getmntent (fp)) != 0) + { if (strcmp (mntent->mnt_type, MNTTYPE_IGNORE) == 0) + { continue; + } - if (strcmp (mntent->mnt_type, "proc") == 0) { + if (strcmp (mntent->mnt_type, "proc") == 0) + { strncpy (route_buffer, mntent->mnt_dir, sizeof (route_buffer)-10); route_buffer [sizeof (route_buffer)-10] = '\0'; @@ -791,66 +825,75 @@ static char *path_to_route (void) fclose (fp); return (route_buffer); - } - } + } + } fclose (fp); - } + } syslog (LOG_ERR, "proc file system not mounted"); return 0; -} + } /* * open_route_table - open the interface to the route table */ static int open_route_table (void) -{ + { char *path; if (route_fd != (FILE *) 0) + { close_route_table(); + } path = path_to_route(); if (path == NULL) + { return 0; + } route_fd = fopen (path, "r"); - if (route_fd == (FILE *) 0) { + if (route_fd == (FILE *) 0) + { syslog (LOG_ERR, "can not open %s: %m", path); return 0; - } + } /* read and discard the header line. */ - if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0) { + if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0) + { close_route_table(); return 0; - } + } return 1; -} + } /* * close_route_table - close the interface to the route table */ static void close_route_table (void) -{ - if (route_fd != (FILE *) 0) { + { + if (route_fd != (FILE *) 0) + { fclose (route_fd); route_fd = (FILE *) 0; - } -} + } + } /* * read_route_table - read the next entry from the route table */ static int read_route_table (struct rtentry *rt) -{ + { static char delims[] = " \t\n"; char *dev_ptr, *ptr, *dst_ptr, *gw_ptr, *flag_ptr; if (fgets (route_buffer, sizeof (route_buffer), route_fd) == (char *) 0) + { return 0; + } memset (rt, '\0', sizeof (struct rtentry)); @@ -860,34 +903,40 @@ static int read_route_table (struct rtentry *rt) flag_ptr = strtok (NULL, delims); /* flags */ ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr = - strtoul (dst_ptr, NULL, 16); /* network order */ + strtoul (dst_ptr, NULL, 16); ((struct sockaddr_in *) &rt->rt_gateway)->sin_addr.s_addr = - strtoul (gw_ptr, NULL, 16); /* network order */ + strtoul (gw_ptr, NULL, 16); rt->rt_flags = (short) strtoul (flag_ptr, NULL, 16); rt->rt_dev = dev_ptr; return 1; -} + } /* * defaultroute_exists - determine if there is a default route */ static int defaultroute_exists (void) -{ + { struct rtentry rt; int result = 0; if (!open_route_table()) + { return 0; + } - while (read_route_table(&rt) != 0) { + while (read_route_table(&rt) != 0) + { if (rt.rt_flags & RTF_UP == 0) + { continue; + } - if (((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr == 0L) { + if (((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr == 0L) + { syslog (LOG_ERR, "ppp not replacing existing default route to %s[%s]", rt.rt_dev, @@ -895,22 +944,24 @@ static int defaultroute_exists (void) sin_addr.s_addr)); result = 1; break; - } - } + } + } close_route_table(); return result; -} + } /* * sifdefaultroute - assign a default route through the address given. */ int sifdefaultroute (int unit, int gateway) -{ + { struct rtentry rt; if (defaultroute_exists()) + { return 0; + } memset (&rt, '\0', sizeof (rt)); SET_SA_FAMILY (rt.rt_dst, AF_INET); @@ -918,19 +969,20 @@ int sifdefaultroute (int unit, int gateway) ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = gateway; rt.rt_flags = RTF_UP | RTF_GATEWAY; - if (ioctl(sockfd, SIOCADDRT, &rt) < 0) { + if (ioctl(sockfd, SIOCADDRT, &rt) < 0) + { syslog (LOG_ERR, "default route ioctl(SIOCADDRT): %m"); return 0; - } + } return 1; -} + } /* * cifdefaultroute - delete a default route through the address given. */ int cifdefaultroute (int unit, int gateway) -{ + { struct rtentry rt; SET_SA_FAMILY (rt.rt_dst, AF_INET); @@ -938,19 +990,20 @@ int cifdefaultroute (int unit, int gateway) ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = gateway; rt.rt_flags = RTF_UP | RTF_GATEWAY; - if (ioctl(sockfd, SIOCDELRT, &rt) < 0) { + if (ioctl(sockfd, SIOCDELRT, &rt) < 0) + { syslog (LOG_ERR, "default route ioctl(SIOCDELRT): %m"); return 0; - } + } return 1; -} + } /* * sifproxyarp - Make a proxy ARP entry for the peer. */ int sifproxyarp (int unit, u_int32_t his_adr) -{ + { struct arpreq arpreq; memset (&arpreq, '\0', sizeof(arpreq)); @@ -958,40 +1011,43 @@ int sifproxyarp (int unit, u_int32_t his_adr) * Get the hardware address of an interface on the same subnet * as our local address. */ - if (!get_ether_addr(his_adr, &arpreq.arp_ha)) { + if (!get_ether_addr(his_adr, &arpreq.arp_ha)) + { syslog(LOG_ERR, "Cannot determine ethernet address for proxy ARP"); return 0; - } + } SET_SA_FAMILY(arpreq.arp_pa, AF_INET); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = his_adr; arpreq.arp_flags = ATF_PERM | ATF_PUBL; - if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) { + if (ioctl(sockfd, SIOCSARP, (caddr_t)&arpreq) < 0) + { syslog(LOG_ERR, "ioctl(SIOCSARP): %m"); return 0; - } + } return 1; -} + } /* * cifproxyarp - Delete the proxy ARP entry for the peer. */ int cifproxyarp (int unit, u_int32_t his_adr) -{ + { struct arpreq arpreq; memset (&arpreq, '\0', sizeof(arpreq)); SET_SA_FAMILY(arpreq.arp_pa, AF_INET); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = his_adr; - if (ioctl(sockfd, SIOCDARP, (caddr_t)&arpreq) < 0) { + if (ioctl(sockfd, SIOCDARP, (caddr_t)&arpreq) < 0) + { syslog(LOG_WARNING, "ioctl(SIOCDARP): %m"); return 0; - } + } return 1; -} + } /* * get_ether_addr - get the hardware address of an interface on the @@ -999,7 +1055,7 @@ int cifproxyarp (int unit, u_int32_t his_adr) */ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) -{ + { struct ifreq *ifr, *ifend, *ifp; int i; u_int32_t ina, mask; @@ -1010,10 +1066,11 @@ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) ifc.ifc_len = sizeof(ifs); ifc.ifc_req = ifs; - if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { + if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) + { syslog(LOG_ERR, "ioctl(SIOCGIFCONF): %m"); return 0; - } + } MAINDEBUG ((LOG_DEBUG, "proxy arp: scanning %d interfaces for IP %s", ifc.ifc_len / sizeof(struct ifreq), ip_ntoa(ipaddr))); /* @@ -1021,8 +1078,10 @@ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) * address on the same subnet as `ipaddr'. */ ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq)); - for (ifr = ifc.ifc_req; ifr < ifend; ifr++) { - if (ifr->ifr_addr.sa_family == AF_INET) { + for (ifr = ifc.ifc_req; ifr < ifend; ifr++) + { + if (ifr->ifr_addr.sa_family == AF_INET) + { ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr; strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name)); MAINDEBUG ((LOG_DEBUG, "proxy arp: examining interface %s", @@ -1032,44 +1091,49 @@ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) * or loopback. */ if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0) + { continue; + } if ((ifreq.ifr_flags & (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP)) != (IFF_UP|IFF_BROADCAST)) + { continue; + } /* * Get its netmask and check that it's on the right subnet. */ if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0) + { continue; + } mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr; MAINDEBUG ((LOG_DEBUG, "proxy arp: interface addr %s mask %lx", ip_ntoa(ina), ntohl(mask))); if (((ipaddr ^ ina) & mask) != 0) + { continue; + } break; - } - } + } + } if (ifr >= ifend) + { return 0; + } syslog(LOG_INFO, "found interface %s for proxy arp", ifreq.ifr_name); /* * Now get the hardware address. */ - if (ioctl (s, SIOCGIFHWADDR, &ifreq) < 0) { + if (ioctl (sockfd, SIOCGIFHWADDR, &ifreq) < 0) + { syslog(LOG_ERR, "SIOCGIFHWADDR(%s): %m", ifreq.ifr_name); return 0; - } - - /* Use the proper family for token ring support. */ - if (ifreq.ifr_hwaddr.sa_family == 0) - hwaddr->sa_family = ARPHRD_ETHER; - else - hwaddr->sa_family = ifreq.ifr_hwaddr.sa_family; + } - /* Well, ethernet has the longest address so far . . . . */ + hwaddr->sa_family = ARPHRD_ETHER; memcpy (&hwaddr->sa_data, &ifreq.ifr_hwaddr.sa_data, ETH_ALEN); MAINDEBUG ((LOG_DEBUG, @@ -1081,7 +1145,7 @@ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) (int) ((unsigned char *) &hwaddr->sa_data)[4], (int) ((unsigned char *) &hwaddr->sa_data)[5])); return 1; -} + } /* * Internal routine to decode the version.modification.patch level @@ -1089,60 +1153,70 @@ int get_ether_addr (u_int32_t ipaddr, struct sockaddr *hwaddr) static void decode_version (char *buf, int *version, int *modification, int *patch) -{ + { - *version = (int) strtoul (buf, &buf, 10); - *modification = 0; - *patch = 0; - - if (*buf == '.') { - ++buf; - *modification = (int) strtoul (buf, &buf, 10); - if (*buf == '.') { - ++buf; - *patch = (int) strtoul (buf, &buf, 10); + *version = (int) strtoul (buf, &buf, 10); + *modification = 0; + *patch = 0; + + if (*buf == '.') + { + ++buf; + *modification = (int) strtoul (buf, &buf, 10); + if (*buf == '.') + { + ++buf; + *patch = (int) strtoul (buf, &buf, 10); + } + } + + if (*buf != '\0') + { + *version = + *modification = + *patch = 0; } } - if (*buf != '\0') { - *version = - *modification = - *patch = 0; - } -} - /* * ppp_available - check whether the system has any ppp interfaces * (in fact we check whether we can do an ioctl on ppp0). */ int ppp_available(void) -{ + { int s, ok; struct ifreq ifr; - int my_version, my_modification, my_patch; + int my_version, my_modification, my_patch; /* * Open a socket for doing the ioctl operations. */ s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) + { return 0; + } strncpy (ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name)); - ok = ioctl(sockfd, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0; + ok = ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) >= 0; /* * Ensure that the hardware address is for PPP and not something else */ if (ok != 0) + { ok = ioctl (s, SIOCGIFHWADDR, (caddr_t) &ifr) >= 0; + } if (ok != 0 && ifr.ifr_hwaddr.sa_family != ARPHRD_PPP) + { ok = 0; + } /* * This is the PPP device. Validate the version of the driver at this * point to ensure that this program will work with the driver. */ - if (ok != 0) { + if (ok != 0) + { char abBuffer [1024]; int size; @@ -1150,19 +1224,21 @@ int ppp_available(void) size = ioctl (s, SIOCGPPPVER, (caddr_t) &ifr); ok = size >= 0; - if (ok != 0) { + if (ok != 0) + { decode_version (abBuffer, &driver_version, &driver_modification, &driver_patch); - } - } - - if (ok == 0) { + } + } + + if (ok == 0) + { driver_version = driver_modification = driver_patch = 0; - } + } /* * Validate the version of the driver against the version that we used. */ @@ -1173,27 +1249,42 @@ int ppp_available(void) /* The version numbers must match */ if (driver_version != my_version) + { ok = 0; + } /* The modification levels must be legal */ if (driver_modification < my_modification) + { ok = 0; + } - close(s); - - if (ok == 0) { + if (ok == 0) + { fprintf(stderr, "Sorry - PPP driver version %d.%d.%d is out of date\n", driver_version, driver_modification, driver_patch); - exit (1); /* avoid confusing error message 'ppp is not supported'. */ - } - + } + + close(s); return ok; -} + } int logwtmp (char *line, char *name, char *host) -{ + { struct utmp ut; - + int mode; +/* + * Control the 'mesg' function based upon the state of the logon + * operation. + */ + mode = (*name != '\0') ? 0600 : 0622; + if (chmod (devnam, mode) < 0) + { + syslog (LOG_ERR, "chmod(\"%s\", 0%o): %m", devnam, mode); + } +/* + * Update the signon database for users. + */ memset (&ut, 0, sizeof (ut)); (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line)); (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name)); @@ -1202,14 +1293,14 @@ int logwtmp (char *line, char *name, char *host) pututline (&ut); /* Write the line to the proper place */ endutent(); /* Indicate operation is complete */ -} + } /* * Code for locking/unlocking the serial device. * This code is derived from chat.c. */ -#define LOCKPREFIX "/usr/spool/uucp/LCK.." +#define LOCK_PREFIX "/var/lock/LCK.." /* * lock - create a lock file for the named device @@ -1236,7 +1327,7 @@ lock(dev) n = read(fd, hdb_lock_buffer, 11); if (n > 0) { hdb_lock_buffer[n] = 0; - pid = atoi(hdb_lock_buffer); + sscanf (hdb_lock_buffer, " %d", &pid); } if (n <= 0) { syslog(LOG_ERR, "Can't read pid from lock file %s", lock_file); @@ -1264,7 +1355,7 @@ lock(dev) return -1; } - sprintf(hdb_lock_buffer, "%10d\n", getpid()); + sprintf(hdb_lock_buffer, "%010d\n", getpid()); write(fd, hdb_lock_buffer, 11); close(fd);