blob: da2ab052da9fb58a49f784b711367bdf9d080041 [file] [log] [blame] [raw]
#include "common.h"
#include <bash/builtins.h>
#include <bash/shell.h>
#include <bash/bashgetopt.h>
#include <stdio.h>
static int privilege_builtin(WORD_LIST *list) {
if(!list) {
fputs("Usage:\n privilege list [-a | <priv> ...]\n privilege set [-a|-n] [[!]<priv> ...]\n", stderr);
return EXECUTION_FAILURE;
}
if(strcmp(list->word->word, "list") == 0) {
int should_list_all = 0;
while(1) {
int c = internal_getopt(list->next, "a");
if(c == -1) break;
if(c == 'a') should_list_all = 1;
else return EXECUTION_FAILURE;
}
list = loptend;
if(list || should_list_all) {
char **names, *grants, **descriptions;
unsigned int count, i;
if(get_all_privileges(&names, &grants, &descriptions, &count) < 0) {
return EXECUTION_FAILURE;
}
puts(should_list_all ? "All privileges:" : "Privileges:");
for(i = 0; i < count; i++) {
printf("%c%-20s %s\n", grants[i] ? '*' : ' ',
names[i], descriptions[i]);
free(names[i]);
free(descriptions[i]);
}
free(names);
free(grants);
free(descriptions);
} else {
char **names, **descriptions;
unsigned int count, i;
if(get_privileges(&names, &descriptions, &count) < 0) {
return EXECUTION_FAILURE;
}
puts("Process privileges:");
for(i = 0; i < count; i++) {
printf(" %-20s %s\n", names[i], descriptions[i]);
free(names[i]);
free(descriptions[i]);
}
free(names);
free(descriptions);
}
} else if(strcmp(list->word->word, "set") == 0) {
fputs("Not implemented\n", stderr);
return EXECUTION_FAILURE;
} else {
fputs("Invalid subcommand\n", stderr);
return EXECUTION_FAILURE;
}
return EXECUTION_SUCCESS;
}
static char *privilege_doc[] = {
"Query or modify privileges of the shell process",
NULL
};
struct builtin privilege_struct = {
.name = "privilege",
.function = privilege_builtin,
.flags = BUILTIN_ENABLED,
.long_doc = privilege_doc,
.short_doc = "Usage: privilege { list | set }"
};