diff options
Diffstat (limited to 'pfinet/iioctl-ops.c')
-rw-r--r-- | pfinet/iioctl-ops.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/pfinet/iioctl-ops.c b/pfinet/iioctl-ops.c index a2a37144..c0dd6d5f 100644 --- a/pfinet/iioctl-ops.c +++ b/pfinet/iioctl-ops.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000, 2007 Free Software Foundation, Inc. Written by Marcus Brinkmann. This file is part of the GNU Hurd. @@ -34,6 +34,7 @@ #include <sys/ioctl.h> #include <net/if.h> +#include <net/sock.h> extern struct notifier_block *netdev_chain; @@ -87,17 +88,20 @@ siocgifXaddr (io_t port, sockaddr_t *addr, enum siocgif_type type) { + struct sock_user *user = begin_using_socket_port (port); error_t err = 0; struct device *dev; struct sockaddr_in *sin = (struct sockaddr_in *) addr; uint32_t addrs[4]; - if (!port) + if (!user) return EOPNOTSUPP; dev = get_dev (ifnam); if (!dev) err = ENODEV; + else if (user->sock->sk->family != AF_INET) + err = EINVAL; else { sin->sin_family = AF_INET; @@ -105,7 +109,9 @@ siocgifXaddr (io_t port, inquire_device (dev, &addrs[0], &addrs[1], &addrs[2], &addrs[3]); sin->sin_addr.s_addr = addrs[type]; } + __mutex_unlock (&global_lock); + end_using_socket_port (user); return err; } @@ -142,6 +148,8 @@ siocsifXaddr (io_t port, err = ENODEV; else if (sin->sin_family != AF_INET) err = EINVAL; + else if (user->sock->sk->family != AF_INET) + err = EINVAL; else { inquire_device (dev, &addrs[0], &addrs[1], &addrs[2], &addrs[3]); @@ -180,7 +188,11 @@ S_iioctl_siocsifflags (io_t port, else if (!dev) err = ENODEV; else - err = dev_change_flags(dev, flags); + { + err = dev_change_flags (dev, flags); + if (!err) + err = ethernet_change_flags (dev, flags); + } __mutex_unlock (&global_lock); end_using_socket_port (user); @@ -263,6 +275,31 @@ SIOCGIF (brdaddr, BRDADDR); /* 37 SIOCGIFNETMASK -- Get netmask of a network interface. */ SIOCGIF (netmask, NETMASK); +/* 39 SIOCGIFHWADDR -- Get the hardware address of a network interface. */ +error_t +S_iioctl_siocgifhwaddr (io_t port, + ifname_t ifname, + sockaddr_t *addr) +{ + error_t err = 0; + struct device *dev; + + if (!port) + return EOPNOTSUPP; + + dev = get_dev (ifname); + if (!dev) + err = ENODEV; + else + { + memcpy (addr->sa_data, dev->dev_addr, dev->addr_len); + addr->sa_family = dev->type; + } + + __mutex_unlock (&global_lock); + return err; +} + /* 51 SIOCGIFMTU -- Get mtu of a network interface. */ error_t S_iioctl_siocgifmtu (io_t port, |