aboutsummaryrefslogtreecommitdiff
path: root/libcap/cap_flag.c
diff options
context:
space:
mode:
authorAndrew Morgan <morgan@kernel.org>2007-07-10 20:50:21 -0700
committerAndrew Morgan <morgan@kernel.org>2007-07-10 20:50:21 -0700
commit2c9c0532daccfd300f0eb1401b15348ed19d0ce7 (patch)
tree0e850e1a45be8cb8452a5157bd4b6538eafdbebe /libcap/cap_flag.c
downloadlibcap-2c9c0532daccfd300f0eb1401b15348ed19d0ce7.tar.gz
This is the source for libcap-1.0.tar.gz
http://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/libcap-1.0.tar.gz
Diffstat (limited to 'libcap/cap_flag.c')
-rw-r--r--libcap/cap_flag.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/libcap/cap_flag.c b/libcap/cap_flag.c
new file mode 100644
index 0000000..7d8f967
--- /dev/null
+++ b/libcap/cap_flag.c
@@ -0,0 +1,122 @@
+/*
+ * $Id: cap_flag.c,v 1.4 1998/09/20 23:07:59 morgan Exp $
+ *
+ * Copyright (c) 1997-8 Andrew G. Morgan <morgan@linux.kernel.org>
+ *
+ * See end of file for Log.
+ *
+ * This file deals with flipping of capabilities on internal
+ * capability sets as specified by POSIX.1e (formerlly, POSIX 6).
+ */
+
+#include "libcap.h"
+
+/*
+ * Return the state of a specified capability flag. The state is
+ * returned as the contents of *raised. The capability is from one of
+ * the sets stored in cap_d as specified by set and value
+ */
+
+int cap_get_flag(cap_t cap_d, cap_value_t value, cap_flag_t set,
+ cap_flag_value_t *raised)
+{
+ /*
+ * Do we have a set and a place to store its value?
+ * Is it a known capability?
+ */
+
+ if (raised && good_cap_t(cap_d) && value >= 0 && value < __CAP_BITS
+ && set >= 0 && set < NUMBER_OF_CAP_SETS) {
+ __cap_s *cap_p = (__cap_s *) (set*CAP_SET_SIZE
+ + (__u8 *) &cap_d->set);
+
+ *raised = isset_cap(cap_p,value) ? CAP_SET:CAP_CLEAR;
+ return 0;
+
+ } else {
+
+ _cap_debug("invalid arguments");
+ errno = EINVAL;
+ return -1;
+
+ }
+}
+
+/*
+ * raise/lower a selection of capabilities
+ */
+
+int cap_set_flag(cap_t cap_d, cap_flag_t set,
+ int no_values, cap_value_t *array_values,
+ cap_flag_value_t raise)
+{
+ /*
+ * Do we have a set and a place to store its value?
+ * Is it a known capability?
+ */
+
+ if (good_cap_t(cap_d) && no_values > 0 && no_values <= __CAP_BITS
+ && (set >= 0) && (set < NUMBER_OF_CAP_SETS)
+ && (raise == CAP_SET || raise == CAP_CLEAR) ) {
+ int i;
+ for (i=0; i<no_values; ++i) {
+ if (array_values[i] < 0 || array_values[i] >= __CAP_BITS) {
+ _cap_debug("weird capability (%d) - skipped", array_values[i]);
+ } else {
+ int value = array_values[i];
+ __cap_s *cap_p = (__cap_s *) (set*CAP_SET_SIZE
+ + (__u8 *) &cap_d->set);
+
+ if (raise == CAP_SET) {
+ cap_p->raise_cap(value);
+ } else {
+ cap_p->lower_cap(value);
+ }
+ }
+ }
+ return 0;
+
+ } else {
+
+ _cap_debug("invalid arguments");
+ errno = EINVAL;
+ return -1;
+
+ }
+}
+
+/*
+ * Reset the capability to be empty (nothing raised)
+ */
+
+int cap_clear(cap_t cap_d)
+{
+ if (good_cap_t(cap_d)) {
+
+ memset(&(cap_d->set), 0, sizeof(cap_d->set));
+ return 0;
+
+ } else {
+
+ _cap_debug("invalid pointer");
+ errno = EINVAL;
+ return -1;
+
+ }
+}
+
+/*
+ * $Log: cap_flag.c,v $
+ * Revision 1.4 1998/09/20 23:07:59 morgan
+ * fixed lower bound check on 'set'.
+ *
+ * Revision 1.3 1998/05/24 22:54:09 morgan
+ * updated for 2.1.104
+ *
+ * Revision 1.2 1997/04/28 00:57:11 morgan
+ * fixes and zefram's patches
+ *
+ * Revision 1.1 1997/04/21 04:32:52 morgan
+ * Initial revision
+ *
+ */