X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsys-solaris.c;h=809b506a3640d34879fd8d9be303912bc81b5caa;hp=24c3776eb111eaaaf5e69fecf45e4c5a8af12079;hb=4a54e34cf5629f9fed61f0b7d69ee3ba4d874bc6;hpb=d0ccb87156c295da4f679f35936a976cea46d38c diff --git a/pppd/sys-solaris.c b/pppd/sys-solaris.c index 24c3776..809b506 100644 --- a/pppd/sys-solaris.c +++ b/pppd/sys-solaris.c @@ -85,6 +85,10 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include @@ -127,6 +131,10 @@ #include #endif +#ifdef PPP_FILTER +#include +#endif + #include "pppd.h" #include "fsm.h" #include "lcp.h" @@ -218,10 +226,7 @@ static int if6_is_up = 0; /* IPv6 interface has been marked up */ #endif /* defined(INET6) && defined(SOL2) */ -#if defined(INET6) && defined(SOL2) -static char first_ether_name[LIFNAMSIZ]; /* Solaris 8 and above */ -#else -static char first_ether_name[IFNAMSIZ]; /* Before Solaris 8 */ +#if !defined(INET6) || !defined(SOL2) #define MAXIFS 256 /* Max # of interfaces */ #endif /* defined(INET6) && defined(SOL2) */ @@ -261,7 +266,7 @@ static int get_hw_addr(char *, u_int32_t, struct sockaddr *); static int get_hw_addr_dlpi(char *, struct sockaddr *); static int dlpi_attach(int, int); static int dlpi_info_req(int); -static int dlpi_get_reply(int, union DL_primitives *, int, int); +static int dlpi_get_reply(int, union DL_primitives *, int, size_t); static int strioctl(int, int, void *, int, int); #ifdef SOL2 @@ -294,13 +299,13 @@ sifppa(fd, ppa) #if defined(SOL2) && defined(INET6) /* - * get_first_ethernet - returns the first Ethernet interface name found in - * the system, or NULL if none is found + * get_first_ether_hwaddr - get the hardware address for the first + * ethernet-style interface on this system. * * NOTE: This is the lifreq version (Solaris 8 and above) */ -char * -get_first_ethernet(void) +int +get_first_ether_hwaddr(u_char *addr) { struct lifnum lifn; struct lifconf lifc; @@ -312,7 +317,7 @@ get_first_ethernet(void) fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { - return 0; + return -1; } /* @@ -323,7 +328,7 @@ get_first_ethernet(void) if (ioctl(fd, SIOCGLIFNUM, &lifn) < 0) { close(fd); error("could not determine number of interfaces: %m"); - return 0; + return -1; } num_ifs = lifn.lifn_count; @@ -332,7 +337,7 @@ get_first_ethernet(void) if (req == NULL) { close(fd); error("out of memory"); - return 0; + return -1; } /* @@ -346,7 +351,7 @@ get_first_ethernet(void) close(fd); free(req); error("SIOCGLIFCONF: %m"); - return 0; + return -1; } /* @@ -363,10 +368,8 @@ get_first_ethernet(void) memset(&lifr, 0, sizeof(lifr)); strncpy(lifr.lifr_name, plifreq->lifr_name, sizeof(lifr.lifr_name)); if (ioctl(fd, SIOCGLIFFLAGS, &lifr) < 0) { - close(fd); - free(req); error("SIOCGLIFFLAGS: %m"); - return 0; + break; } fl = lifr.lifr_flags; @@ -374,27 +377,29 @@ get_first_ethernet(void) != (IFF_UP | IFF_BROADCAST)) continue; + if (get_if_hwaddr(addr, lifr.lifr_name) < 0) + continue; + found = 1; break; } free(req); close(fd); - if (found) { - strncpy(first_ether_name, lifr.lifr_name, sizeof(first_ether_name)); - return (char *)first_ether_name; - } else - return NULL; + if (found) + return 0; + else + return -1; } #else /* - * get_first_ethernet - returns the first Ethernet interface name found in - * the system, or NULL if none is found + * get_first_ether_hwaddr - get the hardware address for the first + * ethernet-style interface on this system. * * NOTE: This is the ifreq version (before Solaris 8). */ -char * -get_first_ethernet(void) +int +get_first_ether_hwaddr(u_char *addr) { struct ifconf ifc; struct ifreq *pifreq; @@ -405,7 +410,7 @@ get_first_ethernet(void) fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { - return 0; + return -1; } /* @@ -420,7 +425,7 @@ get_first_ethernet(void) if (req == NULL) { close(fd); error("out of memory"); - return 0; + return -1; } /* @@ -432,7 +437,7 @@ get_first_ethernet(void) close(fd); free(req); error("SIOCGIFCONF: %m"); - return 0; + return -1; } /* @@ -449,10 +454,8 @@ get_first_ethernet(void) memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, pifreq->ifr_name, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { - close(fd); - free(req); error("SIOCGIFFLAGS: %m"); - return 0; + break; } fl = ifr.ifr_flags; @@ -460,17 +463,19 @@ get_first_ethernet(void) != (IFF_UP | IFF_BROADCAST)) continue; + if (get_if_hwaddr(addr, ifr.ifr_name) < 0) + continue; + found = 1; break; } free(req); close(fd); - if (found) { - strncpy(first_ether_name, ifr.ifr_name, sizeof(first_ether_name)); - return (char *)first_ether_name; - } else - return NULL; + if (found) + return 0; + else + return -1; } #endif /* defined(SOL2) && defined(INET6) */ @@ -1502,7 +1507,7 @@ netif_get_mtu(int unit) error("ioctl(SIOCGIFMTU): %m (line %d)", __LINE__); return 0; } - return ifr.ifr_mtu; + return ifr.ifr_metric; } /* @@ -1639,33 +1644,6 @@ get_ppp_stats(int u, struct pppd_stats *stats) return 1; } -#if 0 -/* - * set_filters - transfer the pass and active filters to the kernel. - */ -int -set_filters(struct bpf_program *pass, struct bpf_program *active) -{ - int ret = 1; - - if (pass->bf_len > 0) { - if (strioctl(pppfd, PPPIO_PASSFILT, pass, - sizeof(struct bpf_program), 0) < 0) { - error("Couldn't set pass-filter in kernel: %m"); - ret = 0; - } - } - if (active->bf_len > 0) { - if (strioctl(pppfd, PPPIO_ACTIVEFILT, active, - sizeof(struct bpf_program), 0) < 0) { - error("Couldn't set active-filter in kernel: %m"); - ret = 0; - } - } - return ret; -} -#endif - /* * ccp_fatal_error - returns 1 if decompression was disabled as a * result of an error detected after decompression of a packet, @@ -2318,7 +2296,7 @@ dlpi_info_req(int fd) } static int -dlpi_get_reply(int fd, union DL_primitives *reply, int expected_prim, maxlen) +dlpi_get_reply(int fd, union DL_primitives *reply, int expected_prim, size_t maxlen) { struct strbuf buf; int flags, n;