diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-05 02:09:04 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-05 02:09:04 +0400 |
commit | 415ee7d6e47dcb3e0906a7bebc6d52ab8ed899da (patch) | |
tree | f7773ad82023c8616b339d84faa4bb7643af0311 /sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c | |
parent | 3cc0cd4c5b3bed6f7d9aff26322d505785e11aa9 (diff) | |
download | glibc-415ee7d6e47dcb3e0906a7bebc6d52ab8ed899da.tar.gz |
Merged changes from kopensolaris-gnu project
http://git.csclub.uwaterloo.ca/?p=kopensolaris-gnu/glibc.git
Commits from 9157319 to bad8ac8.
This is only partial patch, some changes to not apply
and will be resovled and committed next.
Diffstat (limited to 'sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c')
-rw-r--r-- | sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c new file mode 100644 index 0000000000..3b81a0a901 --- /dev/null +++ b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/rctl.c @@ -0,0 +1,198 @@ +/* Copyright (C) 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <inline-syscall.h> +#include <rctl.h> +#include <sys/rctl_impl.h> + +/* Docs: http://docs.sun.com/app/docs/doc/816-5167/getrctl-2?a=view + http://docs.sun.com/app/docs/doc/816-5168/rctlblk-size-3c?a=view */ + +DECLARE_INLINE_SYSCALL (long, rctlsys, int code, const char *name, void *obuf, + void *nbuf, size_t obufsz, int flags); + + +int getrctl (const char *name, rctlblk_t *old_rblk, rctlblk_t *new_rblk, + unsigned int flags) +{ + return (int)INLINE_SYSCALL (rctlsys, 6, SYS_SUB_rctlsys_get, name, old_rblk, + new_rblk, 0, flags); +} + + +int setrctl (const char *name, rctlblk_t *old_rblk, rctlblk_t *new_rblk, + unsigned int flags) +{ + return (int)INLINE_SYSCALL (rctlsys, 6, SYS_SUB_rctlsys_set, name, old_rblk, + new_rblk, 0, flags); +} + + +size_t rctllist (char *buf, size_t bufsz) +{ + return (size_t)INLINE_SYSCALL (rctlsys, 6, SYS_SUB_rctlsys_list, NULL, buf, + NULL, bufsz, 0); +} + + +int rctlctl (const char *name, rctlblk_t *blk, int flags) +{ + return (int)INLINE_SYSCALL (rctlsys, 6, SYS_SUB_rctlsys_ctl, name, blk, + NULL, 0, flags); +} + + +int setprojrctl (const char *name, rctlblk_t *blk, size_t size, int flags) +{ + return (int)INLINE_SYSCALL (rctlsys, 6, SYS_SUB_rctlsys_projset, name, + NULL, blk, size, flags); +} + + +hrtime_t rctlblk_get_firing_time (rctlblk_t *rblk) +{ + return ((rctl_opaque_t *)rblk)->rcq_firing_time; +} + + +unsigned int rctlblk_get_global_action (rctlblk_t *rblk) +{ + /* Note: rcq_global_flagaction contains both flags and action. */ + return ((rctl_opaque_t *)rblk)->rcq_global_flagaction & + ~RCTL_GLOBAL_ACTION_MASK; +} + + +unsigned int rctlblk_get_global_flags (rctlblk_t *rblk) +{ + /* Note: rcq_global_flagaction contains both flags and action. */ + return ((rctl_opaque_t *)rblk)->rcq_global_flagaction & + RCTL_GLOBAL_ACTION_MASK; +} + + +unsigned int rctlblk_get_local_action (rctlblk_t *rblk, int *signalp) +{ + /* Note: rcq_local_flagaction contains both flags and action. */ + return ((rctl_opaque_t *)rblk)->rcq_local_flagaction & + ~RCTL_LOCAL_ACTION_MASK; +} + + +unsigned int rctlblk_get_local_flags (rctlblk_t *rblk) +{ + /* Note: rcq_local_flagaction contains both flags and action. */ + return ((rctl_opaque_t *)rblk)->rcq_local_flagaction & + RCTL_LOCAL_ACTION_MASK; +} + + +rctl_priv_t rctlblk_get_privilege (rctlblk_t *rblk) +{ + return ((rctl_opaque_t *)rblk)->rcq_privilege; +} + + +id_t rctlblk_get_recipient_pid (rctlblk_t *rblk) +{ + return ((rctl_opaque_t *)rblk)->rcq_local_recipient_pid; +} + + +rctl_qty_t rctlblk_get_value (rctlblk_t *rblk) +{ + return ((rctl_opaque_t *)rblk)->rcq_value; +} + + +rctl_qty_t rctlblk_get_enforced_value (rctlblk_t *rblk) +{ + return ((rctl_opaque_t *)rblk)->rcq_enforced_value; +} + + +void rctlblk_set_local_action (rctlblk_t *rblk, unsigned int action, + int signal) +{ + /* Note: rcq_local_flagaction contains both flags and action. */ + rctl_opaque_t *_rblk = (rctl_opaque_t *)rblk; + _rblk->rcq_local_signal = signal; + _rblk->rcq_local_flagaction = (_rblk->rcq_local_flagaction & + RCTL_LOCAL_ACTION_MASK) | action; +} + + +void rctlblk_set_local_flags (rctlblk_t *rblk, unsigned int flags) +{ + /* Note: rcq_local_flagaction contains both flags and action. */ + rctl_opaque_t *_rblk = (rctl_opaque_t *)rblk; + _rblk->rcq_local_flagaction = (_rblk->rcq_local_flagaction & + ~RCTL_LOCAL_ACTION_MASK) | flags; +} + + +void rctlblk_set_privilege (rctlblk_t *rblk, rctl_priv_t privilege) +{ + ((rctl_opaque_t *)rblk)->rcq_privilege = privilege; +} + + +void rctlblk_set_value (rctlblk_t *rblk, rctl_qty_t value) +{ + ((rctl_opaque_t *)rblk)->rcq_value = value; +} + + +void rctlblk_set_recipient_pid (rctlblk_t *rblk, id_t pid) +{ + ((rctl_opaque_t *)rblk)->rcq_local_recipient_pid = pid; +} + + +size_t rctlblk_size (void) +{ + return sizeof (rctl_opaque_t); +} + + +int rctl_walk (int (*callback)(const char *rctlname, void *walk_data), + void *init_data) +{ + size_t len = rctllist (NULL, 0); + if (len < 0) + return -1; + char *names = malloc (len); + if (!names) + return -1; + if (rctllist (names, len) != 0) + { + free (names); + return -1; + } + + char *namesptr = names; + while (*namesptr) + { + callback (namesptr, init_data); + namesptr += strlen (namesptr) + 1; + } + + free (names); + return 0; +} |