2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A
2N/A#include "lint.h"
2N/A#include <sys/rctl_impl.h>
2N/A#include <stdlib.h>
2N/A#include <string.h>
2N/A#include <rctl.h>
2N/A
2N/A/*
2N/A * Resource control routines
2N/A *
2N/A * rctl_walk(3C)
2N/A *
2N/A * Resource control block manipulation routines
2N/A * The setrctl(2) and getrctl(2) interfaces are accessed via opaque resource
2N/A * control blocks, the characteristics of which are in turn set and fetched
2N/A * using the following functions. Applications using the following interfaces
2N/A * will be binary compatible across enhancements to the resource control
2N/A * subsystem that involve modification of the control block.
2N/A */
2N/Aint
2N/Arctl_walk(int (*callback)(const char *rctlname, void *walk_data),
2N/A void *init_data)
2N/A{
2N/A int ret = 0;
2N/A char *ctl_names, *curr_name;
2N/A size_t sz = rctllist(NULL, 0);
2N/A
2N/A if ((ctl_names = malloc(sz)) == NULL)
2N/A return (-1);
2N/A
2N/A (void) rctllist(ctl_names, sz);
2N/A
2N/A for (curr_name = ctl_names;
2N/A curr_name < ctl_names + sz;
2N/A curr_name += strlen(curr_name) + 1) {
2N/A if (ret = callback(curr_name, init_data)) {
2N/A free(ctl_names);
2N/A return (ret);
2N/A }
2N/A }
2N/A
2N/A free(ctl_names);
2N/A return (ret);
2N/A}
2N/A
2N/Auint_t
2N/Arctlblk_get_global_action(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A return (ropaque->rcq_global_flagaction & (~RCTL_GLOBAL_ACTION_MASK));
2N/A}
2N/A
2N/Auint_t
2N/Arctlblk_get_local_action(rctlblk_t *rblk, int *signal)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A if (signal != NULL)
2N/A *signal = ropaque->rcq_local_signal;
2N/A return (ropaque->rcq_local_flagaction & (~RCTL_LOCAL_ACTION_MASK));
2N/A}
2N/A
2N/Auint_t
2N/Arctlblk_get_global_flags(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A return (ropaque->rcq_global_flagaction & RCTL_GLOBAL_ACTION_MASK);
2N/A}
2N/A
2N/Auint_t
2N/Arctlblk_get_local_flags(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A return (ropaque->rcq_local_flagaction & RCTL_LOCAL_ACTION_MASK);
2N/A}
2N/A
2N/Ahrtime_t
2N/Arctlblk_get_firing_time(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A return (ropaque->rcq_firing_time);
2N/A}
2N/A
2N/Aid_t
2N/Arctlblk_get_recipient_pid(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A
2N/A return (ropaque->rcq_local_recipient_pid);
2N/A}
2N/A
2N/Arctl_priv_t
2N/Arctlblk_get_privilege(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A return (ropaque->rcq_privilege);
2N/A}
2N/A
2N/Arctl_qty_t
2N/Arctlblk_get_value(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A return (ropaque->rcq_value);
2N/A}
2N/A
2N/Arctl_qty_t
2N/Arctlblk_get_enforced_value(rctlblk_t *rblk)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A return (ropaque->rcq_enforced_value);
2N/A}
2N/A
2N/Avoid
2N/Arctlblk_set_local_action(rctlblk_t *rblk, uint_t action, int signal)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A ropaque->rcq_local_signal = signal;
2N/A ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction &
2N/A RCTL_LOCAL_ACTION_MASK) | (action & ~RCTL_LOCAL_ACTION_MASK);
2N/A}
2N/A
2N/Avoid
2N/Arctlblk_set_local_flags(rctlblk_t *rblk, uint_t flags)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction &
2N/A ~RCTL_LOCAL_ACTION_MASK) | (flags & RCTL_LOCAL_ACTION_MASK);
2N/A}
2N/A
2N/Avoid
2N/Arctlblk_set_recipient_pid(rctlblk_t *rblk, id_t pid)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A ropaque->rcq_local_recipient_pid = pid;
2N/A}
2N/A
2N/Avoid
2N/Arctlblk_set_privilege(rctlblk_t *rblk, rctl_priv_t privilege)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A ropaque->rcq_privilege = privilege;
2N/A}
2N/A
2N/Avoid
2N/Arctlblk_set_value(rctlblk_t *rblk, rctl_qty_t value)
2N/A{
2N/A rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
2N/A ropaque->rcq_value = value;
2N/A}
2N/A
2N/Asize_t
2N/Arctlblk_size(void)
2N/A{
2N/A return (sizeof (rctl_opaque_t));
2N/A}