aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew G. Morgan <morgan@kernel.org>2008-10-23 21:37:44 -0700
committerAndrew G. Morgan <morgan@kernel.org>2008-10-23 21:37:44 -0700
commit9f2e7c5245fc3100ed08d8a133f80afd88e81632 (patch)
tree9466d7646c4cdad19ddb29ac154dca651fd8e699
parent0a42b493f24035415047ff79ad46e5c27e2ee11e (diff)
downloadlibcap-9f2e7c5245fc3100ed08d8a133f80afd88e81632.tar.gz
A handy --decode=0xYYYYY flag for capsh.
You can use this to manually decode entries in /proc/<PID>/status. Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
-rw-r--r--progs/capsh.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/progs/capsh.c b/progs/capsh.c
index 6786995..21f8e07 100644
--- a/progs/capsh.c
+++ b/progs/capsh.c
@@ -311,6 +311,30 @@ int main(int argc, char *argv[], char *envp[])
value, strerror(errno));
exit(1);
}
+ } else if (!memcmp("--decode=", argv[i], 9)) {
+ unsigned long long value;
+ unsigned cap;
+ const char *sep = "";
+
+ /* Note, if capabilities become longer than 64-bits we'll need
+ to fixup the following code.. */
+ value = strtoull(argv[i]+9, NULL, 16);
+ printf("0x%016llx=", value);
+
+ for (cap=0; value >> cap; ++cap) {
+ if (value & (1ULL << cap)) {
+ const char *ptr;
+
+ ptr = cap_to_name(cap);
+ if (ptr != NULL) {
+ printf("%s%s", sep, ptr);
+ } else {
+ printf("%s%u", sep, cap);
+ }
+ sep = ",";
+ }
+ }
+ printf("\n");
} else if (!strcmp("--print", argv[i])) {
unsigned cap;
int set;
@@ -375,6 +399,7 @@ int main(int argc, char *argv[], char *envp[])
printf("usage: %s [args ...]\n"
" --help this message\n"
" --print display capability relevant state\n"
+ " --decode=xxx decode a hex string to a list of caps\n"
" --drop=xxx remove xxx,.. capabilities from bset\n"
" --caps=xxx set caps as per cap_from_text()\n"
" --inh=xxx set xxx,.. inheritiable set\n"