10d63ce2bSvenki /*
20d63ce2bSvenki * CDDL HEADER START
30d63ce2bSvenki *
40d63ce2bSvenki * The contents of this file are subject to the terms of the
50d63ce2bSvenki * Common Development and Distribution License (the "License").
60d63ce2bSvenki * You may not use this file except in compliance with the License.
70d63ce2bSvenki *
80d63ce2bSvenki * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90d63ce2bSvenki * or http://www.opensolaris.org/os/licensing.
100d63ce2bSvenki * See the License for the specific language governing permissions
110d63ce2bSvenki * and limitations under the License.
120d63ce2bSvenki *
130d63ce2bSvenki * When distributing Covered Code, include this CDDL HEADER in each
140d63ce2bSvenki * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150d63ce2bSvenki * If applicable, add the following below this CDDL HEADER, with the
160d63ce2bSvenki * fields enclosed by brackets "[]" replaced with your own identifying
170d63ce2bSvenki * information: Portions Copyright [yyyy] [name of copyright owner]
180d63ce2bSvenki *
190d63ce2bSvenki * CDDL HEADER END
200d63ce2bSvenki */
210d63ce2bSvenki
220d63ce2bSvenki /*
230d63ce2bSvenki * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
240d63ce2bSvenki * Use is subject to license terms.
250d63ce2bSvenki */
260d63ce2bSvenki
270d63ce2bSvenki #include <sys/types.h>
280d63ce2bSvenki #include <errno.h>
290d63ce2bSvenki #include <malloc.h>
300d63ce2bSvenki #include <mdesc.h>
310d63ce2bSvenki #include <pri.h>
320d63ce2bSvenki #include "priplugin.h"
330d63ce2bSvenki
340d63ce2bSvenki static void pri_free(void *bufp, size_t size);
35a90d965dSfw157321 static uint64_t *md_bufp = NULL;
36*d2b9c676Sfw157321 static uint64_t *new_md_bufp;
370d63ce2bSvenki
38*d2b9c676Sfw157321 int
pri_devinit(uint64_t * tok)39*d2b9c676Sfw157321 pri_devinit(uint64_t *tok)
400d63ce2bSvenki {
41*d2b9c676Sfw157321 int status;
420d63ce2bSvenki
43*d2b9c676Sfw157321 new_md_bufp = NULL;
44*d2b9c676Sfw157321 status = 0;
45a90d965dSfw157321 if (pri_get(PRI_WAITGET, tok, &new_md_bufp, malloc, pri_free) ==
460d63ce2bSvenki (ssize_t)-1) {
470d63ce2bSvenki pri_debug(LOG_NOTICE, "pri_devinit: can'r read from "
480d63ce2bSvenki "the PRI: %d\n", errno);
49*d2b9c676Sfw157321 status = -1;
500d63ce2bSvenki }
51a90d965dSfw157321 if (new_md_bufp == NULL) {
520d63ce2bSvenki pri_debug(LOG_NOTICE, "pri_devinit: pri_get returned "
530d63ce2bSvenki "NULL buffer!\n");
54*d2b9c676Sfw157321 status = -1;
550d63ce2bSvenki }
56*d2b9c676Sfw157321 return (status);
57*d2b9c676Sfw157321 }
58*d2b9c676Sfw157321
59*d2b9c676Sfw157321 md_t *
pri_bufinit(md_t * mdp)60*d2b9c676Sfw157321 pri_bufinit(md_t *mdp)
61*d2b9c676Sfw157321 {
62*d2b9c676Sfw157321
63a90d965dSfw157321 if (mdp)
64a90d965dSfw157321 md_fini(mdp);
65a90d965dSfw157321 if (md_bufp)
66a90d965dSfw157321 free(md_bufp);
67a90d965dSfw157321 md_bufp = new_md_bufp;
680d63ce2bSvenki
69*d2b9c676Sfw157321 pri_debug(LOG_NOTICE, "pri_bufinit: done reading PRI\n");
700d63ce2bSvenki
710d63ce2bSvenki /*
720d63ce2bSvenki * The PRI and the MD use the same data format so they can be
730d63ce2bSvenki * parsed by the same functions.
740d63ce2bSvenki */
750d63ce2bSvenki if (md_bufp) {
760d63ce2bSvenki mdp = md_init_intern(md_bufp, malloc, pri_free);
770d63ce2bSvenki if (mdp == NULL) {
78*d2b9c676Sfw157321 pri_debug(LOG_NOTICE, "pri_bufinit: md_init_intern "
790d63ce2bSvenki "failed\n");
800d63ce2bSvenki free(md_bufp);
810d63ce2bSvenki md_bufp = NULL;
820d63ce2bSvenki } else {
83*d2b9c676Sfw157321 pri_debug(LOG_NOTICE, "pri_bufinit: mdi_init_intern "
840d63ce2bSvenki "completed successfully\n");
850d63ce2bSvenki }
860d63ce2bSvenki } else
870d63ce2bSvenki mdp = NULL;
880d63ce2bSvenki
89*d2b9c676Sfw157321 pri_debug(LOG_NOTICE, "pri_bufinit: returning\n");
900d63ce2bSvenki
910d63ce2bSvenki return (mdp);
920d63ce2bSvenki }
930d63ce2bSvenki
940d63ce2bSvenki /*ARGSUSED*/
950d63ce2bSvenki static void
pri_free(void * bufp,size_t size)960d63ce2bSvenki pri_free(void *bufp, size_t size)
970d63ce2bSvenki {
980d63ce2bSvenki if (bufp)
990d63ce2bSvenki free(bufp);
1000d63ce2bSvenki }
1010d63ce2bSvenki
1020d63ce2bSvenki void
pri_devfini(md_t * mdp)1030d63ce2bSvenki pri_devfini(md_t *mdp)
1040d63ce2bSvenki {
1050d63ce2bSvenki if (mdp)
1060d63ce2bSvenki (void) md_fini(mdp);
1070d63ce2bSvenki
1080d63ce2bSvenki if (md_bufp)
1090d63ce2bSvenki free(md_bufp);
1100d63ce2bSvenki md_bufp = NULL;
1110d63ce2bSvenki }
112