bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

extending devprobe for netdde


From: Samuel Thibault
Subject: extending devprobe for netdde
Date: Sat, 5 May 2012 14:27:09 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Hello,

There's currently no way to know whether netdde found a network device,
because devprobe only works with mach devices.  It should however not be
hard to extend it to work with netdde: it should be a matter of doing in
devprobe something like commit d3ad9490749fe330bea91c0027a0c8319476cac0
in pfinet, see below.

Could someone have a look?

Samuel

commit d3ad9490749fe330bea91c0027a0c8319476cac0
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Sun Feb 19 05:32:36 2012 +0100

    Make pfinet try both a filepath and kernel device
    
    pfinet/ethernet.c (ethernet_open): Try to file_name_lookup() the device as
    filepath before opening the Mach device.

diff --git a/pfinet/ethernet.c b/pfinet/ethernet.c
index dab5c56..f366919 100644
--- a/pfinet/ethernet.c
+++ b/pfinet/ethernet.c
@@ -166,14 +166,33 @@ ethernet_open (struct device *dev)
 
   mach_port_set_qlimit (mach_task_self (), edev->readptname, 
MACH_PORT_QLIMIT_MAX);
 
-  err = get_privileged_ports (0, &master_device);
-  if (err)
-    error (2, err, "cannot get device master port");
-
-  err = device_open (master_device, D_WRITE | D_READ, dev->name, 
&edev->ether_port);
-  mach_port_deallocate (mach_task_self (), master_device);
-  if (err)
-    error (2, err, "%s", dev->name);
+  master_device = file_name_lookup (dev->name, O_READ | O_WRITE, 0);
+  if (master_device != MACH_PORT_NULL)
+    {
+      /* The device name here is the path of a device file.  */
+      err = device_open (master_device, D_WRITE | D_READ, "eth", 
&edev->ether_port);
+      mach_port_deallocate (mach_task_self (), master_device);
+      if (err)
+       error (2, err, "%s", dev->name);
+    }
+  else
+    {
+      /* No, perhaps a Mach device?  */
+      int file_errno = errno;
+      err = get_privileged_ports (0, &master_device);
+      if (err)
+       {
+         error (0, errno, "file_name_lookup %s", dev->name);
+         error (2, err, "and cannot get device master port");
+       }
+      err = device_open (master_device, D_WRITE | D_READ, dev->name, 
&edev->ether_port);
+      mach_port_deallocate (mach_task_self (), master_device);
+      if (err)
+       {
+         error (0, errno, "file_name_lookup %s", dev->name);
+         error (2, err, "%s", dev->name);
+       }
+    }
 
   err = device_set_filter (edev->ether_port, ports_get_right (edev->readpt),
                           MACH_MSG_TYPE_MAKE_SEND, 0,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]