/* di_devlink callback for dev_di_node_add */ static int disk_devlink_callback(di_devlink_t dl, void *arg) { disk_cbdata_t *cbp = (disk_cbdata_t *)arg; topo_mod_t *mod = cbp->dcb_mod; dev_di_node_t *dnode = cbp->dcb_dnode; const char *devpath; char *ctds, *slice; devpath = di_devlink_path(dl); if ((dnode == NULL) || (devpath == NULL)) return (DI_WALK_TERMINATE); /* trim the slice off the public name */ if (((ctds = strrchr(devpath, '/')) != NULL) && ((slice = strchr(ctds, 's')) != NULL)) *slice = '\0'; /* Establish the public /dev name (no slice) */ dnode->ddn_lpath = topo_mod_strdup(mod, ctds ? ctds + 1 : devpath); if (ctds && slice) *slice = 's'; return (DI_WALK_TERMINATE); }
static int walk_devlinks(di_devlink_t devlink, void *arg) { char **path= (char **)arg; *path = strdup(di_devlink_path(devlink)); return (DI_WALK_TERMINATE); }
static int link_cb(di_devlink_t devlink, void *arg) { const char *result; result = di_devlink_path(devlink); if (result == NULL) { arg = (void *)"(null)"; } else { (void) strlcpy(arg, result, strlen(result)); } logmsg(MSG_INFO, "\nlink_cb::linkdata->resultstr = %s\n", ((result != NULL) ? result : "(null)")); return (DI_WALK_CONTINUE); }
/* di_devlink callback to add a /dev entry to nmlist */ static int devlink_callback(di_devlink_t dl, void *arg) { struct devlink_cbinfo *cbip = (struct devlink_cbinfo *)arg; char *devpath = (char *)di_devlink_path(dl); if (strncmp(devpath, cbip->cbi_search_path, strlen(cbip->cbi_search_path)) == 0) { if (nmlist_add(cbip->cbi_nlhp, devpath) == NULL) { cbip->cbi_error = 1; return (DI_WALK_TERMINATE); } } return (DI_WALK_CONTINUE); }
static int get_devlink(di_devlink_t devlink, void *arg) { walk_devlink_t *warg = (walk_devlink_t *)arg; log(LOG_INFO, "get_devlink()", " - enter"); *(warg->linkpp) = strdup(di_devlink_path(devlink)); log(LOG_INFO, "get_devlink()", " - exit"); return (DI_WALK_TERMINATE); }
int check_mpath_link(di_devlink_t devlink, void *arg) { const char *link_path; lu_obj *Obj; link_path = di_devlink_path(devlink); Obj = pLuObj; while (Obj) { if (Obj->node == DI_NODE_NIL) { if (strcmp(Obj->path, link_path) == 0) { Obj->node = (di_node_t)arg; break; } } Obj = Obj->next; } return (DI_WALK_CONTINUE); }
static int sunos_add_devices(di_devlink_t link, void *arg) { struct devlink_cbarg *largs = (struct devlink_cbarg *)arg; struct node_args *nargs; di_node_t myself, pnode; uint64_t session_id = 0; uint16_t bdf = 0; struct libusb_device *dev; sunos_dev_priv_t *devpriv; const char *path, *newpath; int n, i; int *addr_prop; uint8_t bus_number = 0; nargs = (struct node_args *)largs->nargs; myself = largs->myself; if (nargs->last_ugenpath) { /* the same node's links */ return (DI_WALK_CONTINUE); } /* * Construct session ID. * session ID = ...parent hub addr|hub addr|dev addr. */ pnode = myself; i = 0; while (pnode != DI_NODE_NIL) { if (di_prop_exists(DDI_DEV_T_ANY, pnode, "root-hub") == 1) { /* walk to root */ uint32_t *regbuf = NULL; uint32_t reg; n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, "reg", (int **)®buf); reg = regbuf[0]; bdf = (PCI_REG_BUS_G(reg) << 8) | (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); session_id |= (bdf << i * 8); /* same as 'unit-address' property */ bus_number = (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); usbi_dbg("device bus address=%s:%x", di_bus_addr(pnode), bus_number); break; } /* usb_addr */ n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, "assigned-address", &addr_prop); if ((n != 1) || (addr_prop[0] == 0)) { usbi_dbg("cannot get valid usb_addr"); return (DI_WALK_CONTINUE); } session_id |= ((addr_prop[0] & 0xff) << i * 8); if (++i > 7) break; pnode = di_parent_node(pnode); } path = di_devlink_path(link); dev = usbi_get_device_by_session_id(nargs->ctx, session_id); if (dev == NULL) { dev = usbi_alloc_device(nargs->ctx, session_id); if (dev == NULL) { usbi_dbg("can't alloc device"); return (DI_WALK_TERMINATE); } devpriv = (sunos_dev_priv_t *)dev->os_priv; if ((newpath = strrchr(path, '/')) == NULL) { libusb_unref_device(dev); return (DI_WALK_TERMINATE); } devpriv->ugenpath = strndup(path, strlen(path) - strlen(newpath)); dev->bus_number = bus_number; if (sunos_fill_in_dev_info(myself, dev) != LIBUSB_SUCCESS) { libusb_unref_device(dev); return (DI_WALK_TERMINATE); } if (usbi_sanitize_device(dev) < 0) { libusb_unref_device(dev); usbi_dbg("sanatize failed: "); return (DI_WALK_TERMINATE); } } else { usbi_dbg("Dev %s exists", path); } devpriv = (sunos_dev_priv_t *)dev->os_priv; if (nargs->last_ugenpath == NULL) { /* first device */ nargs->last_ugenpath = devpriv->ugenpath; if (discovered_devs_append(*(nargs->discdevs), dev) == NULL) { usbi_dbg("cannot append device"); } /* * we alloc and hence ref this dev. We don't need to ref it * hereafter. Front end or app should take care of their ref. */ libusb_unref_device(dev); } usbi_dbg("Device %s %s id=0x%llx, devcount:%d, bdf=%x", devpriv->ugenpath, path, (uint64_t)session_id, (*nargs->discdevs)->len, bdf); return (DI_WALK_CONTINUE); }
static int add_devpath(di_devlink_t devlink, void *arg) { struct search_args *args; char *devidstr; disk_t *diskp; char kernel_name[MAXPATHLEN]; args = (struct search_args *)arg; /* * Get the diskp value from calling have_disk. Can either be found * by kernel name or devid. */ diskp = NULL; devidstr = get_str_prop(DEVICE_ID_PROP, args->node); (void) snprintf(kernel_name, sizeof (kernel_name), "%s%d", di_node_name(args->node), di_instance(args->node)); (void) have_disk(args, devidstr, kernel_name, &diskp); /* * The devlink_path is usually of the form /dev/rdsk/c0t0d0s0. * For diskettes it is /dev/rdiskette*. * On Intel we would also get each fdisk partition as well * (e.g. /dev/rdsk/c0t0d0p0). */ if (diskp != NULL) { alias_t *ap; char *devlink_path; if (diskp->drv_type != DM_DT_FLOPPY) { /* * Add other controllers for multipath disks. * This will have no effect if the controller * relationship is already set up. */ if (add_disk2controller(diskp, args) != 0) { args->dev_walk_status = ENOMEM; } } (void) snprintf(kernel_name, sizeof (kernel_name), "%s%d", di_node_name(args->node), di_instance(args->node)); devlink_path = (char *)di_devlink_path(devlink); if (dm_debug > 1) { (void) fprintf(stderr, "INFO: devpath %s\n", devlink_path); } if ((ap = find_alias(diskp, kernel_name)) == NULL) { if (new_alias(diskp, kernel_name, devlink_path, args) != 0) { args->dev_walk_status = ENOMEM; } } else { /* * It is possible that we have already added this * devpath. Do not add it again. new_devpath will * return a 0 if found, and not add the path. */ if (new_devpath(ap, devlink_path) != 0) { args->dev_walk_status = ENOMEM; } } } return (DI_WALK_CONTINUE); }