17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
51ae08745Sheppo * Common Development and Distribution License (the "License").
61ae08745Sheppo * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
211ae08745Sheppo
227c478bd9Sstevel@tonic-gate /*
23*0d63ce2bSvenki * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
247c478bd9Sstevel@tonic-gate * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate */
267c478bd9Sstevel@tonic-gate
277c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
287c478bd9Sstevel@tonic-gate
297c478bd9Sstevel@tonic-gate #include <stdio.h>
307c478bd9Sstevel@tonic-gate #include <unistd.h>
317c478bd9Sstevel@tonic-gate #include <stdlib.h>
327c478bd9Sstevel@tonic-gate #include <sys/types.h>
337c478bd9Sstevel@tonic-gate #include <alloca.h>
347c478bd9Sstevel@tonic-gate #include <sys/stat.h>
357c478bd9Sstevel@tonic-gate #include <malloc.h>
367c478bd9Sstevel@tonic-gate #include <fcntl.h>
377c478bd9Sstevel@tonic-gate #include <syslog.h>
387c478bd9Sstevel@tonic-gate #include <mdesc.h>
397c478bd9Sstevel@tonic-gate #include <string.h>
407c478bd9Sstevel@tonic-gate #include <errno.h>
417c478bd9Sstevel@tonic-gate
427c478bd9Sstevel@tonic-gate #define MDESC_PATH "/devices/pseudo/mdesc@0:mdesc"
437c478bd9Sstevel@tonic-gate
4426cf27f0Sla135387 static void mdesc_free(void *bufp, size_t size);
45*0d63ce2bSvenki uint64_t *md_bufp;
4626cf27f0Sla135387
477c478bd9Sstevel@tonic-gate md_t *
mdesc_devinit(void)487c478bd9Sstevel@tonic-gate mdesc_devinit(void)
497c478bd9Sstevel@tonic-gate {
50*0d63ce2bSvenki int fd;
517c478bd9Sstevel@tonic-gate md_t *mdp;
52*0d63ce2bSvenki size_t size;
537c478bd9Sstevel@tonic-gate
54*0d63ce2bSvenki /*
55*0d63ce2bSvenki * We haven't finished using the previous MD/PRI info.
56*0d63ce2bSvenki */
571ae08745Sheppo if (md_bufp != NULL)
581ae08745Sheppo return (NULL);
591ae08745Sheppo
607c478bd9Sstevel@tonic-gate do {
61*0d63ce2bSvenki if ((fd = open(MDESC_PATH, O_RDONLY, 0)) < 0)
62*0d63ce2bSvenki break;
637c478bd9Sstevel@tonic-gate
64*0d63ce2bSvenki if (ioctl(fd, MDESCIOCGSZ, &size) < 0)
65*0d63ce2bSvenki break;
66*0d63ce2bSvenki if ((md_bufp = (uint64_t *)malloc(size)) == NULL) {
67*0d63ce2bSvenki (void) close(fd);
68*0d63ce2bSvenki break;
697c478bd9Sstevel@tonic-gate }
707c478bd9Sstevel@tonic-gate
71*0d63ce2bSvenki /*
72*0d63ce2bSvenki * A partial read is as bad as a failed read.
73*0d63ce2bSvenki */
74*0d63ce2bSvenki if (read(fd, md_bufp, size) != size) {
751ae08745Sheppo free(md_bufp);
76*0d63ce2bSvenki md_bufp = NULL;
777c478bd9Sstevel@tonic-gate }
787c478bd9Sstevel@tonic-gate
79*0d63ce2bSvenki (void) close(fd);
80*0d63ce2bSvenki /*LINTED: E_CONSTANT_CONDITION */
81*0d63ce2bSvenki } while (0);
827c478bd9Sstevel@tonic-gate
83*0d63ce2bSvenki if (md_bufp) {
84*0d63ce2bSvenki mdp = md_init_intern(md_bufp, malloc, mdesc_free);
85*0d63ce2bSvenki if (mdp == NULL) {
861ae08745Sheppo free(md_bufp);
87*0d63ce2bSvenki md_bufp = NULL;
887c478bd9Sstevel@tonic-gate }
89*0d63ce2bSvenki } else
90*0d63ce2bSvenki mdp = NULL;
917c478bd9Sstevel@tonic-gate
927c478bd9Sstevel@tonic-gate return (mdp);
937c478bd9Sstevel@tonic-gate }
9426cf27f0Sla135387
9526cf27f0Sla135387 /*ARGSUSED*/
9626cf27f0Sla135387 void
mdesc_free(void * bufp,size_t size)9726cf27f0Sla135387 mdesc_free(void *bufp, size_t size)
9826cf27f0Sla135387 {
991ae08745Sheppo if (bufp)
10026cf27f0Sla135387 free(bufp);
10126cf27f0Sla135387 }
1021ae08745Sheppo
1031ae08745Sheppo void
mdesc_devfini(md_t * mdp)1041ae08745Sheppo mdesc_devfini(md_t *mdp)
1051ae08745Sheppo {
1061ae08745Sheppo if (mdp)
1071ae08745Sheppo (void) md_fini(mdp);
1081ae08745Sheppo
1091ae08745Sheppo if (md_bufp)
1101ae08745Sheppo free(md_bufp);
1111ae08745Sheppo md_bufp = NULL;
1121ae08745Sheppo }
113