Hallo, dies ist ein Test.
PWD: /www/data-lst1/unixsoft/unixsoft/kaempfer/.public_html
Running in File Mode
Relative path: ./../.././../../.././../usr/include/libdevinfo.h
Real path: /usr/include/libdevinfo.h
Zurück
/* * Copyright (c) 1997, 2022, Oracle and/or its affiliates. */ #ifndef _LIBDEVINFO_H #define _LIBDEVINFO_H #ifdef __cplusplus extern "C" { #endif #include <errno.h> #include <libnvpair.h> #include <sys/param.h> #include <sys/sunddi.h> #include <sys/sunmdi.h> #include <sys/openpromio.h> #include <sys/ddi_impldefs.h> #include <sys/devinfo_impl.h> #include <sys/modctl.h> #include <limits.h> /* * flags for di_walk_node */ #define DI_WALK_CLDFIRST 0 #define DI_WALK_SIBFIRST 1 #define DI_WALK_LINKGEN 2 #define DI_WALK_MASK 0xf /* * flags for di_walk_link */ #define DI_LINK_SRC 1 #define DI_LINK_TGT 2 /* * return code for node_callback */ #define DI_WALK_CONTINUE 0 #define DI_WALK_PRUNESIB -1 #define DI_WALK_PRUNECHILD -2 #define DI_WALK_TERMINATE -3 /* * flags for di_walk_minor */ #define DI_CHECK_ALIAS 0x10 #define DI_CHECK_INTERNAL_PATH 0x20 #define DI_CHECK_MASK 0xf0 /* * flags for di_walk_hp */ #define DI_HP_CONNECTOR 0x1 #define DI_HP_PORT 0x2 /* nodeid types */ #define DI_PSEUDO_NODEID -1 #define DI_SID_NODEID -2 #define DI_PROM_NODEID -3 /* node & device states */ #define DI_DRIVER_DETACHED 0x8000 #define DI_DEVICE_OFFLINE 0x1 #define DI_DEVICE_DOWN 0x2 #define DI_DEVICE_DEGRADED 0x4 #define DI_DEVICE_REMOVED 0x8 #define DI_BUS_QUIESCED 0x100 #define DI_BUS_DOWN 0x200 /* property types */ #define DI_PROP_TYPE_BOOLEAN 0 #define DI_PROP_TYPE_INT 1 #define DI_PROP_TYPE_STRING 2 #define DI_PROP_TYPE_BYTE 3 #define DI_PROP_TYPE_UNKNOWN 4 #define DI_PROP_TYPE_UNDEF_IT 5 #define DI_PROP_TYPE_INT64 6 /* private macro for checking if a prop type is valid */ #define DI_PROP_TYPE_VALID(type) \ ((((type) >= DI_PROP_TYPE_BOOLEAN) && ((type) <= DI_PROP_TYPE_BYTE)) ||\ ((type) == DI_PROP_TYPE_INT64)) /* opaque handles */ typedef struct di_node *di_node_t; /* node */ typedef struct di_minor *di_minor_t; /* minor_node */ typedef struct di_path *di_path_t; /* path_node */ typedef struct di_link *di_link_t; /* link */ typedef struct di_lnode *di_lnode_t; /* endpoint */ typedef struct di_devlink *di_devlink_t; /* devlink */ typedef struct di_hp *di_hp_t; /* hotplug */ typedef struct di_usage *di_usage_t; /* device usage info */ typedef struct di_prop *di_prop_t; /* node property */ typedef struct di_path_prop *di_path_prop_t; /* path property */ typedef struct di_prom_prop *di_prom_prop_t; /* prom property */ typedef struct di_prom_handle *di_prom_handle_t; /* prom snapshot */ typedef struct di_devlink_handle *di_devlink_handle_t; /* devlink snapshot */ /* default logical and physical device name space */ #define DEVICES_DIR "/devices" #define DEVICES_DIR_S "/devices/" #define DEV_DIR "/dev" #define DEV_DIR_S "/dev/" /* * Null handles to make handles really opaque */ #define DI_NODE_NIL NULL #define DI_MINOR_NIL NULL #define DI_PATH_NIL NULL #define DI_LINK_NIL NULL #define DI_LNODE_NIL NULL #define DI_PROP_NIL NULL #define DI_PROM_PROP_NIL NULL #define DI_PROM_HANDLE_NIL NULL #define DI_HP_NIL NULL #define DI_USAGE_NIL NULL /* * IEEE 1275 properties and other standardized property names */ #define DI_PROP_FIRST_CHAS "first-in-chassis" #define DI_PROP_SLOT_NAMES "slot-names" #define DI_PROP_PHYS_SLOT "physical-slot#" #define DI_PROP_DEV_TYPE "device_type" #define DI_PROP_BUS_RANGE "bus-range" #define DI_PROP_SERID "serialid#" #define DI_PROP_REG "reg" #define DI_PROP_AP_NAMES "ap-names" /* Interface Prototypes */ /* * Snapshot initialization and cleanup */ extern di_node_t di_init(const char *__phys_path, uint_t __flag); extern void di_fini(di_node_t __root); /* * node: traversal, data access, and parameters */ extern uint64_t di_cna_dev(di_node_t __root); extern int di_walk_node(di_node_t __root, uint_t __flag, void *__arg, int (*__node_callback)(di_node_t __node, void *__arg)); extern di_node_t di_drv_first_node(const char *__drv_name, di_node_t __root); extern di_node_t di_drv_next_node(di_node_t __node); extern di_node_t di_parent_node(di_node_t __node); extern di_node_t di_sibling_node(di_node_t __node); extern di_node_t di_child_node(di_node_t __node); extern char *di_node_name(di_node_t __node); extern char *di_bus_addr(di_node_t __node); extern char *di_binding_name(di_node_t __node); extern int di_compatible_names(di_node_t, char **__names); extern int di_instance(di_node_t __node); extern int di_nodeid(di_node_t __node); extern int di_driver_major(di_node_t __node); extern uint_t di_state(di_node_t __node); extern ddi_node_state_t di_node_state(di_node_t __node); extern ddi_devid_t di_devid(di_node_t __node); extern char *di_driver_name(di_node_t __node); extern uint_t di_driver_ops(di_node_t __node); extern uint64_t di_node_cna_dev(di_node_t __node); extern int di_node_isnvme(di_node_t __node); extern uint32_t di_node_ref(di_node_t __node); extern void di_node_private_set(di_node_t __node, void *__data); extern void *di_node_private_get(di_node_t __node); extern char *di_devfs_path(di_node_t __node); extern char *di_devfs_minor_path(di_minor_t __minor); extern void di_devfs_path_free(char *__path_buf); extern char *di_client_paths_devfs_paths(di_node_t __node); /* * path_node: traversal, data access, and parameters */ extern di_path_t di_path_phci_next_path( di_node_t __node, di_path_t __path); extern di_path_t di_path_client_next_path( di_node_t __node, di_path_t __path); extern di_node_t di_path_phci_node(di_path_t __path); extern di_node_t di_path_client_node(di_path_t __path); extern char *di_path_node_name(di_path_t __path); extern char *di_path_bus_addr(di_path_t __path); extern int di_path_instance(di_path_t __path); extern di_path_state_t di_path_state(di_path_t __path); extern int di_path_state_r(di_path_t __path); extern char *di_path_state2str(di_path_state_t); extern di_pathmon_state_t di_pathmon_state(di_path_t path); extern char *di_pathmon_state2str(di_pathmon_state_t); extern di_path_state_t di_path_str2state(char *); extern uint_t di_path_flags(di_path_t __path); extern char *di_path_devfs_path(di_path_t __path); extern char *di_path_client_devfs_path(di_path_t __path); extern void di_path_private_set(di_path_t __path, void *__data); extern void *di_path_private_get(di_path_t __path); extern uint64_t di_path_cna_dev(di_path_t __path); /* * minor_node: traversal, data access, and parameters */ extern int di_walk_minor(di_node_t __root, const char *__minortype, uint_t __flag, void *__arg, int (*minor_callback)(di_node_t __node, di_minor_t __minor, void *__arg)); extern di_minor_t di_minor_next(di_node_t __node, di_minor_t __minor); extern di_node_t di_minor_devinfo(di_minor_t __minor); extern ddi_minor_type di_minor_type(di_minor_t __minor); extern char *di_minor_name(di_minor_t __minor); extern dev_t di_minor_devt(di_minor_t __minor); extern int di_minor_spectype(di_minor_t __minor); extern char *di_minor_nodetype(di_minor_t __node); extern void di_minor_private_set(di_minor_t __minor, void *__data); extern void *di_minor_private_get(di_minor_t __minor); /* * node: property access */ extern di_prop_t di_prop_next(di_node_t __node, di_prop_t __prop); extern char *di_prop_name(di_prop_t __prop); extern int di_prop_type(di_prop_t __prop); extern dev_t di_prop_devt(di_prop_t __prop); extern int di_prop_ints(di_prop_t __prop, int **__prop_data); extern int di_prop_int64(di_prop_t __prop, int64_t **__prop_data); extern int di_prop_strings(di_prop_t __prop, char **__prop_data); extern int di_prop_bytes(di_prop_t __prop, uchar_t **__prop_data); extern int di_prop_exists(dev_t __dev, di_node_t __node, const char *__prop_name); extern int di_prop_lookup_bytes(dev_t __dev, di_node_t __node, const char *__prop_name, uchar_t **__prop_data); extern int di_prop_lookup_ints(dev_t __dev, di_node_t __node, const char *__prop_name, int **__prop_data); extern int di_prop_lookup_int64(dev_t __dev, di_node_t __node, const char *__prop_name, int64_t **__prop_data); extern int di_prop_lookup_strings(dev_t __dev, di_node_t __node, const char *__prop_name, char **__prop_data); /* * prom_node: property access */ extern di_prom_handle_t di_prom_init(void); extern void di_prom_fini(di_prom_handle_t __ph); extern di_prom_prop_t di_prom_prop_next(di_prom_handle_t __ph, di_node_t __node, di_prom_prop_t __prom_prop); extern char *di_prom_prop_name(di_prom_prop_t __prom_prop); extern int di_prom_prop_data(di_prom_prop_t __prop, uchar_t **__prom_prop_data); extern int di_prom_prop_lookup_ints(di_prom_handle_t __prom, di_node_t __node, const char *__prom_prop_name, int **__prom_prop_data); extern int di_prom_prop_lookup_strings(di_prom_handle_t __prom, di_node_t __node, const char *__prom_prop_name, char **__prom_prop_data); extern int di_prom_prop_lookup_bytes(di_prom_handle_t __prom, di_node_t __node, const char *__prom_prop_name, uchar_t **__prom_prop_data); /* * path_node: property access */ extern di_path_prop_t di_path_prop_next(di_path_t __path, di_path_prop_t __prop); extern char *di_path_prop_name(di_path_prop_t __prop); extern int di_path_prop_type(di_path_prop_t __prop); extern int di_path_prop_len(di_path_prop_t __prop); extern int di_path_prop_bytes(di_path_prop_t __prop, uchar_t **__prop_data); extern int di_path_prop_ints(di_path_prop_t __prop, int **__prop_data); extern int di_path_prop_int64s(di_path_prop_t __prop, int64_t **__prop_data); extern int di_path_prop_strings(di_path_prop_t __prop, char **__prop_data); extern int di_path_prop_exists(di_path_t __path, const char *__prop_name); extern int di_path_prop_lookup_bytes(di_path_t __path, const char *__prop_name, uchar_t **__prop_data); extern int di_path_prop_lookup_ints(di_path_t __path, const char *__prop_name, int **__prop_data); extern int di_path_prop_lookup_int64s(di_path_t __path, const char *__prop_name, int64_t **__prop_data); extern int di_path_prop_lookup_strings(di_path_t __path, const char *__prop_name, char **__prop_data); /* * layering link/lnode: traversal, data access, and parameters */ extern int di_walk_link(di_node_t __root, uint_t __flag, uint_t __endpoint, void *__arg, int (*link_callback)(di_link_t __link, void *__arg)); extern int di_walk_lnode(di_node_t __root, uint_t __flag, void *__arg, int (*lnode_callback)(di_lnode_t __lnode, void *__arg)); extern di_link_t di_link_next_by_node(di_node_t __node, di_link_t __link, uint_t __endpoint); extern di_link_t di_link_next_by_lnode(di_lnode_t __lnode, di_link_t __link, uint_t __endpoint); extern di_lnode_t di_lnode_next(di_node_t __node, di_lnode_t __lnode); extern char *di_lnode_name(di_lnode_t __lnode); extern int di_link_spectype(di_link_t __link); extern di_lnode_t di_link_to_lnode(di_link_t __link, uint_t __endpoint); extern di_node_t di_lnode_devinfo(di_lnode_t __lnode); extern int di_lnode_devt(di_lnode_t __lnode, dev_t *__devt); extern void di_link_private_set(di_link_t __link, void *__data); extern void *di_link_private_get(di_link_t __link); extern void di_lnode_private_set(di_lnode_t __lnode, void *__data); extern void *di_lnode_private_get(di_lnode_t __lnode); /* * hp_node: traversal, data access, and parameters */ extern int di_walk_hp(di_node_t __node, const char *__type, uint_t __flag, void *__arg, int (*hp_callback)(di_node_t __node, di_hp_t __hp, void *__arg)); extern di_hp_t di_hp_next(di_node_t __node, di_hp_t __hp); extern char *di_hp_name(di_hp_t __hp); extern int di_hp_connection(di_hp_t __hp); extern int di_hp_depends_on(di_hp_t __hp); extern int di_hp_state(di_hp_t __hp); extern size_t di_hp_state_priv_size(di_hp_t __hp); extern char *di_hp_state_priv(di_hp_t __hp); extern int di_hp_state_ceiling(di_hp_t __hp); extern int di_hp_type(di_hp_t __hp); extern char *di_hp_description(di_hp_t __hp); extern time_t di_hp_last_change(di_hp_t __hp); extern di_node_t di_hp_child(di_hp_t __hp); /* * Banner and other product info access */ extern int devfs_get_product_info(devfs_prodinfo_t, char *, int32_t); /* * device usage node: traversal, data access, and parameters */ extern int di_walk_usage(di_node_t __node, uint_t __flag, void *__arg, int (*__usage_callback)(di_node_t __node, di_usage_t __usage, void *__arg)); extern di_usage_t di_usage_next(di_node_t __node, di_usage_t __usage); extern char *di_usage_descr(di_usage_t __usage); extern char *di_usage_descr_nvl(nvlist_t *__nvl); extern int di_usage_info(di_usage_t __usage, di_usage_type_t *__type_p, di_usage_id_type_t *__id_type_p, di_usage_hold_flags_t *__hold_flags_p); extern int di_usage_modid(di_usage_t __usage); extern char *di_usage_modname(di_usage_t __usage); extern char *di_usage_moddescr(di_usage_t __usage); extern pid_t di_usage_procid(di_usage_t __usage); extern char *di_usage_procname(di_usage_t __usage); extern uint32_t di_usage_refcount(di_usage_t __usage); extern dev_t di_usage_devt(di_usage_t __usage); extern vtype_t di_usage_vtype(di_usage_t __usage); /* * Private interfaces * * The interfaces and structures below are private to this implementation * of Solaris and are subject to change at any time without notice. * * Applications and drivers using these interfaces may fail * to run on future releases. */ extern di_prop_t di_prop_find(dev_t __match_dev, di_node_t __node, const char *__name); extern di_path_prop_t di_path_prop_find(di_path_t __path, const char *__name); extern int di_devfs_path_match(const char *__dp1, const char *__dp2); extern di_node_t di_vhci_first_node(di_node_t __root); extern di_node_t di_vhci_next_node(di_node_t __node); extern di_node_t di_phci_first_node(di_node_t __vhci_node); extern di_node_t di_phci_next_node(di_node_t __node); /* * Interfaces for handling IEEE 1275 and other standardized properties */ /* structure for a single slot */ typedef struct di_slot_name { int num; /* corresponding pci device number */ char *name; } di_slot_name_t; extern void di_slot_names_free(int __count, di_slot_name_t *__slot_names); extern int di_slot_names_decode(uchar_t *__rawdata, int __rawlen, di_slot_name_t **__prop_data); extern int di_prop_slot_names(di_prop_t __prop, di_slot_name_t **__prop_data); extern int di_prom_prop_slot_names(di_prom_prop_t __prom_prop, di_slot_name_t **__prop_data); extern int di_prop_lookup_slot_names(dev_t __dev, di_node_t __node, di_slot_name_t **__prop_data); extern int di_prom_prop_lookup_slot_names(di_prom_handle_t __ph, di_node_t __node, di_slot_name_t **__prop_data); /* * IEEE 1275 generic names. */ extern char *di_pciclass2_node_name(uint32_t); extern void di_pciclass2_node_name_free(char *); /* * XXX Remove the private di_path_(addr,next,next_phci,next_client) interfaces * below after NWS consolidation switches to using di_path_bus_addr, * di_path_phci_next_path, and di_path_client_next_path per CR6638521. */ extern char *di_path_addr(di_path_t __path, char *__buf); extern di_path_t di_path_next(di_node_t __node, di_path_t __path); extern di_path_t di_path_next_phci(di_node_t __node, di_path_t __path); extern di_path_t di_path_next_client(di_node_t __node, di_path_t __path); /* * Interfaces for private data */ extern di_node_t di_init_driver(const char *__drv_name, uint_t __flag); extern di_node_t di_init_impl(const char *__phys_path, uint_t __flag, struct di_priv_data *__priv_data); /* * Prtconf needs to know property lists, raw prop_data, and private data */ extern di_prop_t di_prop_drv_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_sys_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_global_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_com_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_vendor_global_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_admin_global_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_hw_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_vendor_next(di_node_t __node, di_prop_t __prop); extern di_prop_t di_prop_admin_next(di_node_t __node, di_prop_t __prop); extern int di_prop_rawdata(di_prop_t __prop, uchar_t **__prop_data); extern void *di_parent_private_data(di_node_t __node); extern void *di_driver_private_data(di_node_t __node); /* * The value of the dip's devi_flags field */ uint_t di_flags(di_node_t __node); /* * Types of links for devlink lookup */ #define DI_PRIMARY_LINK 0x01 #define DI_SECONDARY_LINK 0x02 #define DI_SHP_LINK 0x04 /* Solaris Hotplug links */ #define DI_LINK_TYPES 0x07 /* * Flag for di_devlink_init() */ #define DI_MAKE_LINK 0x01 /* * Flag for di_devlink_close() */ #define DI_LINK_ERROR 0x01 /* * For devfsadm synchronous link creation interfaces */ #define DEVFSADM_SYNCH_DOOR ".devfsadm_synch_door" /* * devlink create argument */ struct dca_off { uint32_t dca_root; uint32_t dca_minor; uint32_t dca_driver; int dca_error; int dca_flags; char dca_name[PATH_MAX+MAXNAMELEN]; }; extern di_devlink_handle_t di_devlink_init(const char *__name, uint_t __flags); extern di_devlink_handle_t di_devlink_init_ts(const char *__name, uint_t __flags, uint64_t); extern int di_devlink_walk(di_devlink_handle_t __hdl, const char *__re, const char *__minor_path, uint_t __flags, void *__arg, int (*__devlink_callback)(di_devlink_t, void *)); extern const char *di_devlink_path(di_devlink_t __devlink); extern const char *di_devlink_content(di_devlink_t __devlink); extern int di_devlink_type(di_devlink_t __devlink); extern di_devlink_t di_devlink_dup(di_devlink_t __devlink); extern int di_devlink_free(di_devlink_t __devlink); extern int di_devlink_fini(di_devlink_handle_t *__hdlp); extern di_devlink_handle_t di_devlink_open(const char *__root_dir, uint_t __flags); extern int di_devlink_close(di_devlink_handle_t *__pp, int __flag); extern int di_devlink_rm_link(di_devlink_handle_t __hdp, const char *__link); extern int di_devlink_add_link(di_devlink_handle_t __hdp, const char *__link, const char *__content, int __flags); extern int di_devlink_update(di_devlink_handle_t __hdp); extern di_devlink_handle_t di_devlink_init_root(const char *__root, const char *__name, uint_t __flags); extern int di_devlink_cache_walk(di_devlink_handle_t __hdp, const char *__re, const char *__path, uint_t __flags, void *__arg, int (*__devlink_callback)(di_devlink_t, void *)); /* * Private interfaces for I/O retire */ typedef struct di_retire { void *rt_hdl; void (*rt_abort)(void *hdl, const char *format, ...); void (*rt_debug)(void *hdl, const char *format, ...); } di_retire_t; extern int di_retire_store_get(char *, size_t *, size_t *); extern int di_retire_device(char *__path, di_retire_t *__dp, int __flags); extern int di_unretire_device(char *__path, di_retire_t *__dp); extern uint_t di_retired(di_node_t __node); /* * Private interfaces for /etc/logindevperm */ extern int di_devperm_login(const char *, uid_t, gid_t, void (*)(char *)); extern int di_devperm_logout(const char *); /* * Private interface for looking up, by path string, a node/path/minor * in a snapshot. */ extern di_node_t di_lookup_node(di_node_t __root, char *__path); extern di_path_t di_lookup_path(di_node_t __root, char *__path); /* * Private interfaces for converting a path to resolved_path canonical form. * * NOTE: di_realpath_str() has no dependency on the path existing in the * file system, it will return a resolved_path in canonical form, but that * path may still have symlinks. */ extern char *di_realpath(const char *__path, char *__resolved_path); extern char *di_realpath_str(const char *__path, char *__resolved_path); /* * Private hotplug interfaces to be used between cfgadm pci plugin and * devfsadm link generator. */ extern char *di_dli_name(char *); extern int di_dli_openr(char *); extern int di_dli_openw(char *); extern void di_dli_close(int); /* * Private interface for parsing path_to_inst binding file */ extern int devfs_parse_binding_file(const char *, int (*)(void *, const char *, int, const char *), void *); extern int devfs_walk_minor_nodes(const char *, int (*)(void *, const char *), void *); /* * finddev - alternate readdir to discover only /dev persisted device names */ typedef struct __finddevhdl *finddevhdl_t; extern int device_exists(const char *); extern int finddev_readdir(const char *, finddevhdl_t *); extern int finddev_emptydir(const char *); extern void finddev_close(finddevhdl_t); extern const char *finddev_next(finddevhdl_t); /* * Private interfaces for non-global /dev profile */ /* * A list of device profile names in use. NOTE: Use (very carefully) one of the * profiles below or add a new one if needed - no profile is intended for a * general use. */ /* * For allocate(1) only: a list of devices maintained by TX administration tool * allocate(1). */ #define DEVPROF_ALLOCATE3 "allocate3" /* For allocate(1) only */ /* * For libdladm (and zoneadmd(8)) only: a list of devices associated to * datalinks assigned to a non-global zone. */ #define DEVPROF_ZONE_NET "zone_net" /* * For zoneadmd(8) only: a list of devices required by a respective zone brand. * The content must not be changed while the zone is active (i.e. ready, running * and so on). Set up during the zone bootup. */ #define DEVPROF_ZONE_BRAND "zone_brand" /* * For zoneadmd(8) only: an up-to-date list of devices specified in the * persistent or the live zone configuration as "device" resources. Maintained * by the Live Zone Reconfiguration. */ #define DEVPROF_ZONE_DEV "zone_dev" /* * For zoneadmd(8) only: Contains a IB VHCA device. Set up during the zone * bootup. */ #define DEVPROF_ZONE_IB "zone_ib" typedef struct __di_prof *di_prof_t; typedef struct __di_prof_iter *di_prof_iter_t; extern int di_prof_init(di_prof_t *, const char *, const char *); extern void di_prof_fini(di_prof_t); extern int di_prof_commit(di_prof_t); extern int di_prof_commit_log(di_prof_t, nvlist_t **); extern int di_prof_add_dev(di_prof_t, const char *); extern int di_prof_add_devann(di_prof_t, const char *, const char *, const char *); extern int di_prof_add_exclude(di_prof_t, const char *); extern int di_prof_add_symlink(di_prof_t, const char *, const char *); extern int di_prof_add_map(di_prof_t, const char *, const char *); extern int di_prof_del_rule(di_prof_t, di_prof_iter_t); extern di_prof_iter_t di_prof_get_dev(di_prof_t, di_prof_iter_t, const char *); extern const char *di_prof_dev_name(di_prof_iter_t); extern di_prof_iter_t di_prof_get_devann(di_prof_t, di_prof_iter_t, const char *, const char *, const char *); extern const char *di_prof_devann_dev_name(di_prof_iter_t); extern const char *di_prof_devann_value(di_prof_iter_t); extern int di_prof_del_dev_devanns(di_prof_t, const char *); extern di_prof_iter_t di_prof_get_map(di_prof_t, di_prof_iter_t, const char *, const char *); extern const char *di_prof_map_source(di_prof_iter_t); extern const char *di_prof_map_target(di_prof_iter_t); extern uint64_t di_prof_get_generation_id(di_prof_t); /* * Private interfaces for <driver><instance><minor> to path conversion. * NOTE: These interfaces do not require or cause attach. The implementation * uses the kernel instance-tree (path_to_inst(5)) and the di_devlinks * database information. */ typedef struct __di_dim *di_dim_t; extern di_dim_t di_dim_init(void); extern void di_dim_fini(di_dim_t); extern char *di_dim_path_devices(di_dim_t, char *__drv_name, int __instance, char *__minor_name); extern char *di_dim_path_dev(di_dim_t, char *__drv_name, int __instance, char *__minor_name); /* * Private interfaces for unit-address-path (uap). A unit-address path is a * typical /devices path-string "[/<name>@<unit-address>]*[:<minor-node>]" with * <name> and ":<minor-node>" parts of a path removed. On SPARC platforms, a * uap path is passed into Solaris for the hostconfig Machine Description (PRI). * Solaris has chosen the same uap notation (which involves both '/' and '@'). * The '@' in a unit-address-path should be viewed as a mandatory part of a path * component (instead of part of a two-character component separator sequence). * Like a filename path, a uap that starts with "/" indicates an 'absolute' path * and a uap that begins with anything else indicates a 'relative' path. * Also, like a filename path, a path component of ".." (no '@') has the special * meaning of "go up a level". * * NOTE: a uap can't be directly converted back into a /devices path by string * manipulation, but it can be used to lookup a path, and the translation can * be obtained based on that lookup result. */ extern int di_uap_isuap(char *__pathstr); extern char *di_uap_path2uap(char *__path); extern char *di_uap_uap2path(di_node_t __root, char *__uap); extern void di_uap_free(char *); extern di_node_t di_uap_lookup_node(di_node_t __root, char *__uap); /* * Alias related exported interfaces */ char *di_alias2curr(di_node_t __anynode, char *__alias); /* * Private Chassis-Receptacle-Occupant-Link (di_cro) interfaces: */ /* di_cro_ opaque handles */ typedef struct di_cro_hdl *di_cro_hdl_t; typedef struct di_cro_reca *di_cro_reca_t; typedef struct di_cro_rec *di_cro_rec_t; /* di_cro_ snapshot/record-array interfaces */ di_cro_hdl_t di_cro_init(char *__cro_db_file, int __flags); void di_cro_fini(di_cro_hdl_t __h); #define DI_INIT_HEADERONLY 0x1 uint64_t di_cro_get_cna(di_cro_hdl_t __h); char *di_cro_get_fletcher(di_cro_hdl_t __h); char *di_cro_get_date(di_cro_hdl_t __h); di_cro_reca_t di_cro_reca_create(di_cro_hdl_t __h, uint32_t __rec_flag, char *__re_product_id, char *__re_chassis_id, char *__re_alias_id, char *__re_receptacle_name, char *__re_receptacle_type, char *__re_receptacle_fmri, char *__re_occupant_type, char *__re_occupant_instance, char *__re_devchassis_path, char *__re_occupant_devices, char *__re_occupant_paths, char *__re_occupant_pathstates, char *__re_occupant_compdev, char *__re_occupant_devid, char *__re_occupant_mfg, char *__re_occupant_model, char *__re_occupant_part, char *__re_occupant_serial, char *__re_occupant_firm, char *__re_occupant_misc_1, char *__re_occupant_misc_2, char *__re_occupant_misc_3); #define DI_CRO_REC_FLAG_PRIV 0x1 /* private record */ di_cro_reca_t di_cro_reca_create_query(di_cro_hdl_t __h, uint32_t __rec_flag, char *__query); #define DI_CRO_Q_PRODUCT_ID "chassis-name" #define DI_CRO_Q_CHASSIS_ID "chassis-serial" #define DI_CRO_Q_ALIAS_ID "alias-id" #define DI_CRO_Q_RECEPTACLE_NAME "receptacle-name" #define DI_CRO_Q_RECEPTACLE_TYPE "receptacle-type" #define DI_CRO_Q_RECEPTACLE_FMRI "receptacle-fmri" #define DI_CRO_Q_OCCUPANT_TYPE "occupant-type" #define DI_CRO_Q_OCCUPANT_INSTANCE "occupant-instance" #define DI_CRO_Q_DEVCHASSIS_RAW "devchassis-raw" #define DI_CRO_Q_DEVCHASSIS_PATH "devchassis-path" #define DI_CRO_Q_OCCUPANT_DEVICES "occupant-devices" #define DI_CRO_Q_OCCUPANT_PATHS "occupant-paths" #define DI_CRO_Q_OCCUPANT_PATHSTATES "occupant-pathstates" #define DI_CRO_Q_OCCUPANT_COMPDEV "occupant-compdev" #define DI_CRO_Q_OCCUPANT_DEVID "occupant-devid" #define DI_CRO_Q_OCCUPANT_MFG "occupant-mfg" #define DI_CRO_Q_OCCUPANT_MODEL "occupant-model" #define DI_CRO_Q_OCCUPANT_PART "occupant-part" #define DI_CRO_Q_OCCUPANT_SERIAL "occupant-serial" #define DI_CRO_Q_OCCUPANT_FIRM "occupant-firm" #define DI_CRO_Q_OCCUPANT_MISC_1 "occupant-misc-1" #define DI_CRO_Q_OCCUPANT_MISC_2 "occupant-misc-2" #define DI_CRO_Q_OCCUPANT_MISC_3 "occupant-misc-3" #define DI_CRO_QREFMT ":\"%s\"" di_cro_rec_t di_cro_reca_next(di_cro_reca_t __ra, di_cro_rec_t __r); void di_cro_reca_destroy(di_cro_reca_t __ra); /* * di_cro_ record field index interfaces * * Example: * for (i = 0; more; i++) * xxx = di_cro_rec_fgeti_xxx(r, i, &more, ":"); * * If you know that there is only one item in the array: * xxx = di_cro_rec_fgeti_xxx(r, 0, NULL, NULL); */ char *di_cro_rec_fgeti_product_id(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_chassis_id(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_alias_id(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_receptacle_name(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_receptacle_type(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_receptacle_fmri(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_type(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_instance(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_devchassis_path(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_devices(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_paths(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_pathstates(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_compdev(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_devid(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_mfg(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_model(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_part(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_serial(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_firm(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_misc_1(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_misc_2(di_cro_rec_t __r, int, int *, char *); char *di_cro_rec_fgeti_occupant_misc_3(di_cro_rec_t __r, int, int *, char *); void di_cro_rec_priv_set(di_cro_rec_t __r, void *); void *di_cro_rec_priv_get(di_cro_rec_t __r); char *di_cro_strclean(char *, int); /* * Private: The following di_crodc_ interfaces are for devchassisd(8). * Return 0 on success, caller must strfree() non-NULL returned strings. * * When a chassis is aliased, move <product_id>.<chassis_id> directory into * /dev/chassis/.ca so that /dev/chassis only shows one name per chassis: a * <alias_id> symlink into '.ca', or a <product_id>.<chassis_id> directory. */ int di_crodc_rec_linkinfo(di_cro_rec_t __r, int, char **, char **); #define DI_CRODC_REC_LINKINFO_RAW 0x2 /* don't use SYS/ALIAS */ #define DI_CRODC_REC_LINKINFO_ALIASLINK 0x3 /* return ALIAS setup */ #define DI_CRODC_DEVCHASSIS "/dev/chassis" /* base of namespace */ #define DI_CRODC_SYSALIAS "SYS" #define DI_CRODC_SYSALIAS_SS "/SYS/" #define DI_CRODC_ALIASED_DIR ".ca" #define DI_CRODC_PC_SEP "." #define DI_CRODC_PC_FMT "%s" DI_CRODC_PC_SEP "%s" #define DI_CRODC_RESERVED_CHARS "/" /* * Private: The following di_cromk_ interfaces are for fmd(8) cro construction */ typedef struct di_cromk_hdl *di_cromk_hdl_t; di_cromk_hdl_t di_cromk_begin(int __flags); di_cro_rec_t di_cromk_recadd(di_cromk_hdl_t __h, uint32_t __rec_flag, char *__product_id, char *__chassis_id, char *__alias_id, char *__receptacle_name, char *__receptacle_type, char *__receptacle_fmri, char *__occupant_type, char *__occupant_instance, char *__devchassis_path, char **__occupant_devices, int __n_occupant_devices, char **__occupant_paths, int __n_occupant_paths, char **__occupant_pathstates, int __n_occupant_pathstates, char **__occupant_compdev, int __n_occupant_compdev, char *__occupant_devid, char *__occupant_mfg, char *__occupant_model, char *__occupant_part, char *__occupant_serial, char *__occupant_firm, char **__occupant_misc_1, int __n_occupant_misc_1, char **__occupant_misc_2, int __n_occupant_misc_2, char **__occupant_misc_3, int __n_occupant_misc_3); void di_cromk_end(di_cromk_hdl_t __h, int __flags, uint64_t __cna); #define DI_CROMK_END_COMMIT 0x00000001 /* Commit to database */ #define DI_CROMK_END_ABANDON 0x00000002 /* Throw this db away */ void di_cromk_cleanup(void); #define DI_CRO_DB "cro_db" #define DI_CRO_DB_FILE "/var/fm/fmd/topo/latest/" DI_CRO_DB #define DI_CRO_DB_FILE_OLD DI_CRO_DB_FILE ".old" #define DI_CRO_DB_FILE_TEMP "/var/fm/fmd/topo/temp/" DI_CRO_DB /* * Private: di_pca_ Product-id.Chassis-id Alias-id interfaces used by * di_cromk_ (in the future by fmtopo for <alias-id> authority). */ typedef struct di_pca_hdl *di_pca_hdl_t; typedef struct di_pca_rec *di_pca_rec_t; di_pca_hdl_t di_pca_init(int __flag); #define DI_PCA_INIT_FLAG_PRINT 0x1 #define DI_PCA_INIT_FLAG_ALIASES_FILE_USER 0x2 int di_pca_sync(di_pca_hdl_t __h, int __flag); #define DI_PCA_SYNC_FLAG_COMMIT 0x1 void di_pca_fini(di_pca_hdl_t __h); int di_pca_rec_add(di_pca_hdl_t __h, char *__raw_chassis, char *__alias_id, char *__comment); int di_pca_rec_remove(di_pca_hdl_t __h, char *__match_str); void di_pca_rec_print(FILE *__fp, di_pca_rec_t __r); di_pca_rec_t di_pca_rec_next(di_pca_hdl_t __h, di_pca_rec_t __r); di_pca_rec_t di_pca_rec_lookup(di_pca_hdl_t __h, char *__match_str); char *di_pca_rec_get_raw_chassis(di_pca_rec_t __r); char *di_pca_rec_get_alias_id(di_pca_rec_t __r); char *di_pca_rec_get_comment(di_pca_rec_t __r); int di_pca_alias_id_used(di_pca_hdl_t __h, char *__alias_id); #define DI_PCA_SUCCESS 0 #define DI_PCA_FAILURE -1 #define DI_PCA_ALIASES "chassis_aliases" #define DI_PCA_ALIASES_FILE "/etc/dev/." DI_PCA_ALIASES #define DI_PCA_ALIASES_FILE_USER "/etc/dev/" DI_PCA_ALIASES #define DI_PCA_ALIASES_FILE_TMP DI_PCA_ALIASES_FILE ".XXXXXX" /* mkstemp(3c) */ /* * Given a /devices/<physpath>, return the Configuration Numeric Association * value of that devinfo node obtained directly from the kernel (without * needing to take a devinfo snapshot and search for the node). If there is * a problem, return 0L. */ uint64_t di_physpath_cna_dev(const char *__physpath); /* * Interfaces to pick apart a string array property value list of * "<label>@<addrinfo>" (or " <label>:<addrinfo>") strings. For *_getlbya, if * mfn is NULL, then strcmp() is used -- a caller can supply a custom mfn * function that detects match beyond the constraints of strcmp (like partial * overlap between two "@<phymask> SAS unit address). These interfaces were * developed for processing 'cable-receptacle-labels'/ CABLE_RECEPTACLE_LABELS * 'xxx-bay-labels'/XXX_BAY_LABELS (sas, nvme, usb) devinfo properties. */ char *di_nameaddr_list_getabyi(di_node_t, char *, int); char *di_nameaddr_list_getabyn(di_node_t, char *, char *); char *di_nameaddr_list_getnbya(di_node_t, char *, int __mfn(const char *, const char *), char *); char *di_nameaddr_list_getnbyi(di_node_t, char *, int); int di_nameaddr_list_l(di_node_t, char *); void di_nameaddr_list_getfree(char *); /* * Private interfaces related to SAS HBAs. */ int di_hba_sas_iport_isda(di_node_t __node); /* direct attach */ int di_hba_sas_iport_isea(di_node_t __node); /* expander attach */ char *di_hba_sas_da_enode_pm(di_node_t __node); /* di_node_t @phymask */ char *di_hba_sas_da_epath_pm(di_path_t __path); /* di_path_t @phymask */ /* * Private interfaces for /dev and /devices update synchronization. * NOTE: uint64_t use is for hrtime_t values. */ uint64_t di_timestamp(di_node_t __node); uint64_t di_timestamp_end(di_node_t __node); uint64_t di_cache_timestamp(void); uint64_t di_cache_timestamp_end(void); uint64_t di_devlink_timestamp(di_devlink_handle_t); int di_devlink_sync(uint64_t); uint64_t di_devlink_sync_received_ts(void); int di_cache_invalidate(const char *__path); /* * Private interface to see if a specific inception_point keyword, is * established (i.e. is defined in /etc/devices/inception_points). */ int di_inception_point_established(char *__key, int *__established); #ifdef __cplusplus } #endif #endif /* _LIBDEVINFO_H */