bcaps-v13.c (2473B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2004 Enrico Scholz <ensc@delenn.intern.sigma-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include "vserver.h" 24 #include "internal.h" 25 #include <lib_internal/util-dimof.h> 26 #include <linux/capability.h> 27 28 #include <string.h> 29 #include <strings.h> 30 #include <assert.h> 31 32 #define DECL(VAL) { #VAL, sizeof(#VAL)-1, 1ULL << (VC_CAP_ ## VAL) } 33 34 static struct Mapping_uint64 const VALUES[] = { 35 DECL(CHOWN), 36 DECL(DAC_OVERRIDE), 37 DECL(DAC_READ_SEARCH), 38 DECL(FOWNER), 39 DECL(FSETID), 40 DECL(KILL), 41 DECL(SETGID), 42 DECL(SETUID), 43 DECL(SETPCAP), 44 DECL(LINUX_IMMUTABLE), 45 DECL(NET_BIND_SERVICE), 46 DECL(NET_BROADCAST), 47 DECL(NET_ADMIN), 48 DECL(NET_RAW), 49 DECL(IPC_LOCK), 50 DECL(IPC_OWNER), 51 DECL(SYS_MODULE), 52 DECL(SYS_RAWIO), 53 DECL(SYS_CHROOT), 54 DECL(SYS_PTRACE), 55 DECL(SYS_PACCT), 56 DECL(SYS_ADMIN), 57 DECL(SYS_BOOT), 58 DECL(SYS_NICE), 59 DECL(SYS_RESOURCE), 60 DECL(SYS_TIME), 61 DECL(SYS_TTY_CONFIG), 62 DECL(MKNOD), 63 DECL(LEASE), 64 DECL(AUDIT_WRITE), 65 DECL(AUDIT_CONTROL), 66 DECL(SETFCAP), 67 DECL(MAC_OVERRIDE), 68 DECL(MAC_ADMIN), 69 }; 70 71 inline static char const * 72 removePrefix(char const *str, size_t *len) 73 { 74 if ((len==0 || *len==0 || *len>4) && 75 strncasecmp("cap_", str, 4)==0) { 76 if (len && *len>4) *len -= 4; 77 return str+4; 78 } 79 else 80 return str; 81 } 82 83 uint_least64_t 84 vc_text2bcap(char const *str, size_t len) 85 { 86 char const * tmp = removePrefix(str, &len); 87 ssize_t idx = utilvserver_value2text_uint64(tmp, len, 88 VALUES, DIM_OF(VALUES)); 89 if (idx==-1) return 0; 90 else return VALUES[idx].val; 91 } 92 93 char const * 94 vc_lobcap2text(uint_least64_t *val) 95 { 96 ssize_t idx = utilvserver_text2value_uint64(val, 97 VALUES, DIM_OF(VALUES)); 98 99 if (idx==-1) return 0; 100 else return VALUES[idx].id; 101 }