1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 23 /* 24 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 #pragma ident "%Z%%M% %I% %E% SMI" 29 30 #include "synonyms.h" 31 #include <sys/rctl_impl.h> 32 #include <stdlib.h> 33 #include <string.h> 34 #include <rctl.h> 35 36 /* 37 * Resource control routines 38 * 39 * rctl_walk(3C) 40 * 41 * Resource control block manipulation routines 42 * The setrctl(2) and getrctl(2) interfaces are accessed via opaque resource 43 * control blocks, the characteristics of which are in turn set and fetched 44 * using the following functions. Applications using the following interfaces 45 * will be binary compatible across enhancements to the resource control 46 * subsystem that involve modification of the control block. 47 */ 48 int 49 rctl_walk(int (*callback)(const char *rctlname, void *walk_data), 50 void *init_data) 51 { 52 int ret = 0; 53 char *ctl_names, *curr_name; 54 size_t sz = rctllist(NULL, 0); 55 56 if ((ctl_names = malloc(sz)) == NULL) 57 return (-1); 58 59 (void) rctllist(ctl_names, sz); 60 61 for (curr_name = ctl_names; 62 curr_name < ctl_names + sz; 63 curr_name += strlen(curr_name) + 1) { 64 if (ret = callback(curr_name, init_data)) { 65 free(ctl_names); 66 return (ret); 67 } 68 } 69 70 free(ctl_names); 71 return (ret); 72 } 73 74 uint_t 75 rctlblk_get_global_action(rctlblk_t *rblk) 76 { 77 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 78 79 return (ropaque->rcq_global_flagaction & (~RCTL_GLOBAL_ACTION_MASK)); 80 } 81 82 uint_t 83 rctlblk_get_local_action(rctlblk_t *rblk, int *signal) 84 { 85 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 86 87 if (signal != NULL) 88 *signal = ropaque->rcq_local_signal; 89 return (ropaque->rcq_local_flagaction & (~RCTL_LOCAL_ACTION_MASK)); 90 } 91 92 uint_t 93 rctlblk_get_global_flags(rctlblk_t *rblk) 94 { 95 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 96 97 return (ropaque->rcq_global_flagaction & RCTL_GLOBAL_ACTION_MASK); 98 } 99 100 uint_t 101 rctlblk_get_local_flags(rctlblk_t *rblk) 102 { 103 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 104 105 return (ropaque->rcq_local_flagaction & RCTL_LOCAL_ACTION_MASK); 106 } 107 108 hrtime_t 109 rctlblk_get_firing_time(rctlblk_t *rblk) 110 { 111 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 112 113 return (ropaque->rcq_firing_time); 114 } 115 116 id_t 117 rctlblk_get_recipient_pid(rctlblk_t *rblk) 118 { 119 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 120 121 return (ropaque->rcq_local_recipient_pid); 122 } 123 124 rctl_priv_t 125 rctlblk_get_privilege(rctlblk_t *rblk) 126 { 127 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 128 return (ropaque->rcq_privilege); 129 } 130 131 rctl_qty_t 132 rctlblk_get_value(rctlblk_t *rblk) 133 { 134 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 135 return (ropaque->rcq_value); 136 } 137 138 rctl_qty_t 139 rctlblk_get_enforced_value(rctlblk_t *rblk) 140 { 141 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 142 return (ropaque->rcq_enforced_value); 143 } 144 145 void 146 rctlblk_set_local_action(rctlblk_t *rblk, uint_t action, int signal) 147 { 148 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 149 ropaque->rcq_local_signal = signal; 150 ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction & 151 RCTL_LOCAL_ACTION_MASK) | (action & ~RCTL_LOCAL_ACTION_MASK); 152 } 153 154 void 155 rctlblk_set_local_flags(rctlblk_t *rblk, uint_t flags) 156 { 157 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 158 ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction & 159 ~RCTL_LOCAL_ACTION_MASK) | (flags & RCTL_LOCAL_ACTION_MASK); 160 } 161 162 void 163 rctlblk_set_recipient_pid(rctlblk_t *rblk, id_t pid) 164 { 165 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 166 ropaque->rcq_local_recipient_pid = pid; 167 } 168 169 void 170 rctlblk_set_privilege(rctlblk_t *rblk, rctl_priv_t privilege) 171 { 172 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 173 ropaque->rcq_privilege = privilege; 174 } 175 176 void 177 rctlblk_set_value(rctlblk_t *rblk, rctl_qty_t value) 178 { 179 rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk; 180 ropaque->rcq_value = value; 181 } 182 183 size_t 184 rctlblk_size(void) 185 { 186 return (sizeof (rctl_opaque_t)); 187 } 188