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

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: cap_flag.c,v 1.2 1999/09/07 23:14:19 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 flipping of capabilities on internal
  9.  * capability sets as specified by POSIX.1e (formerlly, POSIX 6).
  10.  */
  11. #include "libcap.h"
  12. /*
  13.  * Return the state of a specified capability flag.  The state is
  14.  * returned as the contents of *raised.  The capability is from one of
  15.  * the sets stored in cap_d as specified by set and value
  16.  */
  17. int cap_get_flag(cap_t cap_d, cap_value_t value, cap_flag_t set,
  18.  cap_flag_value_t *raised)
  19. {
  20.     /*
  21.      * Do we have a set and a place to store its value?
  22.      * Is it a known capability?
  23.      */
  24.     if (raised && good_cap_t(cap_d) && value >= 0 && value < __CAP_BITS
  25. && set >= 0 && set < NUMBER_OF_CAP_SETS) {
  26. __cap_s *cap_p = (__cap_s *) (set*CAP_SET_SIZE
  27.       + (__u8 *) &cap_d->set);
  28. *raised = isset_cap(cap_p,value) ? CAP_SET:CAP_CLEAR;
  29. return 0;
  30.     } else {
  31. _cap_debug("invalid arguments");
  32. errno = EINVAL;
  33. return -1;
  34.     }
  35. }
  36. /*
  37.  * raise/lower a selection of capabilities
  38.  */
  39. int cap_set_flag(cap_t cap_d, cap_flag_t set,
  40.  int no_values, cap_value_t *array_values,
  41.  cap_flag_value_t raise)
  42. {
  43.     /*
  44.      * Do we have a set and a place to store its value?
  45.      * Is it a known capability?
  46.      */
  47.     if (good_cap_t(cap_d) && no_values > 0 && no_values <= __CAP_BITS
  48. && (set >= 0) && (set < NUMBER_OF_CAP_SETS)
  49. && (raise == CAP_SET || raise == CAP_CLEAR) ) {
  50. int i;
  51. for (i=0; i<no_values; ++i) {
  52.     if (array_values[i] < 0 || array_values[i] >= __CAP_BITS) {
  53. _cap_debug("weird capability (%d) - skipped", array_values[i]);
  54.     } else {
  55. int value = array_values[i];
  56. __cap_s *cap_p = (__cap_s *) (set*CAP_SET_SIZE
  57.       + (__u8 *) &cap_d->set);
  58. if (raise == CAP_SET) {
  59.     cap_p->raise_cap(value);
  60. } else {
  61.     cap_p->lower_cap(value);
  62. }
  63.     }
  64. }
  65. return 0;
  66.     } else {
  67. _cap_debug("invalid arguments");
  68. errno = EINVAL;
  69. return -1;
  70.     }
  71. }
  72. /*
  73.  *  Reset the capability to be empty (nothing raised)
  74.  */
  75. int cap_clear(cap_t cap_d)
  76. {
  77.     if (good_cap_t(cap_d)) {
  78. memset(&(cap_d->set), 0, sizeof(cap_d->set));
  79. return 0;
  80.     } else {
  81. _cap_debug("invalid pointer");
  82. errno = EINVAL;
  83. return -1;
  84.     }
  85. }
  86. /*
  87.  * $Log: cap_flag.c,v $
  88.  * Revision 1.2  1999/09/07 23:14:19  macgyver
  89.  * Updated capabilities library and model.
  90.  *
  91.  * Revision 1.1.1.1  1999/04/17 22:16:31  morgan
  92.  * release 1.0 of libcap
  93.  *
  94.  * Revision 1.4  1998/09/20 23:07:59  morgan
  95.  * fixed lower bound check on 'set'.
  96.  *
  97.  * Revision 1.3  1998/05/24 22:54:09  morgan
  98.  * updated for 2.1.104
  99.  *
  100.  * Revision 1.2  1997/04/28 00:57:11  morgan
  101.  * fixes and zefram's patches
  102.  *
  103.  * Revision 1.1  1997/04/21 04:32:52  morgan
  104.  * Initial revision
  105.  *
  106.  */