devinfo(3) problem...

Daniel Rudy dr2867 at pacbell.net
Sun Oct 23 19:56:58 PDT 2005


Consider the following code fragment:


(segment 2)
Calling code section:
    /* get devinfo root nexus */
    printf("root ptr: %p\n", root);
    result = usb_devinfo_root(&root);
    printf("root ptr: %p\n", root);
    if (result < 0)
      {
        usb_devinfo_close();
        return(-1);
      }

/* internal: get devinfo root nexus */
int usb_devinfo_root(struct devinfo_dev **root)
  {
    printf("root: %p\n", *root);
    *root = devinfo_handle_to_device(DEVINFO_ROOT_DEVICE);
    printf("root: %p\n", *root);  <---- second call printf
    if (*root == NULL)
      {
        if (usb_param_use_error == TRUE) error("usb.c: usb_devinfo_root:
root device not found", errno);
        if (usb_param_errors_fatal == TRUE) exit(2);
        return(-1);
      }
    return(0);
  }

The problem is that devinfo_handle_to_device always returns a null
pointer here.  Why?   The next code segment, devinfo_handle_to_device
returns a proper address.

(segment 1)
    /* get devinfo root nexus */
    root = devinfo_handle_to_device(DEVINFO_ROOT_DEVICE);
    if (root == NULL)
      {
        devinfo_free();
        return(-1);
      }

output:
usb_param_devmode: 255
usb_param_devtype: 255
usb_param_mode_pref: 0
ioctl result: -1
devinfo result: 0
found_ioctl: 0
found_devinfo: 1    <---- first call
devinfo device name: umass0
usb_devinfo_open result: 0
root ptr: 0x2815769c
root: 0x2815769c
root: 0x0           <---- second call
usb.c: usb_devinfo_root: root device not found: No such file or directory
root ptr: 0x0
Fatal: Unable to get device information


Now I have made sure that I have called devinfo_free() during the first
call before calling devinfo_init() a second time.  I tried calling this
code branch on the first time, and it executes properly, so why does it
fail on the second call?

-- 
Daniel Rudy



More information about the freebsd-hackers mailing list