@@ -1765,6 +1765,9 @@ int cil_filecons_to_string(struct cil_db *db, char **out, size_t *size)
str_tmp += buf_pos;
switch(filecon->type) {
+ case CIL_FILECON_ANY:
+ str_type = "";
+ break;
case CIL_FILECON_FILE:
str_type = "\t--";
break;
@@ -2530,7 +2533,7 @@ void cil_filecon_init(struct cil_filecon **filecon)
*filecon = cil_malloc(sizeof(**filecon));
(*filecon)->path_str = NULL;
- (*filecon)->type = 0;
+ (*filecon)->type = CIL_FILECON_ANY;
(*filecon)->context_str = NULL;
(*filecon)->context = NULL;
}
@@ -4229,7 +4229,9 @@ int cil_gen_filecon(struct cil_db *db, struct cil_tree_node *parse_current, stru
filecon->path_str = parse_current->next->data;
- if (type == CIL_KEY_FILE) {
+ if (type == CIL_KEY_ANY) {
+ filecon->type = CIL_FILECON_ANY;
+ } else if (type == CIL_KEY_FILE) {
filecon->type = CIL_FILECON_FILE;
} else if (type == CIL_KEY_DIR) {
filecon->type = CIL_FILECON_DIR;
@@ -4243,8 +4245,6 @@ int cil_gen_filecon(struct cil_db *db, struct cil_tree_node *parse_current, stru
filecon->type = CIL_FILECON_PIPE;
} else if (type == CIL_KEY_SYMLINK) {
filecon->type = CIL_FILECON_SYMLINK;
- } else if (type == CIL_KEY_ANY) {
- filecon->type = CIL_FILECON_ANY;
} else {
cil_log(CIL_ERR, "Invalid file type\n");
rc = SEPOL_ERR;
@@ -730,14 +730,14 @@ struct cil_context {
};
enum cil_filecon_types {
- CIL_FILECON_FILE = 1,
+ CIL_FILECON_ANY = 0,
+ CIL_FILECON_FILE,
CIL_FILECON_DIR,
CIL_FILECON_CHAR,
CIL_FILECON_BLOCK,
CIL_FILECON_SOCKET,
CIL_FILECON_PIPE,
CIL_FILECON_SYMLINK,
- CIL_FILECON_ANY
};
struct cil_filecon {
@@ -1232,24 +1232,34 @@ void cil_write_ast_node(FILE *out, struct cil_tree_node *node)
struct cil_filecon *filecon = node->data;
fprintf(out, "(filecon ");
fprintf(out, "\"%s\" ", filecon->path_str);
- if (filecon->type == CIL_FILECON_FILE)
+ switch (filecon->type) {
+ case CIL_FILECON_ANY:
+ fprintf(out, "%s ", CIL_KEY_ANY);
+ break;
+ case CIL_FILECON_FILE:
fprintf(out, "%s ", CIL_KEY_FILE);
- else if (filecon->type == CIL_FILECON_DIR)
+ break;
+ case CIL_FILECON_DIR:
fprintf(out, "%s ", CIL_KEY_DIR);
- else if (filecon->type == CIL_FILECON_CHAR)
+ break;
+ case CIL_FILECON_CHAR:
fprintf(out, "%s ", CIL_KEY_CHAR);
- else if (filecon->type == CIL_FILECON_BLOCK)
+ break;
+ case CIL_FILECON_BLOCK:
fprintf(out, "%s ", CIL_KEY_BLOCK);
- else if (filecon->type == CIL_FILECON_SOCKET)
+ break;
+ case CIL_FILECON_SOCKET:
fprintf(out, "%s ", CIL_KEY_SOCKET);
- else if (filecon->type == CIL_FILECON_PIPE)
+ break;
+ case CIL_FILECON_PIPE:
fprintf(out, "%s ", CIL_KEY_PIPE);
- else if (filecon->type == CIL_FILECON_SYMLINK)
+ break;
+ case CIL_FILECON_SYMLINK:
fprintf(out, "%s ", CIL_KEY_SYMLINK);
- else if (filecon->type == CIL_FILECON_ANY)
- fprintf(out, "%s ", CIL_KEY_ANY);
- else
+ break;
+ default:
fprintf(out, "<?FILETYPE> ");
+ }
if (filecon->context)
write_context(out, filecon->context, CIL_TRUE);
else if (filecon->context_str)
Prepare for the addition of an optional file type in genfscon rules by refactoring filecon file type handling. Make the "any" file type be the first value in enum cil_filecon_types because it will be the most common file type. Signed-off-by: James Carter <jwcart2@gmail.com> --- v2: New patch libsepol/cil/src/cil.c | 5 ++++- libsepol/cil/src/cil_build_ast.c | 6 +++--- libsepol/cil/src/cil_internal.h | 4 ++-- libsepol/cil/src/cil_write_ast.c | 30 ++++++++++++++++++++---------- 4 files changed, 29 insertions(+), 16 deletions(-)