aboutsummaryrefslogtreecommitdiff
path: root/pfinet/iioctl-ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'pfinet/iioctl-ops.c')
-rw-r--r--pfinet/iioctl-ops.c43
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,