diff options
Diffstat (limited to 'depends/libcap/libcap/execable.c')
-rw-r--r-- | depends/libcap/libcap/execable.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/depends/libcap/libcap/execable.c b/depends/libcap/libcap/execable.c new file mode 100644 index 0000000..9f7062e --- /dev/null +++ b/depends/libcap/libcap/execable.c @@ -0,0 +1,64 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/capability.h> + +#include "execable.h" + +static void usage(int status) +{ + printf("\nusage: libcap.so [--help|--usage|--summary]\n"); + exit(status); +} + +static void summary(void) +{ + cap_value_t bits = cap_max_bits(), c; + cap_mode_t mode = cap_get_mode(); + + printf("\nCurrent mode: %s\n", cap_mode_name(mode)); + printf("Number of cap values known to: this libcap=%d, running kernel=%d\n", + CAP_LAST_CAP+1, bits); + + if (bits > CAP_LAST_CAP+1) { + printf("=> Consider upgrading libcap to name:"); + for (c = CAP_LAST_CAP+1; c < bits; c++) { + printf(" %d", c); + } + } else if (bits < CAP_LAST_CAP+1) { + printf("=> Newer kernels also provide support for:"); + for (c = bits; c <= CAP_LAST_CAP; c++) { + char *name = cap_to_name(c); + printf(" %s", name); + cap_free(name); + } + } else { + return; + } + printf("\n"); +} + +SO_MAIN(int argc, char **argv) +{ + int i; + const char *cmd = "This library"; + + if (argv != NULL && argv[0] != NULL) { + cmd = argv[0]; + } + printf("%s is the shared library version: " LIBRARY_VERSION ".\n" + "See the License file for distribution information.\n" + "More information on this library is available from:\n" + "\n" + " https://sites.google.com/site/fullycapable/\n", cmd); + + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--usage") || !strcmp(argv[i], "--help")) { + usage(0); + } + if (!strcmp(argv[i], "--summary")) { + summary(); + continue; + } + usage(1); + } +} |