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