xref: /onnv-gate/usr/src/lib/libcontract/common/device.c (revision 6073:47f6aa7a8077)
14845Svikram /*
24845Svikram  * CDDL HEADER START
34845Svikram  *
44845Svikram  * The contents of this file are subject to the terms of the
54845Svikram  * Common Development and Distribution License (the "License").
64845Svikram  * You may not use this file except in compliance with the License.
74845Svikram  *
84845Svikram  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94845Svikram  * or http://www.opensolaris.org/os/licensing.
104845Svikram  * See the License for the specific language governing permissions
114845Svikram  * and limitations under the License.
124845Svikram  *
134845Svikram  * When distributing Covered Code, include this CDDL HEADER in each
144845Svikram  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154845Svikram  * If applicable, add the following below this CDDL HEADER, with the
164845Svikram  * fields enclosed by brackets "[]" replaced with your own identifying
174845Svikram  * information: Portions Copyright [yyyy] [name of copyright owner]
184845Svikram  *
194845Svikram  * CDDL HEADER END
204845Svikram  */
214845Svikram /*
22*6073Sacruz  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
234845Svikram  * Use is subject to license terms.
244845Svikram  */
254845Svikram 
264845Svikram #pragma ident	"%Z%%M%	%I%	%E% SMI"
274845Svikram 
284845Svikram #include <sys/ctfs.h>
294845Svikram #include <sys/contract.h>
304845Svikram #include <sys/contract/device.h>
314845Svikram #include <errno.h>
324845Svikram #include <unistd.h>
334845Svikram #include <string.h>
344845Svikram #include <libnvpair.h>
354845Svikram #include <limits.h>
364845Svikram #include <sys/stat.h>
374845Svikram #include <libcontract.h>
384845Svikram #include "libcontract_impl.h"
394845Svikram 
404845Svikram /*
414845Svikram  * Device contract template routines
424845Svikram  */
434845Svikram 
444845Svikram int
ct_dev_tmpl_set_minor(int fd,char * minor)454845Svikram ct_dev_tmpl_set_minor(int fd, char *minor)
464845Svikram {
47*6073Sacruz 	return (ct_tmpl_set_internal_string(fd, CTDP_MINOR, minor));
484845Svikram }
494845Svikram 
504845Svikram int
ct_dev_tmpl_set_aset(int fd,uint_t aset)514845Svikram ct_dev_tmpl_set_aset(int fd, uint_t aset)
524845Svikram {
534845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_ACCEPT, aset));
544845Svikram }
554845Svikram 
564845Svikram int
ct_dev_tmpl_set_noneg(int fd)574845Svikram ct_dev_tmpl_set_noneg(int fd)
584845Svikram {
594845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_NONEG, CTDP_NONEG_SET));
604845Svikram }
614845Svikram 
624845Svikram int
ct_dev_tmpl_clear_noneg(int fd)634845Svikram ct_dev_tmpl_clear_noneg(int fd)
644845Svikram {
654845Svikram 	return (ct_tmpl_set_internal(fd, CTDP_NONEG, CTDP_NONEG_CLEAR));
664845Svikram }
674845Svikram 
684845Svikram int
ct_dev_tmpl_get_minor(int fd,char * buf,size_t * buflenp)694845Svikram ct_dev_tmpl_get_minor(int fd, char *buf, size_t *buflenp)
704845Svikram {
71*6073Sacruz 	int ret = ct_tmpl_get_internal_string(fd, CTDP_MINOR, buf, *buflenp);
724845Svikram 
73*6073Sacruz 	if (ret == -1)
74*6073Sacruz 		return (errno);
754845Svikram 
76*6073Sacruz 	if (ret >= *buflenp) {
77*6073Sacruz 		*buflenp = ret + 1;
784845Svikram 		return (EOVERFLOW);
794845Svikram 	}
804845Svikram 
814845Svikram 	return (0);
824845Svikram }
834845Svikram 
844845Svikram int
ct_dev_tmpl_get_aset(int fd,uint_t * aset)854845Svikram ct_dev_tmpl_get_aset(int fd, uint_t *aset)
864845Svikram {
874845Svikram 	return (ct_tmpl_get_internal(fd, CTDP_ACCEPT, aset));
884845Svikram }
894845Svikram 
904845Svikram int
ct_dev_tmpl_get_noneg(int fd,uint_t * negp)914845Svikram ct_dev_tmpl_get_noneg(int fd, uint_t *negp)
924845Svikram {
934845Svikram 	return (ct_tmpl_get_internal(fd, CTDP_NONEG, negp));
944845Svikram }
954845Svikram 
964845Svikram /*
974845Svikram  * Device contract event routines
984845Svikram  */
994845Svikram 
1004845Svikram /*
1014845Svikram  * No device contract specific event routines
1024845Svikram  */
1034845Svikram 
1044845Svikram 
1054845Svikram /*
1064845Svikram  * Device contract status routines
1074845Svikram  */
1084845Svikram 
1094845Svikram int
ct_dev_status_get_aset(ct_stathdl_t stathdl,uint_t * aset)1104845Svikram ct_dev_status_get_aset(ct_stathdl_t stathdl, uint_t *aset)
1114845Svikram {
1124845Svikram 	struct ctlib_status_info *info = stathdl;
1134845Svikram 
1144845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
1154845Svikram 		return (EINVAL);
1164845Svikram 
1174845Svikram 	if (info->nvl == NULL)
1184845Svikram 		return (ENOENT);
1194845Svikram 
1204845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_ASET, aset));
1214845Svikram }
1224845Svikram 
1234845Svikram int
ct_dev_status_get_noneg(ct_stathdl_t stathdl,uint_t * negp)1244845Svikram ct_dev_status_get_noneg(ct_stathdl_t stathdl, uint_t *negp)
1254845Svikram {
1264845Svikram 	struct ctlib_status_info *info = stathdl;
1274845Svikram 
1284845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
1294845Svikram 		return (EINVAL);
1304845Svikram 
1314845Svikram 	if (info->nvl == NULL)
1324845Svikram 		return (ENOENT);
1334845Svikram 
1344845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_NONEG, negp));
1354845Svikram }
1364845Svikram 
1374845Svikram int
ct_dev_status_get_dev_state(ct_stathdl_t stathdl,uint_t * statep)1384845Svikram ct_dev_status_get_dev_state(ct_stathdl_t stathdl, uint_t *statep)
1394845Svikram {
1404845Svikram 	struct ctlib_status_info *info = stathdl;
1414845Svikram 
1424845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
1434845Svikram 		return (EINVAL);
1444845Svikram 
1454845Svikram 	if (info->nvl == NULL)
1464845Svikram 		return (ENOENT);
1474845Svikram 
1484845Svikram 	return (nvlist_lookup_uint32(info->nvl, CTDS_STATE, statep));
1494845Svikram }
1504845Svikram 
1514845Svikram int
ct_dev_status_get_minor(ct_stathdl_t stathdl,char ** bufp)1524845Svikram ct_dev_status_get_minor(ct_stathdl_t stathdl, char **bufp)
1534845Svikram {
1544845Svikram 	int error;
1554845Svikram 	struct ctlib_status_info *info = stathdl;
1564845Svikram 
1574845Svikram 	if (bufp == NULL)
1584845Svikram 		return (EINVAL);
1594845Svikram 
1604845Svikram 	if (info->status.ctst_type != CTT_DEVICE)
1614845Svikram 		return (EINVAL);
1624845Svikram 
1634845Svikram 	if (info->nvl == NULL)
1644845Svikram 		return (ENOENT);
1654845Svikram 
1664845Svikram 	error = nvlist_lookup_string(info->nvl, CTDS_MINOR, bufp);
1674845Svikram 	if (error != 0) {
1684845Svikram 		return (error);
1694845Svikram 	}
1704845Svikram 
1714845Svikram 	return (0);
1724845Svikram }
173