diff options
Diffstat (limited to 'libcap/RCS/cap_extint.c,v')
-rw-r--r-- | libcap/RCS/cap_extint.c,v | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/libcap/RCS/cap_extint.c,v b/libcap/RCS/cap_extint.c,v deleted file mode 100644 index 3f07499..0000000 --- a/libcap/RCS/cap_extint.c,v +++ /dev/null @@ -1,260 +0,0 @@ -head 1.3; -access; -symbols; -locks; strict; -comment @ * @; - - -1.3 -date 98.05.24.22.54.09; author morgan; state Exp; -branches; -next 1.2; - -1.2 -date 97.04.28.00.57.11; author morgan; state Exp; -branches; -next 1.1; - -1.1 -date 97.04.21.04.32.52; author morgan; state Exp; -branches; -next ; - - -desc -@first take -@ - - -1.3 -log -@updated for 2.1.104 -@ -text -@/* - * $Id: cap_extint.c,v 1.2 1997/04/28 00:57:11 morgan Exp morgan $ - * - * Copyright (c) 1997-8 Andrew G Morgan <morgan@@linux.kernel.org> - * - * See end of file for Log. - * - * This file deals with exchanging internal and external - * representations of capability sets. - */ - -#include "libcap.h" - -/* - * External representation for capabilities. (exported as a fixed - * length (void *)) - */ -#define CAP_EXT_MAGIC "\220\302\001\121" -#define CAP_EXT_MAGIC_SIZE 4 -const static __u8 external_magic[CAP_EXT_MAGIC_SIZE+1] = CAP_EXT_MAGIC; - -struct cap_ext_struct { - __u8 magic[CAP_EXT_MAGIC_SIZE]; - __u8 length_of_capset; -/* note, we arrange these so the caps are stacked with byte-size - resolution */ - __u8 bytes[CAP_SET_SIZE][NUMBER_OF_CAP_SETS]; -}; - -/* - * return size of external capability set - */ - -ssize_t cap_size(cap_t caps) -{ - return sizeof(struct cap_ext_struct); -} - -/* - * Copy the internal (cap_d) capability set into an external - * representation. The external representation is portable to other - * Linux architectures. - */ - -ssize_t cap_copy_ext(void *cap_ext, cap_t cap_d, ssize_t length) -{ - struct cap_ext_struct *result = (struct cap_ext_struct *) cap_ext; - __u32 *from = (__u32 *) &(cap_d->set); - int i; - - /* valid arguments? */ - if (!good_cap_t(cap_d) || length < sizeof(struct cap_ext_struct) - || cap_ext == NULL) { - errno = EINVAL; - return -1; - } - - /* fill external capability set */ - memcpy(&result->magic, external_magic, CAP_EXT_MAGIC_SIZE); - result->length_of_capset = CAP_SET_SIZE; - - for (i=0; i<NUMBER_OF_CAP_SETS; ++i) { - int j; - for (j=0; j<CAP_SET_SIZE; ) { - __u32 val = *from++; - - result->bytes[j++][i] = val & 0xFF; - result->bytes[j++][i] = (val >>= 8) & 0xFF; - result->bytes[j++][i] = (val >>= 8) & 0xFF; - result->bytes[j++][i] = (val >> 8) & 0xFF; - } - } - - /* All done: return length of external representation */ - return (sizeof(struct cap_ext_struct)); -} - -/* - * Import an external representation to produce an internal rep. - * the internal rep should be liberated with cap_free(). - */ - -/* - * XXX - need to take a little more care when importing small - * capability sets. - */ - -cap_t cap_copy_int(const void *cap_ext) -{ - const struct cap_ext_struct *export = - (const struct cap_ext_struct *) cap_ext; - cap_t cap_d; - int set, blen; - __u32 * to = (__u32 *) &cap_d->set; - - /* Does the external representation make sense? */ - if (export == NULL || !memcmp(export->magic, external_magic - , CAP_EXT_MAGIC_SIZE)) { - errno = EINVAL; - return NULL; - } - - /* Obtain a new internal capability set */ - if (!(cap_d = cap_init())) - return NULL; - - blen = export->length_of_capset; - for (set=0; set<=NUMBER_OF_CAP_SETS; ++set) { - int blk; - int bno = 0; - for (blk=0; blk<(CAP_SET_SIZE/4); ++blk) { - __u32 val = 0; - - if (bno != blen) - val = export->bytes[bno++][set]; - if (bno != blen) - val |= export->bytes[bno++][set] << 8; - if (bno != blen) - val |= export->bytes[bno++][set] << 16; - if (bno != blen) - val |= export->bytes[bno++][set] << 24; - - *to++ = val; - } - } - - /* all done */ - return cap_d; -} - -/* - * $Log: cap_extint.c,v $ - * 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 - * - */ -@ - - -1.2 -log -@fixes and zefram's patches -@ -text -@d2 1 -a2 1 - * $Id: cap_extint.c,v 1.1 1997/04/21 04:32:52 morgan Exp morgan $ -d4 1 -a4 1 - * Copyright (c) 1997 Andrew G Morgan <morgan@@parc.power.net> -d20 1 -a20 1 -static __u8 external_magic[CAP_EXT_MAGIC_SIZE+1] = CAP_EXT_MAGIC; -d25 3 -a27 1 - __u8 bytes[sizeof(struct __cap_s)][3]; -d48 1 -d59 2 -a60 2 - memcpy(&result->magic,external_magic,CAP_EXT_MAGIC_SIZE); - result->length_of_capset = sizeof(struct __cap_s); -d62 1 -a62 1 - for (i=CAP_EFFECTIVE; i<=CAP_PERMITTED; ++i) { -d64 7 -a70 9 - for (j=0; j<__CAP_BLKS; ++j) { - __u32 val; - int k = j << 2; - - val = cap_d->set[i]._blk[j]; - result->bytes[k++][i] = val & 0xFF; - result->bytes[k++][i] = (val >>= 8) & 0xFF; - result->bytes[k++][i] = (val >>= 8) & 0xFF; - result->bytes[k][i] = (val >> 8) & 0xFF; -d94 1 -d108 1 -a108 1 - for (set=CAP_EFFECTIVE; set<=CAP_PERMITTED; ++set) { -d111 1 -a111 1 - for (blk=0; blk<__CAP_BLKS; ++blk) { -d123 1 -a123 1 - cap_d->set[set]._blk[blk] = val; -d133 3 -@ - - -1.1 -log -@Initial revision -@ -text -@d2 1 -a2 1 - * $Id$ -d18 3 -d23 1 -d29 9 -d56 1 -d92 1 -d95 2 -a96 1 - if (export == NULL || export->length_of_capset > sizeof(struct __cap_s)) { -d102 20 -a121 13 - if ((cap_d = cap_init())) { - int i; - for (i=CAP_EFFECTIVE; i<=CAP_PERMITTED; ++i) { - int j; - for (j=0; j<__CAP_BLKS; ++j) { - __u32 val; - int k = (j+1) << 2; - - val = export->bytes[--k][i] << 8; - val |= export->bytes[--k][i]; val <<= 8; - val |= export->bytes[--k][i]; val <<= 8; - cap_d->set[i]._blk[j] = val | export->bytes[--k][i]; - } -d130 4 -a133 1 - * $Log$ -@ |