#include "lint.h"
#include <sys/rctl_impl.h>
#include <stdlib.h>
#include <string.h>
#include <rctl.h>
int
rctl_walk(int (*callback)(const char *rctlname, void *walk_data),
void *init_data)
{
int ret = 0;
char *ctl_names, *curr_name;
size_t sz = rctllist(NULL, 0);
if ((ctl_names = malloc(sz)) == NULL)
return (-1);
(void) rctllist(ctl_names, sz);
for (curr_name = ctl_names;
curr_name < ctl_names + sz;
curr_name += strlen(curr_name) + 1) {
ret = callback(curr_name, init_data);
if (ret != 0) {
free(ctl_names);
return (ret);
}
}
free(ctl_names);
return (ret);
}
uint_t
rctlblk_get_global_action(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_global_flagaction & (~RCTL_GLOBAL_ACTION_MASK));
}
uint_t
rctlblk_get_local_action(rctlblk_t *rblk, int *signal)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
if (signal != NULL)
*signal = ropaque->rcq_local_signal;
return (ropaque->rcq_local_flagaction & (~RCTL_LOCAL_ACTION_MASK));
}
uint_t
rctlblk_get_global_flags(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_global_flagaction & RCTL_GLOBAL_ACTION_MASK);
}
uint_t
rctlblk_get_local_flags(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_local_flagaction & RCTL_LOCAL_ACTION_MASK);
}
hrtime_t
rctlblk_get_firing_time(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_firing_time);
}
id_t
rctlblk_get_recipient_pid(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_local_recipient_pid);
}
rctl_priv_t
rctlblk_get_privilege(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_privilege);
}
rctl_qty_t
rctlblk_get_value(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_value);
}
rctl_qty_t
rctlblk_get_enforced_value(rctlblk_t *rblk)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
return (ropaque->rcq_enforced_value);
}
void
rctlblk_set_local_action(rctlblk_t *rblk, uint_t action, int signal)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
ropaque->rcq_local_signal = signal;
ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction &
RCTL_LOCAL_ACTION_MASK) | (action & ~RCTL_LOCAL_ACTION_MASK);
}
void
rctlblk_set_local_flags(rctlblk_t *rblk, uint_t flags)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
ropaque->rcq_local_flagaction = (ropaque->rcq_local_flagaction &
~RCTL_LOCAL_ACTION_MASK) | (flags & RCTL_LOCAL_ACTION_MASK);
}
void
rctlblk_set_recipient_pid(rctlblk_t *rblk, id_t pid)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
ropaque->rcq_local_recipient_pid = pid;
}
void
rctlblk_set_privilege(rctlblk_t *rblk, rctl_priv_t privilege)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
ropaque->rcq_privilege = privilege;
}
void
rctlblk_set_value(rctlblk_t *rblk, rctl_qty_t value)
{
rctl_opaque_t *ropaque = (rctl_opaque_t *)rblk;
ropaque->rcq_value = value;
}
size_t
rctlblk_size(void)
{
return (sizeof (rctl_opaque_t));
}