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 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 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 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 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 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 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 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 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 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 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 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