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);
35a90d965dSfw static uint64_t *md_bufp = NULL;
36*d2b9c676Sfw static uint64_t *new_md_bufp;
370d63ce2bSvenki 
38*d2b9c676Sfw int
pri_devinit(uint64_t * tok)39*d2b9c676Sfw pri_devinit(uint64_t *tok)
400d63ce2bSvenki {
41*d2b9c676Sfw 	int status;
420d63ce2bSvenki 
43*d2b9c676Sfw 	new_md_bufp = NULL;
44*d2b9c676Sfw 	status = 0;
45a90d965dSfw 	if (pri_get(PRI_WAITGET, tok, &new_md_bufp, malloc, pri_free) ==
46a90d965dSfw 	    (ssize_t)-1) {
47a90d965dSfw 		pri_debug(LOG_NOTICE, "pri_devinit: can'r read from "
48a90d965dSfw 		    "the PRI: %d\n", errno);
49*d2b9c676Sfw 		status = -1;
500d63ce2bSvenki 	}
51a90d965dSfw 	if (new_md_bufp == NULL) {
52*d2b9c676Sfw 		pri_debug(LOG_NOTICE, "pri_devinit: pri_get returned "
53a90d965dSfw 		    "NULL buffer!\n");
54*d2b9c676Sfw 		status = -1;
55a90d965dSfw 	}
56*d2b9c676Sfw 	return (status);
57*d2b9c676Sfw }
58*d2b9c676Sfw 
59*d2b9c676Sfw md_t *
pri_bufinit(md_t * mdp)60*d2b9c676Sfw pri_bufinit(md_t *mdp)
61*d2b9c676Sfw {
62*d2b9c676Sfw 
63a90d965dSfw 	if (mdp)
64a90d965dSfw 		md_fini(mdp);
65a90d965dSfw 	if (md_bufp)
66a90d965dSfw 		free(md_bufp);
67a90d965dSfw 	md_bufp = new_md_bufp;
680d63ce2bSvenki 
69*d2b9c676Sfw 	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*d2b9c676Sfw 			pri_debug(LOG_NOTICE, "pri_bufinit: md_init_intern "
790d63ce2bSvenki 			"failed\n");
800d63ce2bSvenki 			free(md_bufp);
810d63ce2bSvenki 			md_bufp = NULL;
820d63ce2bSvenki 		} else {
83*d2b9c676Sfw 			pri_debug(LOG_NOTICE, "pri_bufinit: mdi_init_intern "
840d63ce2bSvenki 			    "completed successfully\n");
850d63ce2bSvenki 		}
860d63ce2bSvenki 	} else
870d63ce2bSvenki 		mdp = NULL;
880d63ce2bSvenki 
89*d2b9c676Sfw 	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