All the write_*_contexts() methods use exactly the same code.
This splits it off into a common helper function.
---
 libsemanage/src/genhomedircon.c | 69 ++++++++++++++---------------------------
 1 file changed, 23 insertions(+), 46 deletions(-)

diff --git a/libsemanage/src/genhomedircon.c b/libsemanage/src/genhomedircon.c
index 1a9e87e..a95ab16 100644
--- a/libsemanage/src/genhomedircon.c
+++ b/libsemanage/src/genhomedircon.c
@@ -548,23 +548,11 @@ static int check_line(genhomedircon_settings_t * s, Ustr 
*line)
        return result;
 }
 
-static int write_home_dir_context(genhomedircon_settings_t * s, FILE * out,
-                                 semanage_list_t * tpl, const char *user,
-                                 const char *seuser, const char *home,
-                                 const char *role_prefix, const char *level)
+static int write_replacements(genhomedircon_settings_t * s, FILE * out,
+                             semanage_list_t * tpl, replacement_pair_t *repl)
 {
-       replacement_pair_t repl[] = {
-               {.search_for = TEMPLATE_SEUSER,.replace_with = seuser},
-               {.search_for = TEMPLATE_HOME_DIR,.replace_with = home},
-               {.search_for = TEMPLATE_ROLE,.replace_with = role_prefix},
-               {.search_for = TEMPLATE_LEVEL,.replace_with = level},
-               {NULL, NULL}
-       };
        Ustr *line = USTR_NULL;
 
-       if (fprintf(out, COMMENT_USER_HOME_CONTEXT, user) < 0)
-               return STATUS_ERR;
-
        for (; tpl; tpl = tpl->next) {
                line = replace_all(tpl->data, repl);
                if (!line)
@@ -582,6 +570,25 @@ static int write_home_dir_context(genhomedircon_settings_t 
* s, FILE * out,
        return STATUS_ERR;
 }
 
+static int write_home_dir_context(genhomedircon_settings_t * s, FILE * out,
+                                 semanage_list_t * tpl, const char *user,
+                                 const char *seuser, const char *home,
+                                 const char *role_prefix, const char *level)
+{
+       replacement_pair_t repl[] = {
+               {.search_for = TEMPLATE_SEUSER,.replace_with = seuser},
+               {.search_for = TEMPLATE_HOME_DIR,.replace_with = home},
+               {.search_for = TEMPLATE_ROLE,.replace_with = role_prefix},
+               {.search_for = TEMPLATE_LEVEL,.replace_with = level},
+               {NULL, NULL}
+       };
+
+       if (fprintf(out, COMMENT_USER_HOME_CONTEXT, user) < 0)
+               return STATUS_ERR;
+
+       return write_replacements(s, out, tpl, repl);
+}
+
 static int write_home_root_context(genhomedircon_settings_t * s, FILE * out,
                                   semanage_list_t * tpl, char *homedir)
 {
@@ -589,23 +596,8 @@ static int 
write_home_root_context(genhomedircon_settings_t * s, FILE * out,
                {.search_for = TEMPLATE_HOME_ROOT,.replace_with = homedir},
                {NULL, NULL}
        };
-       Ustr *line = USTR_NULL;
-
-       for (; tpl; tpl = tpl->next) {
-               line = replace_all(tpl->data, repl);
-               if (!line)
-                       goto fail;
-               if (check_line(s, line) == STATUS_SUCCESS) {
-                       if (!ustr_io_putfileline(&line, out))
-                               goto fail;
-               }
-               ustr_sc_free(&line);
-       }
-       return STATUS_SUCCESS;
 
-      fail:
-       ustr_sc_free(&line);
-       return STATUS_ERR;
+       return write_replacements(s, out, tpl, repl);
 }
 
 static int write_user_context(genhomedircon_settings_t * s, FILE * out,
@@ -618,23 +610,8 @@ static int write_user_context(genhomedircon_settings_t * 
s, FILE * out,
                {.search_for = TEMPLATE_SEUSER,.replace_with = seuser},
                {NULL, NULL}
        };
-       Ustr *line = USTR_NULL;
-
-       for (; tpl; tpl = tpl->next) {
-               line = replace_all(tpl->data, repl);
-               if (!line)
-                       goto fail;
-               if (check_line(s, line) == STATUS_SUCCESS) {
-                       if (!ustr_io_putfileline(&line, out))
-                               goto fail;
-               }
-               ustr_sc_free(&line);
-       }
-       return STATUS_SUCCESS;
 
-      fail:
-       ustr_sc_free(&line);
-       return STATUS_ERR;
+       return write_replacements(s, out, tpl, repl);
 }
 
 static int user_sort_func(semanage_user_t ** arg1, semanage_user_t ** arg2)
-- 
2.7.3

_______________________________________________
Selinux mailing list
Selinux@tycho.nsa.gov
To unsubscribe, send email to selinux-le...@tycho.nsa.gov.
To get help, send an email containing "help" to selinux-requ...@tycho.nsa.gov.

Reply via email to