0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * CDDL HEADER START
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * The contents of this file are subject to the terms of the
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Common Development and Distribution License (the "License").
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * You may not use this file except in compliance with the License.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * or http://www.opensolaris.org/os/licensing.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * See the License for the specific language governing permissions
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * and limitations under the License.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * When distributing Covered Code, include this CDDL HEADER in each
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * If applicable, add the following below this CDDL HEADER, with the
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * fields enclosed by brackets "[]" replaced with your own identifying
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * information: Portions Copyright [yyyy] [name of copyright owner]
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * CDDL HEADER END
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Use is subject to license terms.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#pragma ident "%Z%%M% %I% %E% SMI"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <sys/types.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <errno.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <malloc.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <mdesc.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include <pri.h>
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include "priplugin.h"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void pri_free(void *bufp, size_t size);
a90d965d832a5578dbfc2eadd1617e8cccf25264fwstatic uint64_t *md_bufp = NULL;
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fwstatic uint64_t *new_md_bufp;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fwint
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fwpri_devinit(uint64_t *tok)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw int status;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw new_md_bufp = NULL;
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw status = 0;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (pri_get(PRI_WAITGET, tok, &new_md_bufp, malloc, pri_free) ==
a90d965d832a5578dbfc2eadd1617e8cccf25264fw (ssize_t)-1) {
a90d965d832a5578dbfc2eadd1617e8cccf25264fw pri_debug(LOG_NOTICE, "pri_devinit: can'r read from "
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "the PRI: %d\n", errno);
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw status = -1;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (new_md_bufp == NULL) {
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw pri_debug(LOG_NOTICE, "pri_devinit: pri_get returned "
a90d965d832a5578dbfc2eadd1617e8cccf25264fw "NULL buffer!\n");
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw status = -1;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw }
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw return (status);
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw}
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fwmd_t *
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fwpri_bufinit(md_t *mdp)
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw{
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (mdp)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw md_fini(mdp);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw if (md_bufp)
a90d965d832a5578dbfc2eadd1617e8cccf25264fw free(md_bufp);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw md_bufp = new_md_bufp;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw pri_debug(LOG_NOTICE, "pri_bufinit: done reading PRI\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * The PRI and the MD use the same data format so they can be
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * parsed by the same functions.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (md_bufp) {
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki mdp = md_init_intern(md_bufp, malloc, pri_free);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (mdp == NULL) {
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw pri_debug(LOG_NOTICE, "pri_bufinit: md_init_intern "
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki "failed\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(md_bufp);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki md_bufp = NULL;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else {
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw pri_debug(LOG_NOTICE, "pri_bufinit: mdi_init_intern "
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki "completed successfully\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki } else
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki mdp = NULL;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw pri_debug(LOG_NOTICE, "pri_bufinit: returning\n");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki return (mdp);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*ARGSUSED*/
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkipri_free(void *bufp, size_t size)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (bufp)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(bufp);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkivoid
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkipri_devfini(md_t *mdp)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (mdp)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki (void) md_fini(mdp);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (md_bufp)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki free(md_bufp);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki md_bufp = NULL;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}