Split tomoyo_write_profile() into several functions.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
Tetsuo Handa 2010-06-25 09:30:09 +09:00 коммит произвёл James Morris
Родитель f23571e866
Коммит 8e5686874b
1 изменённых файлов: 121 добавлений и 74 удалений

Просмотреть файл

@ -302,6 +302,124 @@ struct tomoyo_profile *tomoyo_profile(const u8 profile)
return ptr; return ptr;
} }
static s8 tomoyo_find_yesno(const char *string, const char *find)
{
const char *cp = strstr(string, find);
if (cp) {
cp += strlen(find);
if (!strncmp(cp, "=yes", 4))
return 1;
else if (!strncmp(cp, "=no", 3))
return 0;
}
return -1;
}
static void tomoyo_set_bool(bool *b, const char *string, const char *find)
{
switch (tomoyo_find_yesno(string, find)) {
case 1:
*b = true;
break;
case 0:
*b = false;
break;
}
}
static void tomoyo_set_uint(unsigned int *i, const char *string,
const char *find)
{
const char *cp = strstr(string, find);
if (cp)
sscanf(cp + strlen(find), "=%u", i);
}
static void tomoyo_set_pref(const char *name, const char *value,
const bool use_default,
struct tomoyo_profile *profile)
{
struct tomoyo_preference **pref;
bool *verbose;
if (!strcmp(name, "enforcing")) {
if (use_default) {
pref = &profile->enforcing;
goto set_default;
}
profile->enforcing = &profile->preference;
verbose = &profile->preference.enforcing_verbose;
goto set_verbose;
}
if (!strcmp(name, "permissive")) {
if (use_default) {
pref = &profile->permissive;
goto set_default;
}
profile->permissive = &profile->preference;
verbose = &profile->preference.permissive_verbose;
goto set_verbose;
}
if (!strcmp(name, "learning")) {
if (use_default) {
pref = &profile->learning;
goto set_default;
}
profile->learning = &profile->preference;
tomoyo_set_uint(&profile->preference.learning_max_entry, value,
"max_entry");
verbose = &profile->preference.learning_verbose;
goto set_verbose;
}
return;
set_default:
*pref = &tomoyo_default_profile.preference;
return;
set_verbose:
tomoyo_set_bool(verbose, value, "verbose");
}
static int tomoyo_set_mode(char *name, const char *value,
const bool use_default,
struct tomoyo_profile *profile)
{
u8 i;
u8 config;
if (!strcmp(name, "CONFIG")) {
i = TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX;
config = profile->default_config;
} else if (tomoyo_str_starts(&name, "CONFIG::")) {
config = 0;
for (i = 0; i < TOMOYO_MAX_MAC_INDEX
+ TOMOYO_MAX_MAC_CATEGORY_INDEX; i++) {
if (strcmp(name, tomoyo_mac_keywords[i]))
continue;
config = profile->config[i];
break;
}
if (i == TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX)
return -EINVAL;
} else {
return -EINVAL;
}
if (use_default) {
config = TOMOYO_CONFIG_USE_DEFAULT;
} else {
u8 mode;
for (mode = 0; mode < 4; mode++)
if (strstr(value, tomoyo_mode[mode]))
/*
* Update lower 3 bits in order to distinguish
* 'config' from 'TOMOYO_CONFIG_USE_DEAFULT'.
*/
config = (config & ~7) | mode;
}
if (i < TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX)
profile->config[i] = config;
else if (config != TOMOYO_CONFIG_USE_DEFAULT)
profile->default_config = config;
return 0;
}
/** /**
* tomoyo_write_profile - Write profile table. * tomoyo_write_profile - Write profile table.
* *
@ -313,9 +431,6 @@ static int tomoyo_write_profile(struct tomoyo_io_buffer *head)
{ {
char *data = head->write_buf; char *data = head->write_buf;
unsigned int i; unsigned int i;
int value;
int mode;
u8 config;
bool use_default = false; bool use_default = false;
char *cp; char *cp;
struct tomoyo_profile *profile; struct tomoyo_profile *profile;
@ -338,45 +453,8 @@ static int tomoyo_write_profile(struct tomoyo_io_buffer *head)
*cp++ = '\0'; *cp++ = '\0';
if (profile != &tomoyo_default_profile) if (profile != &tomoyo_default_profile)
use_default = strstr(cp, "use_default") != NULL; use_default = strstr(cp, "use_default") != NULL;
if (strstr(cp, "verbose=yes")) if (tomoyo_str_starts(&data, "PREFERENCE::")) {
value = 1; tomoyo_set_pref(data, cp, use_default, profile);
else if (strstr(cp, "verbose=no"))
value = 0;
else
value = -1;
if (!strcmp(data, "PREFERENCE::enforcing")) {
if (use_default) {
profile->enforcing = &tomoyo_default_profile.preference;
return 0;
}
profile->enforcing = &profile->preference;
if (value >= 0)
profile->preference.enforcing_verbose = value;
return 0;
}
if (!strcmp(data, "PREFERENCE::permissive")) {
if (use_default) {
profile->permissive = &tomoyo_default_profile.preference;
return 0;
}
profile->permissive = &profile->preference;
if (value >= 0)
profile->preference.permissive_verbose = value;
return 0;
}
if (!strcmp(data, "PREFERENCE::learning")) {
char *cp2;
if (use_default) {
profile->learning = &tomoyo_default_profile.preference;
return 0;
}
profile->learning = &profile->preference;
if (value >= 0)
profile->preference.learning_verbose = value;
cp2 = strstr(cp, "max_entry=");
if (cp2)
sscanf(cp2 + 10, "%u",
&profile->preference.learning_max_entry);
return 0; return 0;
} }
if (profile == &tomoyo_default_profile) if (profile == &tomoyo_default_profile)
@ -387,38 +465,7 @@ static int tomoyo_write_profile(struct tomoyo_io_buffer *head)
tomoyo_put_name(old_comment); tomoyo_put_name(old_comment);
return 0; return 0;
} }
if (!strcmp(data, "CONFIG")) { return tomoyo_set_mode(data, cp, use_default, profile);
i = TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX;
config = profile->default_config;
} else if (tomoyo_str_starts(&data, "CONFIG::")) {
config = 0;
for (i = 0; i < TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX; i++) {
if (strcmp(data, tomoyo_mac_keywords[i]))
continue;
config = profile->config[i];
break;
}
if (i == TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX)
return -EINVAL;
} else {
return -EINVAL;
}
if (use_default) {
config = TOMOYO_CONFIG_USE_DEFAULT;
} else {
for (mode = 3; mode >= 0; mode--)
if (strstr(cp, tomoyo_mode[mode]))
/*
* Update lower 3 bits in order to distinguish
* 'config' from 'TOMOYO_CONFIG_USE_DEAFULT'.
*/
config = (config & ~7) | mode;
}
if (i < TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX)
profile->config[i] = config;
else if (config != TOMOYO_CONFIG_USE_DEFAULT)
profile->default_config = config;
return 0;
} }
static void tomoyo_print_preference(struct tomoyo_io_buffer *head, static void tomoyo_print_preference(struct tomoyo_io_buffer *head,