diff options
Diffstat (limited to 'usr/src/cmd/fm/schemes/mod/scheme.c')
-rw-r--r-- | usr/src/cmd/fm/schemes/mod/scheme.c | 140 |
1 files changed, 18 insertions, 122 deletions
diff --git a/usr/src/cmd/fm/schemes/mod/scheme.c b/usr/src/cmd/fm/schemes/mod/scheme.c index 7284bb54a8..87f728b5f8 100644 --- a/usr/src/cmd/fm/schemes/mod/scheme.c +++ b/usr/src/cmd/fm/schemes/mod/scheme.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,144 +19,41 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" #include <fm/fmd_fmri.h> - -/* - * buf_append -- Append str to buf (if it's non-NULL). Place prepend - * in buf in front of str and append behind it (if they're non-NULL). - * Continue to update size even if we run out of space to actually - * stuff characters in the buffer. - */ -static void -buf_append(ssize_t *sz, char *buf, size_t buflen, char *str, - char *prepend, char *append) -{ - ssize_t left; - - if (str == NULL) - return; - - if (buflen == 0 || (left = buflen - *sz) < 0) - left = 0; - - if (buf != NULL && left != 0) - buf += *sz; - - if (prepend == NULL && append == NULL) - *sz += snprintf(buf, left, "%s", str); - else if (append == NULL) - *sz += snprintf(buf, left, "%s%s", prepend, str); - else if (prepend == NULL) - *sz += snprintf(buf, left, "%s%s", str, append); - else - *sz += snprintf(buf, left, "%s%s%s", prepend, str, append); -} - -/* - * Maximum 32 bit integer is 2147483647, which is 10 digits. A buffer - * of 11 bytes can therefore contain the null-terminated ascii - * representation of any integer module id. - */ -#define MAXINTSTR 11 +#include <fm/libtopo.h> +#include <strings.h> ssize_t fmd_fmri_nvl2str(nvlist_t *nvl, char *buf, size_t buflen) { - nvlist_t *anvl = NULL; - uint8_t version; - ssize_t size = 0; - int32_t modid; - char *achas = NULL; - char *adom = NULL; - char *aprod = NULL; - char *asrvr = NULL; - char *ahost = NULL; - char *modname = NULL; - char numbuf[MAXINTSTR]; - int more_auth = 0; int err; + ssize_t len; + topo_hdl_t *thp; + char *str; - if (nvlist_lookup_uint8(nvl, FM_VERSION, &version) != 0 || - version > FM_MOD_SCHEME_VERSION) - return (fmd_fmri_set_errno(EINVAL)); - - /* Get authority, if present */ - err = nvlist_lookup_nvlist(nvl, FM_FMRI_AUTHORITY, &anvl); - if (err != 0 && err != ENOENT) - return (fmd_fmri_set_errno(err)); - - /* - * For brevity, we only include the module name and id - * present in the FMRI in our output string. The FMRI - * also has data on the package containing the module. - */ - - /* There must be a module name */ - err = nvlist_lookup_string(nvl, FM_FMRI_MOD_NAME, &modname); - if (err != 0 || modname == NULL) + if ((thp = fmd_fmri_topo_hold(TOPO_VERSION)) == NULL) return (fmd_fmri_set_errno(EINVAL)); - /* There must be a module id */ - err = nvlist_lookup_int32(nvl, FM_FMRI_MOD_ID, &modid); - if (err != 0) + if (topo_fmri_nvl2str(thp, nvl, &str, &err) != 0) { + fmd_fmri_topo_rele(thp); return (fmd_fmri_set_errno(EINVAL)); - - if (anvl != NULL) { - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_PRODUCT, &aprod); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_CHASSIS, &achas); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_DOMAIN, &adom); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_SERVER, &asrvr); - (void) nvlist_lookup_string(anvl, - FM_FMRI_AUTH_HOST, &ahost); - if (aprod != NULL) - more_auth++; - if (achas != NULL) - more_auth++; - if (adom != NULL) - more_auth++; - if (asrvr != NULL) - more_auth++; - if (ahost != NULL) - more_auth++; } - /* mod:// */ - buf_append(&size, buf, buflen, FM_FMRI_SCHEME_MOD, NULL, "://"); - - /* authority, if any */ - if (aprod != NULL) - buf_append(&size, buf, buflen, aprod, FM_FMRI_AUTH_PRODUCT "=", - --more_auth > 0 ? "," : NULL); - if (achas != NULL) - buf_append(&size, buf, buflen, achas, FM_FMRI_AUTH_CHASSIS "=", - --more_auth > 0 ? "," : NULL); - if (adom != NULL) - buf_append(&size, buf, buflen, adom, FM_FMRI_AUTH_DOMAIN "=", - --more_auth > 0 ? "," : NULL); - if (asrvr != NULL) - buf_append(&size, buf, buflen, asrvr, FM_FMRI_AUTH_SERVER "=", - --more_auth > 0 ? "," : NULL); - if (ahost != NULL) - buf_append(&size, buf, buflen, ahost, FM_FMRI_AUTH_HOST "=", - NULL); - - /* module parts */ - buf_append(&size, buf, buflen, modname, "/" FM_FMRI_MOD_NAME "=", "/"); + if (buf != NULL) + len = snprintf(buf, buflen, "%s", str); + else + len = strlen(str); - (void) snprintf(numbuf, MAXINTSTR, "%d", modid); - buf_append(&size, buf, buflen, numbuf, FM_FMRI_MOD_ID "=", NULL); + topo_hdl_strfree(thp, str); + fmd_fmri_topo_rele(thp); - return (size); + return (len); } /* |