1*4845Svikram /*
2*4845Svikram  * CDDL HEADER START
3*4845Svikram  *
4*4845Svikram  * The contents of this file are subject to the terms of the
5*4845Svikram  * Common Development and Distribution License (the "License").
6*4845Svikram  * You may not use this file except in compliance with the License.
7*4845Svikram  *
8*4845Svikram  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*4845Svikram  * or http://www.opensolaris.org/os/licensing.
10*4845Svikram  * See the License for the specific language governing permissions
11*4845Svikram  * and limitations under the License.
12*4845Svikram  *
13*4845Svikram  * When distributing Covered Code, include this CDDL HEADER in each
14*4845Svikram  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*4845Svikram  * If applicable, add the following below this CDDL HEADER, with the
16*4845Svikram  * fields enclosed by brackets "[]" replaced with your own identifying
17*4845Svikram  * information: Portions Copyright [yyyy] [name of copyright owner]
18*4845Svikram  *
19*4845Svikram  * CDDL HEADER END
20*4845Svikram  */
21*4845Svikram /*
22*4845Svikram  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*4845Svikram  * Use is subject to license terms.
24*4845Svikram  */
25*4845Svikram 
26*4845Svikram #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*4845Svikram 
28*4845Svikram #include <sys/ctfs.h>
29*4845Svikram #include <sys/contract.h>
30*4845Svikram #include <sys/contract/device.h>
31*4845Svikram #include <errno.h>
32*4845Svikram #include <unistd.h>
33*4845Svikram #include <string.h>
34*4845Svikram #include <libnvpair.h>
35*4845Svikram #include <limits.h>
36*4845Svikram #include <sys/stat.h>
37*4845Svikram #include <libcontract.h>
38*4845Svikram #include "libcontract_impl.h"
39*4845Svikram 
40*4845Svikram /*
41*4845Svikram  * Device contract template routines
42*4845Svikram  */
43*4845Svikram 
44*4845Svikram int
45*4845Svikram ct_dev_tmpl_set_minor(int fd, char *minor)
46*4845Svikram {
47*4845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_MINOR, (uintptr_t)minor));
48*4845Svikram }
49*4845Svikram 
50*4845Svikram int
51*4845Svikram ct_dev_tmpl_set_aset(int fd, uint_t aset)
52*4845Svikram {
53*4845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_ACCEPT, aset));
54*4845Svikram }
55*4845Svikram 
56*4845Svikram int
57*4845Svikram ct_dev_tmpl_set_noneg(int fd)
58*4845Svikram {
59*4845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_NONEG, CTDP_NONEG_SET));
60*4845Svikram }
61*4845Svikram 
62*4845Svikram int
63*4845Svikram ct_dev_tmpl_clear_noneg(int fd)
64*4845Svikram {
65*4845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_NONEG, CTDP_NONEG_CLEAR));
66*4845Svikram }
67*4845Svikram 
68*4845Svikram int
69*4845Svikram ct_dev_tmpl_get_minor(int fd, char *buf, size_t *buflenp)
70*4845Svikram {
71*4845Svikram 	char	path[PATH_MAX];
72*4845Svikram 	int	error;
73*4845Svikram 	size_t	len;
74*4845Svikram 
75*4845Svikram 	error = ct_tmpl_get_internal_string(fd, CTDP_MINOR, path);
76*4845Svikram 	if (error) {
77*4845Svikram 		return (error);
78*4845Svikram 	}
79*4845Svikram 
80*4845Svikram 	len = strlcpy(buf, path, *buflenp);
81*4845Svikram 	if (len >= *buflenp) {
82*4845Svikram 		*buflenp = len + 1;
83*4845Svikram 		return (EOVERFLOW);
84*4845Svikram 	}
85*4845Svikram 
86*4845Svikram 	return (0);
87*4845Svikram }
88*4845Svikram 
89*4845Svikram int
90*4845Svikram ct_dev_tmpl_get_aset(int fd, uint_t *aset)
91*4845Svikram {
92*4845Svikram 	return (ct_tmpl_get_internal(fd, CTDP_ACCEPT, aset));
93*4845Svikram }
94*4845Svikram 
95*4845Svikram int
96*4845Svikram ct_dev_tmpl_get_noneg(int fd, uint_t *negp)
97*4845Svikram {
98*4845Svikram 	return (ct_tmpl_get_internal(fd, CTDP_NONEG, negp));
99*4845Svikram }
100*4845Svikram 
101*4845Svikram /*
102*4845Svikram  * Device contract event routines
103*4845Svikram  */
104*4845Svikram 
105*4845Svikram /*
106*4845Svikram  * No device contract specific event routines
107*4845Svikram  */
108*4845Svikram 
109*4845Svikram 
110*4845Svikram /*
111*4845Svikram  * Device contract status routines
112*4845Svikram  */
113*4845Svikram 
114*4845Svikram int
115*4845Svikram ct_dev_status_get_aset(ct_stathdl_t stathdl, uint_t *aset)
116*4845Svikram {
117*4845Svikram 	struct ctlib_status_info *info = stathdl;
118*4845Svikram 
119*4845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
120*4845Svikram 		return (EINVAL);
121*4845Svikram 
122*4845Svikram 	if (info->nvl == NULL)
123*4845Svikram 		return (ENOENT);
124*4845Svikram 
125*4845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_ASET, aset));
126*4845Svikram }
127*4845Svikram 
128*4845Svikram int
129*4845Svikram ct_dev_status_get_noneg(ct_stathdl_t stathdl, uint_t *negp)
130*4845Svikram {
131*4845Svikram 	struct ctlib_status_info *info = stathdl;
132*4845Svikram 
133*4845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
134*4845Svikram 		return (EINVAL);
135*4845Svikram 
136*4845Svikram 	if (info->nvl == NULL)
137*4845Svikram 		return (ENOENT);
138*4845Svikram 
139*4845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_NONEG, negp));
140*4845Svikram }
141*4845Svikram 
142*4845Svikram int
143*4845Svikram ct_dev_status_get_dev_state(ct_stathdl_t stathdl, uint_t *statep)
144*4845Svikram {
145*4845Svikram 	struct ctlib_status_info *info = stathdl;
146*4845Svikram 
147*4845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
148*4845Svikram 		return (EINVAL);
149*4845Svikram 
150*4845Svikram 	if (info->nvl == NULL)
151*4845Svikram 		return (ENOENT);
152*4845Svikram 
153*4845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_STATE, statep));
154*4845Svikram }
155*4845Svikram 
156*4845Svikram int
157*4845Svikram ct_dev_status_get_minor(ct_stathdl_t stathdl, char **bufp)
158*4845Svikram {
159*4845Svikram 	int error;
160*4845Svikram 	struct ctlib_status_info *info = stathdl;
161*4845Svikram 
162*4845Svikram 	if (bufp == NULL)
163*4845Svikram 		return (EINVAL);
164*4845Svikram 
165*4845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
166*4845Svikram 		return (EINVAL);
167*4845Svikram 
168*4845Svikram 	if (info->nvl == NULL)
169*4845Svikram 		return (ENOENT);
170*4845Svikram 
171*4845Svikram 	error = nvlist_lookup_string(info->nvl, CTDS_MINOR, bufp);
172*4845Svikram 	if (error != 0) {
173*4845Svikram 		return (error);
174*4845Svikram 	}
175*4845Svikram 
176*4845Svikram 	return (0);
177*4845Svikram }
178