cap_extint.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: cap_extint.c,v 1.3 1999/09/17 03:54:08 macgyver Exp $
  3.  *
  4.  * Copyright (c) 1997-8 Andrew G Morgan <morgan@linux.kernel.org>
  5.  *
  6.  * See end of file for Log.
  7.  *
  8.  * This file deals with exchanging internal and external
  9.  * representations of capability sets.
  10.  */
  11. #include "libcap.h"
  12. /*
  13.  * External representation for capabilities. (exported as a fixed
  14.  * length (void *))
  15.  */
  16. #define CAP_EXT_MAGIC "22030201121"
  17. #define CAP_EXT_MAGIC_SIZE 4
  18. const static __u8 external_magic[CAP_EXT_MAGIC_SIZE+1] = CAP_EXT_MAGIC;
  19. struct cap_ext_struct {
  20.     __u8 magic[CAP_EXT_MAGIC_SIZE];
  21.     __u8 length_of_capset;
  22. /* note, we arrange these so the caps are stacked with byte-size
  23.    resolution */
  24.     __u8 bytes[CAP_SET_SIZE][NUMBER_OF_CAP_SETS];
  25. };
  26. /*
  27.  * return size of external capability set
  28.  */
  29. ssize_t cap_size(cap_t caps)
  30. {
  31.     return sizeof(struct cap_ext_struct);
  32. }
  33. /*
  34.  * Copy the internal (cap_d) capability set into an external
  35.  * representation.  The external representation is portable to other
  36.  * Linux architectures.
  37.  */
  38. ssize_t cap_copy_ext(void *cap_ext, cap_t cap_d, ssize_t length)
  39. {
  40.     struct cap_ext_struct *result = (struct cap_ext_struct *) cap_ext;
  41.     __u32 *from = (__u32 *) &(cap_d->set);
  42.     int i;
  43.     /* valid arguments? */
  44.     if (!good_cap_t(cap_d) || length < sizeof(struct cap_ext_struct)
  45. || cap_ext == NULL) {
  46. errno = EINVAL;
  47. return -1;
  48.     }
  49.     /* fill external capability set */
  50.     memcpy(&result->magic, external_magic, CAP_EXT_MAGIC_SIZE);
  51.     result->length_of_capset = CAP_SET_SIZE;
  52.     for (i=0; i<NUMBER_OF_CAP_SETS; ++i) {
  53. int j;
  54. for (j=0; j<CAP_SET_SIZE; ) {
  55.     __u32 val = *from++;
  56.     result->bytes[j++][i] =  val        & 0xFF;
  57.     result->bytes[j++][i] = (val >>= 8) & 0xFF;
  58.     result->bytes[j++][i] = (val >>= 8) & 0xFF;
  59.     result->bytes[j++][i] = (val >> 8)  & 0xFF;
  60. }
  61.     }
  62.     /* All done: return length of external representation */
  63.     return (sizeof(struct cap_ext_struct));
  64. }
  65. /*
  66.  * Import an external representation to produce an internal rep.
  67.  * the internal rep should be liberated with cap_free().
  68.  */
  69. /*
  70.  * XXX - need to take a little more care when importing small
  71.  * capability sets.
  72.  */
  73. cap_t cap_copy_int(const void *cap_ext)
  74. {
  75.     const struct cap_ext_struct *export =
  76. (const struct cap_ext_struct *) cap_ext;
  77.     cap_t cap_d = NULL;
  78.     int set, blen;
  79.     __u32 * to = (__u32 *) &cap_d->set;
  80.     /* Does the external representation make sense? */
  81.     if (export == NULL || !memcmp(export->magic, external_magic
  82.   , CAP_EXT_MAGIC_SIZE)) {
  83. errno = EINVAL;
  84. return NULL;
  85.     }
  86.     /* Obtain a new internal capability set */
  87.     if (!(cap_d = cap_init()))
  88.        return NULL;
  89.     blen = export->length_of_capset;
  90.     for (set=0; set<=NUMBER_OF_CAP_SETS; ++set) {
  91. int blk;
  92. int bno = 0;
  93. for (blk=0; blk<(CAP_SET_SIZE/4); ++blk) {
  94.     __u32 val = 0;
  95.     if (bno != blen)
  96. val  = export->bytes[bno++][set];
  97.     if (bno != blen)
  98. val |= export->bytes[bno++][set] << 8;
  99.     if (bno != blen)
  100. val |= export->bytes[bno++][set] << 16;
  101.     if (bno != blen)
  102. val |= export->bytes[bno++][set] << 24;
  103.     *to++ = val;
  104. }
  105.     }
  106.     /* all done */
  107.     return cap_d;
  108. }
  109. /*
  110.  * $Log: cap_extint.c,v $
  111.  * Revision 1.3  1999/09/17 03:54:08  macgyver
  112.  * Corrected gcc warning.
  113.  *
  114.  * Revision 1.2  1999/09/07 23:14:19  macgyver
  115.  * Updated capabilities library and model.
  116.  *
  117.  * Revision 1.1.1.1  1999/04/17 22:16:31  morgan
  118.  * release 1.0 of libcap
  119.  *
  120.  * Revision 1.3  1998/05/24 22:54:09  morgan
  121.  * updated for 2.1.104
  122.  *
  123.  * Revision 1.2  1997/04/28 00:57:11  morgan
  124.  * fixes and zefram's patches
  125.  *
  126.  * Revision 1.1  1997/04/21 04:32:52  morgan
  127.  * Initial revision
  128.  *
  129.  */