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