ses_plugin.c revision c5904d138f3bdf0762dbf452a43d5a5c387ea6a8
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * CDDL HEADER START
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * The contents of this file are subject to the terms of the
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Common Development and Distribution License (the "License").
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * You may not use this file except in compliance with the License.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * See the License for the specific language governing permissions
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * and limitations under the License.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * When distributing Covered Code, include this CDDL HEADER in each
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * If applicable, add the following below this CDDL HEADER, with the
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * fields enclosed by brackets "[]" replaced with your own identifying
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * CDDL HEADER END
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Use is subject to license terms.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock#pragma ident "%Z%%M% %I% %E% SMI"
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock/*ARGSUSED*/
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_ctlpage_lookup(ses_plugin_t *sp, ses_snap_t *snap, int pagenum,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((pp = ses_snap_ctl_page(snap, pagenum, len, unique)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((dp = ses_get_pagedesc(tp, pagenum, SES_PAGE_CTL)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (sp = tp->st_plugin_first; sp != NULL; sp = sp->sp_next) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_node_ctl(ses_node_t *np, const char *op, nvlist_t *arg)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Technically we could get away with a per-snapshot lock while we fill
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * the control page contents, but this doesn't take much time and we
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * want actual control operations to be protected per-target, so we just
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * take the target lock.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * We walk the list of plugins backwards, so that a product-specific
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * plugin can rewrite the nvlist to control operations in terms of the
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * standard mechanisms, if desired.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (sp = tp->st_plugin_first; sp != NULL; sp = sp->sp_next) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((nvp = nvlist_next_nvpair(nvl, NULL)) != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) ses_error(ESES_NOTSUP, "property '%s' invalid for "
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock/*ARGSUSED*/
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_page_lookup(ses_plugin_t *sp, ses_snap_t *snap, int pagenum,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((dp = ses_get_pagedesc(tp, pagenum, SES_PAGE_DIAG)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((pp = ses_snap_find_page(snap, pagenum, B_FALSE)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (dp->spd_index(sp, np, pp->ssp_page, pp->ssp_len,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_get_pagedesc(ses_target_t *tp, int pagenum, ses_pagetype_t type)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (sp = tp->st_plugin_first; sp != NULL; sp = sp->sp_next) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((type == SES_PAGE_CTL && dp->spd_ctl_len == NULL) ||
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (type == SES_PAGE_DIAG && dp->spd_ctl_len != NULL))
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) ses_error(ESES_BAD_PAGE, "failed to find page 0x%x", pagenum);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_register(ses_plugin_t *sp, int version, ses_plugin_config_t *scp)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_setspecific(ses_plugin_t *sp, void *data)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock while (*s != '\0') {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_loadone(ses_target_t *tp, const char *path, uint32_t pass)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock int (*ses_priority)(void);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((obj = dlopen(path, RTLD_PARENT | RTLD_LOCAL | RTLD_LAZY)) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((sp = ses_zalloc(sizeof (ses_plugin_t))) == NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Framework modules can establish an explicit prioritying by declaring
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * the '_ses_priority' symbol, which returns an integer used to create
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * an explicit ordering between plugins.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((ses_priority = (int (*)())dlsym(obj, "_ses_priority")) != NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (loc = &tp->st_plugin_first; *loc != NULL; loc = &(*loc)->sp_next) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrockses_plugin_load_dir(ses_target_t *tp, const char *pluginroot)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (sysinfo(SI_ARCHITECTURE_64, isa, sizeof (isa)) < 0)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) snprintf(path, sizeof (path), "%s/%s/%s/%s",
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * Create a local copy of the vendor/product/revision, strip out any
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock * questionable characters, and then attempt to load each plugin.
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock vendor = alloca(strlen(libscsi_vendor(tp->st_target)) + 1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock product = alloca(strlen(libscsi_product(tp->st_target)) + 1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock revision = alloca(strlen(libscsi_revision(tp->st_target)) + 1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) strcpy(vendor, libscsi_vendor(tp->st_target));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) strcpy(product, libscsi_product(tp->st_target));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) strcpy(revision, libscsi_revision(tp->st_target));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) snprintf(path, sizeof (path), "%s/%s/%s/%s%s", pluginroot,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) snprintf(path, sizeof (path), "%s/%s/%s/%s-%s%s", pluginroot,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock (void) snprintf(path, sizeof (path), "%s/%s/%s/%s-%s-%s%s", pluginroot,
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock const char *pluginpath, *p, *q;
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if ((pluginpath = getenv("SES_PLUGINPATH")) == NULL)
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock ses_plugin_dlclose = (getenv("SES_NODLCLOSE") == NULL);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock for (p = pluginpath, q = strchr(p, ':'); p != NULL; p = q) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (q != NULL) {
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock while (*q == ':')
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock if (*q == '\0')
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (-1);
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (ses_error(ESES_PLUGIN, "no plugins found"));
275c9da86e89f8abf71135cf63d9fc23671b2e60eschrock return (0);