Lines Matching +full:sound +full:- +full:name +full:- +full:prefix
17 * information: Portions Copyright [yyyy] [name of copyright owner]
71 * populate the database with /devices -> /dev mappings. Another set
90 * ---------------------
92 * | ----------------- |
94 * | ----------------- |
96 * ---------------------
101 * ---------------------
106 * ---------------------
111 * ---------------------
116 * ---------------------
134 * Allocate a read-write handle but open the DB in readonly in di_devlink_open()
144 * We don't want to unlink the db at this point - if we did we in di_devlink_open()
188 CACHE(hdp)->update_count = DB_HDR(hdp)->update_count; in di_devlink_open()
189 (void) read_nodes(hdp, NULL, DB_HDR(hdp)->root_idx); in di_devlink_open()
190 (void) read_links(hdp, NULL, DB_HDR(hdp)->dngl_idx); in di_devlink_open()
213 dir = hdp->db_dir; in get_db_path()
236 return (-1); in open_db()
239 if ((page_sz = sysconf(_SC_PAGE_SIZE)) == -1) { in open_db()
240 return (-1); in open_db()
245 * call will zero-fill the entire file in open_db()
260 return (-1); in open_db()
263 if ((fd = open(path, flg, DB_PERMS)) == -1) { in open_db()
264 return (-1); in open_db()
277 if (rv == -1 || sz < HDR_LEN) { in open_db()
278 if (rv != -1) in open_db()
281 return (-1); in open_db()
287 return (-1); in open_db()
289 DB(hdp)->hdr = (struct db_hdr *)cp; in open_db()
290 DB(hdp)->db_fd = fd; in open_db()
291 DB(hdp)->flags = flags; in open_db()
303 return (-1); in open_db()
312 * A handle can be allocated for read-only or read-write access
349 * The dev dir is at /dev i.e. we are not doing a -r /altroot in handle_alloc()
380 if (fd == -1 && errno == EROFS && stat(can_path, &sb) == -1) in handle_alloc()
382 if (fd != -1) { in handle_alloc()
389 * Readers can be non-privileged so we cannot test by creating in handle_alloc()
398 if (stat(can_path, &sb) == -1 && stat(install_path, &sb) in handle_alloc()
399 != -1 && sb.st_uid == 0) { in handle_alloc()
414 proto.lock_fd = -1; in handle_alloc()
417 * Lock database if a read-write handle is being allocated. in handle_alloc()
427 DB(&proto)->db_fd = -1; in handle_alloc()
443 if ((hdp->dev_dir = strdup(proto.dev_dir)) == NULL) { in handle_alloc()
448 if ((hdp->db_dir = strdup(proto.db_dir)) == NULL) { in handle_alloc()
449 free(hdp->dev_dir); in handle_alloc()
479 CACHE(hdp)->hash = calloc(hash_sz, sizeof (cache_link_t *)); in cache_alloc()
480 if (CACHE(hdp)->hash == NULL) { in cache_alloc()
481 return (-1); in cache_alloc()
483 CACHE(hdp)->hash_sz = hash_sz; in cache_alloc()
496 if (DB_HDR(hdp)->magic != DB_MAGIC || DB_HDR(hdp)->vers != DB_VERSION) { in invalid_db()
500 if (DB_HDR(hdp)->page_sz == 0 || DB_HDR(hdp)->page_sz != page_sz) { in invalid_db()
520 if (!VALID_INDEX(hdp, DB_NODE, DB_HDR(hdp)->root_idx)) { in invalid_db()
524 if (!VALID_INDEX(hdp, DB_LINK, DB_HDR(hdp)->dngl_idx)) { in invalid_db()
535 cp = get_string(hdp, DB_NUM(hdp, DB_STR) - 1); in invalid_db()
556 if ((pcnp == NULL) ^ (nidx == DB_HDR(hdp)->root_idx)) { in read_nodes()
560 return (-1); in read_nodes()
563 for (; dnp = get_node(hdp, nidx); nidx = dnp->sib) { in read_nodes()
565 path = get_string(hdp, dnp->path); in read_nodes()
576 assert(strcmp(path, "/") ^ (nidx == DB_HDR(hdp)->root_idx)); in read_nodes()
577 assert(strcmp(path, "/") != 0 || dnp->sib == DB_NIL); in read_nodes()
579 if (read_minors(hdp, cnp, dnp->minor) != 0 || in read_nodes()
580 read_nodes(hdp, cnp, dnp->child) != 0) { in read_nodes()
585 fcn, nidx, cnp->path); in read_nodes()
588 return (dnp ? -1 : 0); in read_nodes()
596 char *name, *nodetype; in read_minors() local
605 return (-1); in read_minors()
608 for (; dmp = get_minor(hdp, nidx); nidx = dmp->sib) { in read_minors()
610 name = get_string(hdp, dmp->name); in read_minors()
611 nodetype = get_string(hdp, dmp->nodetype); in read_minors()
613 cmnp = minor_insert(hdp, pcnp, name, nodetype, NULL); in read_minors()
620 fcn, nidx, cmnp->name); in read_minors()
622 if (read_links(hdp, cmnp, dmp->link) != 0) { in read_minors()
627 return (dmp ? -1 : 0); in read_minors()
643 ((pcmp == NULL) ^ (nidx == DB_HDR(hdp)->dngl_idx))) { in read_links()
647 return (-1); in read_links()
650 for (; dlp = get_link(hdp, nidx); nidx = dlp->sib) { in read_links()
652 path = get_string(hdp, dlp->path); in read_links()
653 content = get_string(hdp, dlp->content); in read_links()
655 clp = link_insert(hdp, pcmp, path, content, dlp->attr); in read_links()
662 nidx, clp->path, pcmp == NULL ? "(DANGLING)" : ""); in read_links()
665 return (dlp ? -1 : 0); in read_links()
679 return (-1); in di_devlink_close()
697 return (-1); in di_devlink_close()
710 "di_devlink_close: update_count = %u\n", CACHE(hdp)->update_count); in di_devlink_close()
718 if (CACHE(hdp)->update_count == 0) { in di_devlink_close()
719 CACHE(hdp)->update_count = 1; in di_devlink_close()
745 return (-1); in di_devlink_close()
757 (void) write_links(hdp, NULL, CACHE(hdp)->dngl, next); in di_devlink_close()
758 DB_HDR(hdp)->update_count = CACHE(hdp)->update_count; in di_devlink_close()
769 return (-1); in di_devlink_close()
788 DB_HDR(hdp)->magic = DB_MAGIC; in init_hdr()
789 DB_HDR(hdp)->vers = DB_VERSION; in init_hdr()
790 DB_HDR(hdp)->root_idx = DB_NIL; in init_hdr()
791 DB_HDR(hdp)->dngl_idx = DB_NIL; in init_hdr()
792 DB_HDR(hdp)->page_sz = (uint32_t)page_sz; in init_hdr()
815 for (; cnp != NULL; cnp = cnp->sib) { in write_nodes()
817 assert(cnp->path != NULL); in write_nodes()
822 "%s: invalid parent for: %s\n", fcn, cnp->path); in write_nodes()
827 assert((strcmp(cnp->path, "/") != 0) ^ in write_nodes()
836 dnp->path = write_string(hdp, cnp->path, next); in write_nodes()
837 if (dnp->path == DB_NIL) { in write_nodes()
845 assert(DB_HDR(hdp)->root_idx == DB_NIL); in write_nodes()
846 DB_HDR(hdp)->root_idx = idx; in write_nodes()
848 dnp->sib = pdnp->child; in write_nodes()
849 pdnp->child = idx; in write_nodes()
853 cnp->path); in write_nodes()
855 if (write_minors(hdp, dnp, cnp->minor, next) != 0 || in write_nodes()
856 write_nodes(hdp, dnp, cnp->child, next) != 0) { in write_nodes()
861 return (cnp ? -1 : 0); in write_nodes()
879 fcn, cmnp ? cmnp->name : "<NULL>"); in write_minors()
881 return (-1); in write_minors()
884 for (; cmnp != NULL; cmnp = cmnp->sib) { in write_minors()
886 assert(cmnp->name != NULL); in write_minors()
894 dmp->name = write_string(hdp, cmnp->name, next); in write_minors()
895 dmp->nodetype = write_string(hdp, cmnp->nodetype, next); in write_minors()
896 if (dmp->name == DB_NIL || dmp->nodetype == DB_NIL) { in write_minors()
897 dmp->name = dmp->nodetype = DB_NIL; in write_minors()
905 dmp->sib = pdnp->minor; in write_minors()
906 pdnp->minor = idx; in write_minors()
909 fcn, idx, cmnp->name); in write_minors()
911 if (write_links(hdp, dmp, cmnp->link, next) != 0) { in write_minors()
916 return (cmnp ? -1 : 0); in write_minors()
933 if (clp != NULL && ((pdmp == NULL) ^ (clp == CACHE(hdp)->dngl))) { in write_links()
937 return (-1); in write_links()
940 for (; clp != NULL; clp = clp->sib) { in write_links()
942 assert(clp->path != NULL); in write_links()
944 if ((pdmp == NULL) ^ (clp->minor == NULL)) { in write_links()
946 "%s: invalid minor for link(%s)\n", fcn, clp->path); in write_links()
957 dlp->path = write_string(hdp, clp->path, next); in write_links()
958 dlp->content = write_string(hdp, clp->content, next); in write_links()
959 if (dlp->path == DB_NIL || dlp->content == DB_NIL) { in write_links()
960 dlp->path = dlp->content = DB_NIL; in write_links()
965 dlp->attr = clp->attr; in write_links()
971 dlp->sib = pdmp->link; in write_links()
972 pdmp->link = idx; in write_links()
974 dlp->sib = DB_HDR(hdp)->dngl_idx; in write_links()
975 DB_HDR(hdp)->dngl_idx = idx; in write_links()
979 fcn, idx, clp->path, pdmp == NULL ? "(DANGLING)" : ""); in write_links()
982 return (clp ? -1 : 0); in write_links()
1026 assert(DB(hdp)->db_fd == -1); in close_db()
1027 assert(DB(hdp)->flags == 0); in close_db()
1051 DB(hdp)->hdr = NULL; in close_db()
1053 (void) close(DB(hdp)->db_fd); in close_db()
1054 DB(hdp)->db_fd = -1; in close_db()
1055 DB(hdp)->flags = 0; in close_db()
1057 return (rv ? -1 : 0); in close_db()
1073 while (CACHE(hdp)->dngl != NULL) { in cache_free()
1074 clp = CACHE(hdp)->dngl; in cache_free()
1075 CACHE(hdp)->dngl = clp->sib; in cache_free()
1076 assert(clp->minor == NULL); in cache_free()
1080 assert((CACHE(hdp)->hash == NULL) ^ (CACHE(hdp)->hash_sz != 0)); in cache_free()
1082 free(CACHE(hdp)->hash); in cache_free()
1083 CACHE(hdp)->hash = NULL; in cache_free()
1084 CACHE(hdp)->hash_sz = 0; in cache_free()
1102 assert(hdp->lock_fd == -1); in handle_free()
1104 free(hdp->dev_dir); in handle_free()
1105 free(hdp->db_dir); in handle_free()
1123 while ((*pp)->child != NULL) { in subtree_free()
1124 np = (*pp)->child; in subtree_free()
1125 (*pp)->child = np->sib; in subtree_free()
1129 while ((*pp)->minor != NULL) { in subtree_free()
1130 cmnp = (*pp)->minor; in subtree_free()
1131 (*pp)->minor = cmnp->sib; in subtree_free()
1133 while (cmnp->link != NULL) { in subtree_free()
1134 clp = cmnp->link; in subtree_free()
1135 cmnp->link = clp->sib; in subtree_free()
1154 if (clp->path == NULL) in rm_link_from_hash()
1157 hval = hashfn(hdp, clp->path); in rm_link_from_hash()
1159 for (; *pp != NULL; pp = &(*pp)->hash) { in rm_link_from_hash()
1161 *pp = clp->hash; in rm_link_from_hash()
1162 clp->hash = NULL; in rm_link_from_hash()
1168 clp->path); in rm_link_from_hash()
1182 for (; (clp = *pp) != NULL; pp = &clp->hash) { in link_hash()
1183 if (strcmp(clp->path, link) == 0) { in link_hash()
1192 *pp = clp->hash; in link_hash()
1193 clp->hash = NULL; in link_hash()
1208 if (TYPE_PRI(attr2type(clp->attr))) { in link2minor()
1212 if (!is_minor_node(clp->content, &minor_path)) { in link2minor()
1224 * audio -> /dev/sound/0 in link2minor()
1225 * fb0 -> fbs/afb0 in link2minor()
1229 if (strncmp(clp->content, DEV"/", strlen(DEV"/")) == 0) { in link2minor()
1230 cp = &clp->content[strlen(DEV"/")]; in link2minor()
1231 } else if (clp->content[0] != '/') { in link2minor()
1232 if ((cp = strrchr(clp->path, '/')) != NULL) { in link2minor()
1235 (void) snprintf(buf, sizeof (buf), "%s", clp->path); in link2minor()
1238 (void) strlcat(buf, clp->content, sizeof (buf)); in link2minor()
1247 if ((plp = link_hash(hdp, cp, 0)) != NULL && plp->minor != NULL) { in link2minor()
1248 return (plp->minor); in link2minor()
1253 (void) snprintf(link, sizeof (link), "%s/%s", hdp->dev_dir, clp->path); in link2minor()
1264 if (lstat(link, &st) == -1) in link2minor()
1276 n = sizeof (abspath) - strlen(p); in link2minor()
1301 for (pp = &(CACHE(hdp)->dngl); *pp != NULL; ) { in resolve_dangling_links()
1304 *pp = clp->sib; in resolve_dangling_links()
1305 clp->sib = cmnp->link; in resolve_dangling_links()
1306 cmnp->link = clp; in resolve_dangling_links()
1307 assert(clp->minor == NULL); in resolve_dangling_links()
1308 clp->minor = cmnp; in resolve_dangling_links()
1312 clp->path); in resolve_dangling_links()
1313 pp = &clp->sib; in resolve_dangling_links()
1332 free(cnp->path); in node_free()
1348 cmnp->name); in minor_free()
1352 free(cmnp->name); in minor_free()
1353 free(cmnp->nodetype); in minor_free()
1367 free(clp->path); in link_free()
1368 free(clp->content); in link_free()
1373 * Returns the ':' preceding the minor name
1428 pp = &((cache_node_t *)vp)->minor; in lookup_minor()
1429 for (; *pp != NULL; pp = &(*pp)->sib) { in lookup_minor()
1430 if (strcmp((*pp)->name, colon + 1) == 0) in lookup_minor()
1445 nidx = (((struct db_node *)vp)->minor); in lookup_minor()
1446 for (; dmp = get_minor(hdp, nidx); nidx = dmp->sib) { in lookup_minor()
1447 cp = get_string(hdp, dmp->name); in lookup_minor()
1489 CACHE_LAST(hdp)->node == NULL) { in get_last_node()
1493 cnp = CACHE_LAST(hdp)->node; in get_last_node()
1494 if (strcmp(cnp->path, path) == 0) { in get_last_node()
1498 cnp = cnp->sib; in get_last_node()
1499 if (cnp && strcmp(cnp->path, path) == 0) { in get_last_node()
1528 if (strcmp(cmnp->name, minor_name) == 0 && cmnp->node && in get_last_minor()
1529 strcmp(cmnp->node->path, devfs_path) == 0) { in get_last_minor()
1533 cmnp = cmnp->sib; in get_last_minor()
1534 if (cmnp && strcmp(cmnp->name, minor_name) == 0 && cmnp->node && in get_last_minor()
1535 strcmp(cmnp->node->path, devfs_path) == 0) { in get_last_minor()
1561 * Returns 0 if normal return or -1 otherwise.
1571 if (cur == NULL || cur[0] != '/' || strlen(cur) > sizeof (buf) - 1) { in walk_tree()
1573 return (-1); in walk_tree()
1618 if (LOOKUP_CACHE(tnp->flags)) { in visit_node()
1620 cache_node_t *cnp = tnp->node; in visit_node()
1622 cnp = (cnp) ? cnp->child : CACHE_ROOT(tnp->handle); in visit_node()
1624 for (; cnp != NULL; cnp = cnp->sib) { in visit_node()
1625 if (strcmp(cnp->path, path) == 0) in visit_node()
1628 if (cnp == NULL && CREATE_ELEM(tnp->flags)) { in visit_node()
1629 cnp = node_insert(tnp->handle, tnp->node, path, in visit_node()
1632 tnp->node = cnp; in visit_node()
1635 struct db_node *dnp = tnp->node; in visit_node()
1637 dnp = (dnp) ? get_node(tnp->handle, dnp->child) in visit_node()
1638 : get_node(tnp->handle, DB_HDR(tnp->handle)->root_idx); in visit_node()
1640 for (; dnp != NULL; dnp = get_node(tnp->handle, dnp->sib)) { in visit_node()
1641 cp = get_string(tnp->handle, dnp->path); in visit_node()
1646 tnp->node = dnp; in visit_node()
1652 return (tnp->node ? DI_WALK_CONTINUE : DI_WALK_TERMINATE); in visit_node()
1663 fcn, cmnp->name); in minor_delete()
1666 if (cmnp->node != NULL) { in minor_delete()
1667 mpp = &cmnp->node->minor; in minor_delete()
1668 for (; *mpp != NULL; mpp = &(*mpp)->sib) { in minor_delete()
1675 "%s: dangling minor: %s\n", fcn, cmnp->name); in minor_delete()
1677 *mpp = cmnp->sib; in minor_delete()
1681 cmnp->name); in minor_delete()
1684 delete_unused_nodes(hdp, cmnp->node); in minor_delete()
1686 cmnp->node = NULL; in minor_delete()
1687 cmnp->sib = NULL; in minor_delete()
1690 for (lpp = &cmnp->link; *lpp != NULL; lpp = &(*lpp)->sib) { in minor_delete()
1691 (*lpp)->minor = NULL; in minor_delete()
1693 *lpp = CACHE(hdp)->dngl; in minor_delete()
1694 CACHE(hdp)->dngl = cmnp->link; in minor_delete()
1695 cmnp->link = NULL; in minor_delete()
1709 if (cnp->minor != NULL || cnp->child != NULL) in delete_unused_nodes()
1713 cnp->path); in delete_unused_nodes()
1716 if (cnp->parent != NULL) { in delete_unused_nodes()
1717 npp = &cnp->parent->child; in delete_unused_nodes()
1718 for (; *npp != NULL; npp = &(*npp)->sib) { in delete_unused_nodes()
1725 "%s: dangling node: %s\n", fcn, cnp->path); in delete_unused_nodes()
1727 *npp = cnp->sib; in delete_unused_nodes()
1733 cnp->path); in delete_unused_nodes()
1736 delete_unused_nodes(hdp, cnp->parent); in delete_unused_nodes()
1738 cnp->parent = cnp->sib = NULL; in delete_unused_nodes()
1754 return (-1); in rm_link()
1773 return (-1); in di_devlink_rm_link()
1786 fcn, clp->path); in link_delete()
1788 if (clp->minor == NULL) in link_delete()
1789 pp = &(CACHE(hdp)->dngl); in link_delete()
1791 pp = &clp->minor->link; in link_delete()
1793 for (; *pp != NULL; pp = &(*pp)->sib) { in link_delete()
1800 fcn, clp->path); in link_delete()
1802 *pp = clp->sib; in link_delete()
1805 delete_unused_minor(hdp, clp->minor); in link_delete()
1807 clp->minor = NULL; in link_delete()
1818 if (cmnp->link != NULL) in delete_unused_minor()
1822 cmnp->name); in delete_unused_minor()
1834 return (add_link(hdp, link, content, flags) != NULL ? 0 : -1); in di_devlink_add_link()
1900 if (strcmp(clp->content, content) != 0) in link_cmp()
1903 if (attr2type(clp->attr) != type) in link_cmp()
1914 return (-1); in di_devlink_update()
1921 CACHE(hdp)->update_count = 0; in di_devlink_update()
1944 return (-1); in synchronize_db()
1947 for (hval = 0; hval < CACHE(hdp)->hash_sz; hval++) { in synchronize_db()
1949 if (GET_VALID_ATTR(clp->attr)) { in synchronize_db()
1950 CLR_VALID_ATTR(clp->attr); in synchronize_db()
1951 clp = clp->hash; in synchronize_db()
1960 (void) snprintf(pdup, sizeof (pdup), "%s", clp->path); in synchronize_db()
1961 clp = clp->hash; in synchronize_db()
1974 di_devlink_init_impl(const char *root, const char *name, uint_t flags) in di_devlink_init_impl() argument
1979 (flags == 0 && name != NULL)) { in di_devlink_init_impl()
1985 (err = devlink_create(root, name, DCA_DEVLINK_CACHE))) { in di_devlink_init_impl()
1996 di_devlink_init(const char *name, uint_t flags) in di_devlink_init() argument
1998 return (di_devlink_init_impl("/", name, flags)); in di_devlink_init()
2002 di_devlink_init_root(const char *root, const char *name, uint_t flags) in di_devlink_init_root() argument
2004 return (di_devlink_init_impl(root, name, flags)); in di_devlink_init_root()
2047 return (-1); in di_devlink_fini()
2071 return (-1); in di_devlink_walk()
2081 return (-1); in di_devlink_walk()
2087 rv = -1; in di_devlink_walk()
2102 return (rv ? -1 : 0); in di_devlink_walk()
2124 if (linkp->fcn == NULL) in check_args()
2125 return (-1); in check_args()
2127 if (!link_flag(linkp->flags)) { in check_args()
2128 return (-1); in check_args()
2135 if (linkp->minor_path) { in check_args()
2136 if (linkp->minor_path[0] != '/' || in check_args()
2137 minor_colon(linkp->minor_path) == NULL) { in check_args()
2138 return (-1); in check_args()
2154 if (linkp->minor_path == NULL) { in walk_db()
2172 return (-1); in cache_dev()
2177 CACHE(hdp)->hash = calloc(sz, sizeof (cache_link_t *)); in cache_dev()
2178 if (CACHE(hdp)->hash == NULL) { in cache_dev()
2179 return (-1); in cache_dev()
2181 CACHE(hdp)->hash_sz = sz; in cache_dev()
2198 return (-1); in walk_dev()
2203 return (-1); in walk_dev()
2206 if (linkp->minor_path) in walk_dev()
2207 walk_cache_minor(hdp, linkp->minor_path, linkp); in walk_dev()
2211 return (linkp->retval); in walk_dev()
2234 assert(strncmp(link, hdp->dev_dir, strlen(hdp->dev_dir)) == 0); in cache_dev_link()
2237 * Store only the part after <root-dir>/dev/ in cache_dev_link()
2239 link += strlen(hdp->dev_dir) + 1; in cache_dev_link()
2242 SET_VALID_ATTR(clp->attr); in cache_dev_link()
2271 vlink.rel_path = get_string(hdp, dlp->path); in walk_all_links()
2272 vlink.content = get_string(hdp, dlp->content); in walk_all_links()
2273 vlink.type = attr2type(dlp->attr); in walk_all_links()
2280 return (linkp->retval); in walk_all_links()
2290 assert(linkp->minor_path != NULL); in walk_matching_links()
2292 dmp = lookup_minor(hdp, linkp->minor_path, NULL, TYPE_DB); in walk_matching_links()
2296 * Then walk the dangling devlinks list. Non-matching devlinks will be in walk_matching_links()
2300 nidx = dmp ? dmp->link : DB_HDR(hdp)->dngl_idx; in walk_matching_links()
2301 for (; dlp = get_link(hdp, nidx); nidx = dlp->sib) { in walk_matching_links()
2304 vlink.rel_path = get_string(hdp, dlp->path); in walk_matching_links()
2305 vlink.content = get_string(hdp, dlp->content); in walk_matching_links()
2306 vlink.type = attr2type(dlp->attr); in walk_matching_links()
2319 return (linkp->retval); in walk_matching_links()
2336 if (vlp->rel_path == NULL && vlp->abs_path == NULL) { in visit_link()
2342 if (vlp->rel_path == NULL) { in visit_link()
2343 vlp->rel_path = (char *)rel_path(hdp, vlp->abs_path); in visit_link()
2344 if (vlp->rel_path == NULL || vlp->rel_path[0] == '\0') in visit_link()
2348 if (linkp->regp) { in visit_link()
2349 if (regexec(linkp->regp, vlp->rel_path, 0, NULL, 0) != 0) in visit_link()
2353 if (vlp->abs_path == NULL) { in visit_link()
2354 assert(vlp->rel_path[0] != '/'); in visit_link()
2356 hdp->dev_dir, vlp->rel_path); in visit_link()
2357 vlp->abs_path = abs_path; in visit_link()
2360 if (vlp->content == NULL) { in visit_link()
2361 if (s_readlink(vlp->abs_path, cont, sizeof (cont)) < 0) { in visit_link()
2364 vlp->content = cont; in visit_link()
2368 if (vlp->type == 0) { in visit_link()
2369 if (is_minor_node(vlp->content, &minor_path)) { in visit_link()
2370 vlp->type = DI_PRIMARY_LINK; in visit_link()
2372 vlp->type = DI_SECONDARY_LINK; in visit_link()
2379 if (linkp->minor_path) { in visit_link()
2385 if (vlp->type == DI_SECONDARY_LINK) { in visit_link()
2391 if (s_realpath(vlp->abs_path, tmp) == NULL) in visit_link()
2398 if (!is_minor_node(vlp->content, &minor_path)) in visit_link()
2404 if (strcmp(linkp->minor_path, minor_path) != 0) in visit_link()
2411 if (!TYPE_NONE(linkp->flags) && LINK_TYPE(linkp->flags) != vlp->type) { in visit_link()
2415 if (lstat(vlp->abs_path, &sbuf) < 0) { in visit_link()
2417 vlp->abs_path, strerror(errno)); in visit_link()
2421 return (linkp->fcn(vlp, linkp->arg)); in visit_link()
2427 if (devlink == NULL || devlink->rel_path == NULL || in devlink_valid()
2428 devlink->abs_path == NULL || devlink->content == NULL || in devlink_valid()
2429 TYPE_NONE(devlink->type)) { in devlink_valid()
2444 return (devlink->abs_path); in di_devlink_path()
2455 return (devlink->content); in di_devlink_content()
2463 return (-1); in di_devlink_type()
2466 return (devlink->type); in di_devlink_type()
2483 duplink->rel_path = strdup(devlink->rel_path); in di_devlink_dup()
2484 duplink->abs_path = strdup(devlink->abs_path); in di_devlink_dup()
2485 duplink->content = strdup(devlink->content); in di_devlink_dup()
2486 duplink->type = devlink->type; in di_devlink_dup()
2502 return (-1); in di_devlink_free()
2505 free(devlink->rel_path); in di_devlink_free()
2506 free(devlink->abs_path); in di_devlink_free()
2507 free(devlink->content); in di_devlink_free()
2519 const size_t len = strlen(hdp->dev_dir); in rel_path()
2521 if (strncmp(path, hdp->dev_dir, len) != 0) in rel_path()
2538 (void) do_recurse(hdp->dev_dir, hdp, rp, &ret); in recurse_dev()
2581 len = sizeof (cur) - len; in do_recurse()
2607 rv = rp->fcn(hdp, rp->data, cur); in do_recurse()
2681 if ((cnp->path = strdup(path)) == NULL) { in node_insert()
2687 cnp->parent = pcnp; in node_insert()
2691 assert(CACHE(hdp)->root == NULL); in node_insert()
2692 CACHE(hdp)->root = cnp; in node_insert()
2694 cnp->sib = pcnp->child; in node_insert()
2695 pcnp->child = cnp; in node_insert()
2696 } else if (CACHE_LAST(hdp) && CACHE_LAST(hdp)->node && in node_insert()
2697 CACHE_LAST(hdp)->node->parent == pcnp && in node_insert()
2698 CACHE_LAST(hdp)->node->sib == NULL) { in node_insert()
2700 CACHE_LAST(hdp)->node->sib = cnp; in node_insert()
2705 for (pp = &pcnp->child; *pp != NULL; pp = &(*pp)->sib) in node_insert()
2721 const char *name, in minor_insert() argument
2727 if (pcnp == NULL || name == NULL) { in minor_insert()
2745 cmnp->name = strdup(name); in minor_insert()
2746 cmnp->nodetype = strdup(nodetype); in minor_insert()
2747 if (cmnp->name == NULL || cmnp->nodetype == NULL) { in minor_insert()
2749 free(cmnp->name); in minor_insert()
2750 free(cmnp->nodetype); in minor_insert()
2755 cmnp->node = pcnp; in minor_insert()
2759 cmnp->sib = pcnp->minor; in minor_insert()
2760 pcnp->minor = cmnp; in minor_insert()
2790 clp->path = strdup(path); in link_insert()
2791 clp->content = strdup(content); in link_insert()
2792 if (clp->path == NULL || clp->content == NULL) { in link_insert()
2798 clp->attr = attr; in link_insert()
2800 clp->minor = cmnp; in link_insert()
2804 clp->sib = cmnp->link; in link_insert()
2805 cmnp->link = clp; in link_insert()
2807 clp->sib = CACHE(hdp)->dngl; in link_insert()
2808 CACHE(hdp)->dngl = clp; in link_insert()
2819 hval = hashfn(hdp, clp->path); in hash_insert()
2820 clp->hash = CACHE_HASH(hdp, hval); in hash_insert()
2924 addr = mmap(0, slen, prot, MAP_SHARED, DB(hdp)->db_fd, off); in map_seg()
2931 (ulong_t)slen, prot, DB(hdp)->db_fd, off); in map_seg()
2940 DB(hdp)->db_fd, off, (void *)addr); in map_seg()
2953 assert(DB_HDR(hdp)->page_sz); in seg_size()
2962 sz = (sz / DB_HDR(hdp)->page_sz) + 1; in seg_size()
2964 sz *= DB_HDR(hdp)->page_sz; in seg_size()
2983 count_node(CACHE(hdp)->root, count); in size_db()
2985 for (clp = CACHE(hdp)->dngl; clp != NULL; clp = clp->sib) { in size_db()
3010 count_string(cnp->path, count); in count_node()
3012 for (cmnp = cnp->minor; cmnp != NULL; cmnp = cmnp->sib) { in count_node()
3016 for (cnp = cnp->child; cnp != NULL; cnp = cnp->sib) { in count_node()
3031 count_string(cmnp->name, count); in count_minor()
3032 count_string(cmnp->nodetype, count); in count_minor()
3034 for (clp = cmnp->link; clp != NULL; clp = clp->sib) { in count_minor()
3046 count_string(clp->path, count); in count_link()
3047 count_string(clp->content, count); in count_link()
3073 assert(CACHE(hdp)->hash_sz >= MIN_HASH_SIZE); in hashfn()
3079 return (hval % CACHE(hdp)->hash_sz); in hashfn()
3093 * == -1 failure.
3106 assert(hdp->lock_fd < 0); in enter_db_lock()
3113 /* Record locks are per-process. Protect against multiple threads. */ in enter_db_lock()
3150 return (-1); /* failed */ in enter_db_lock()
3162 if ((rv != -1) || (errno != EINTR)) in enter_db_lock()
3166 if (rv != -1) { in enter_db_lock()
3167 hdp->lock_fd = fd; in enter_db_lock()
3177 return (-1); in enter_db_lock()
3181 * Close and re-open lock file every time so that it is recreated if deleted.
3189 if (hdp->lock_fd < 0) { in exit_db_lock()
3200 if (fcntl(hdp->lock_fd, F_SETLK, &unlock) == -1) { in exit_db_lock()
3205 (void) close(hdp->lock_fd); in exit_db_lock()
3207 hdp->lock_fd = -1; in exit_db_lock()
3223 char *ptr, *prefix; in is_minor_node() local
3225 prefix = "../devices/"; in is_minor_node()
3227 if ((ptr = strstr(contents, prefix)) != NULL) { in is_minor_node()
3231 *mn_root = ptr += strlen(prefix) - 1; in is_minor_node()
3236 prefix = "/devices/"; in is_minor_node()
3238 if (strncmp(contents, prefix, strlen(prefix)) == 0) { in is_minor_node()
3242 *mn_root = contents + strlen(prefix) - 1; in is_minor_node()
3258 if ((rv = readlink(link, buf, blen)) == -1) in s_readlink()
3261 if (rv >= blen && buf[blen - 1] != '\0') { in s_readlink()
3272 return (-1); in s_readlink()
3277 * The scope of the operation is determined by the "name" arg.
3278 * "name" can be NULL, a driver name or a devfs pathname (without /devices)
3280 * "name" creates
3294 devlink_create(const char *root, const char *name, int dca_devlink_flag) in devlink_create() argument
3303 * Convert name into arg for door_call in devlink_create()
3305 if (dca_init(name, &dca, dca_devlink_flag) != 0) in devlink_create()
3352 * The "name" member of "struct dca" contains data in the following order
3354 * The root component is always present at offset 0 in the "name" field.
3355 * The driver and minor are optional. If present they have a non-zero
3356 * offset in the "name" member.
3359 dca_init(const char *name, struct dca_off *dcp, int dca_flags) in dca_init() argument
3363 dcp->dca_root = 0; in dca_init()
3364 dcp->dca_minor = 0; in dca_init()
3365 dcp->dca_driver = 0; in dca_init()
3366 dcp->dca_error = 0; in dca_init()
3367 dcp->dca_flags = dca_flags; in dca_init()
3368 dcp->dca_name[0] = '\0'; in dca_init()
3370 name = name ? name : "/"; in dca_init()
3373 * Check if name is a driver name in dca_init()
3375 if (*name != '/') { in dca_init()
3376 (void) snprintf(dcp->dca_name, sizeof (dcp->dca_name), in dca_init()
3377 "/ %s", name); in dca_init()
3378 dcp->dca_root = 0; in dca_init()
3379 *(dcp->dca_name + 1) = '\0'; in dca_init()
3380 dcp->dca_driver = 2; in dca_init()
3384 (void) snprintf(dcp->dca_name, sizeof (dcp->dca_name), "%s", name); in dca_init()
3389 if (is_minor_node(name, NULL)) in dca_init()
3390 return (-1); in dca_init()
3392 dcp->dca_root = 0; in dca_init()
3393 if (cp = strrchr(dcp->dca_name, ':')) { in dca_init()
3395 dcp->dca_minor = cp - dcp->dca_name; in dca_init()
3413 char *prefix; in daemon_call() local
3420 * - we are in some sort of install scenario in daemon_call()
3421 * - we are early in boot in daemon_call()
3432 * If root is read-only, try only once, since libdevinfo in daemon_call()
3439 rofd = -1; in daemon_call()
3442 == -1 && errno == EROFS) { in daemon_call()
3444 prefix = "/tmp"; in daemon_call()
3446 if (rofd != -1) { in daemon_call()
3450 prefix = (char *)root; in daemon_call()
3453 if (rdonly && stat(DEVNAME_CHECK_FILE, &sb) != -1) in daemon_call()
3457 "%s/etc/dev/%s", prefix, DEVFSADM_SYNCH_DOOR); in daemon_call()
3462 if (stat(synch_door, &sb) == -1 || sb.st_uid != 0) { in daemon_call()
3464 dcp->dca_error = ENOTSUP; in daemon_call()
3466 dcp->dca_error = ENOENT; in daemon_call()
3472 if ((fd = open(synch_door, O_RDONLY)) == -1) { in daemon_call()
3473 dcp->dca_error = errno; in daemon_call()
3495 dcp->dca_error = errno; in daemon_call()
3507 dcp->dca_error = ((struct dca_off *)arg.data_ptr)->dca_error; in daemon_call()
3533 argv[i++] = "-a"; in start_daemon()
3535 argv[i++] = "-p"; in start_daemon()
3538 argv[i++] = "-r"; in start_daemon()
3560 * Load drivers only if -i is specified in exec_cmd()
3562 if (dcp->dca_driver) { in exec_cmd()
3563 argv[i++] = "-i"; in exec_cmd()
3564 argv[i++] = &dcp->dca_name[dcp->dca_driver]; in exec_cmd()
3566 argv[i++] = "-n"; in exec_cmd()
3570 argv[i++] = "-r"; in exec_cmd()
3577 dcp->dca_error = errno; in exec_cmd()
3594 if ((cpid = fork1()) == -1) { in do_exec()
3596 return (-1); in do_exec()
3613 _exit(-1); in do_exec()
3638 return (-1); in do_exec()
3649 clp ? clp->path : "<NULL>"); in walk_cache_links()
3653 * 2nd pass, search the dangling list - secondary links may in walk_cache_links()
3658 for (; clp != NULL; clp = clp->sib) { in walk_cache_links()
3661 assert(clp->path[0] != '/'); in walk_cache_links()
3663 vlink.rel_path = clp->path; in walk_cache_links()
3664 vlink.content = clp->content; in walk_cache_links()
3665 vlink.type = attr2type(clp->attr); in walk_cache_links()
3670 "terminating at link: %s\n", clp->path); in walk_cache_links()
3675 clp = CACHE(hdp)->dngl; in walk_cache_links()
3692 for (i = 0; i < CACHE(hdp)->hash_sz; i++) { in walk_all_cache()
3694 for (; clp; clp = clp->hash) { in walk_all_cache()
3697 assert(clp->path[0] != '/'); in walk_all_cache()
3699 vlink.rel_path = clp->path; in walk_all_cache()
3700 vlink.content = clp->content; in walk_all_cache()
3701 vlink.type = attr2type(clp->attr); in walk_all_cache()
3706 clp->path); in walk_all_cache()
3721 (void) walk_cache_links(hdp, cmnp->link, linkp); in walk_cache_minor()
3740 for (cmnp = cnp->minor; cmnp != NULL; cmnp = cmnp->sib) { in walk_cache_node()
3741 if (walk_cache_links(hdp, cmnp->link, linkp) in walk_cache_node()
3763 * /dev. i.e. without the leading "/dev/" prefix.
3780 return (-1); in di_devlink_cache_walk()
3789 return (-1); in di_devlink_cache_walk()
3806 static int _devlink_debug = -1;
3809 * debug level is initialized to -1.