Make it more generic so that it can be shared with signals.

Signed-off-by: John Johansen <john.johan...@canonical.com>

---
 parser/dbus.c        |   71 ------------------------------------------------
 parser/parser.h      |    1 
 parser/parser_misc.c |   75 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+), 70 deletions(-)

--- 2.9-test.orig/parser/dbus.c
+++ 2.9-test/parser/dbus.c
@@ -31,79 +31,10 @@
 
 #define _(s) gettext(s)
 
-static int parse_dbus_sub_mode(const char *str_mode, int *result, int fail, 
const char *mode_desc __unused)
-{
-       int mode = 0;
-       const char *p;
-
-       PDEBUG("Parsing DBus mode: %s\n", str_mode);
-
-       if (!str_mode)
-               return 0;
-
-       p = str_mode;
-       while (*p) {
-               char current = *p;
-               char lower;
-
-reeval:
-               switch (current) {
-               case COD_READ_CHAR:
-                       PDEBUG("Parsing DBus mode: found %s READ\n", mode_desc);
-                       mode |= AA_DBUS_RECEIVE;
-                       break;
-
-               case COD_WRITE_CHAR:
-                       PDEBUG("Parsing DBus mode: found %s WRITE\n",
-                              mode_desc);
-                       mode |= AA_DBUS_SEND;
-                       break;
-
-               /* error cases */
-
-               default:
-                       lower = tolower(current);
-                       switch (lower) {
-                       case COD_READ_CHAR:
-                       case COD_WRITE_CHAR:
-                               PDEBUG("Parsing DBus mode: found invalid upper 
case char %c\n",
-                                      current);
-                               warn_uppercase();
-                               current = lower;
-                               goto reeval;
-                               break;
-                       default:
-                               if (fail)
-                                       yyerror(_("Internal: unexpected DBus 
mode character '%c' in input"),
-                                               current);
-                               else
-                                       return 0;
-                               break;
-                       }
-                       break;
-               }
-               p++;
-       }
-
-       PDEBUG("Parsed DBus mode: %s 0x%x\n", str_mode, mode);
-
-       *result = mode;
-       return 1;
-}
 
 int parse_dbus_mode(const char *str_mode, int *mode, int fail)
 {
-       *mode = 0;
-       if (!parse_dbus_sub_mode(str_mode, mode, fail, ""))
-               return 0;
-       if (*mode & ~AA_VALID_DBUS_PERMS) {
-               if (fail)
-                       yyerror(_("Internal error generated invalid DBus perm 
0x%x\n"),
-                                 mode);
-               else
-                       return 0;
-       }
-       return 1;
+       return parse_X_mode("DBus", AA_VALID_DBUS_PERMS, str_mode, mode, fail);
 }
 
 static void move_conditional_value(char **dst_ptr, struct cond_entry *cond_ent)
--- 2.9-test.orig/parser/parser.h
+++ 2.9-test/parser/parser.h
@@ -331,6 +331,7 @@
 extern int get_rlimit(const char *name);
 extern char *process_var(const char *var);
 extern int parse_mode(const char *mode);
+extern int parse_X_mode(const char *X, int valid, const char *str_mode, int 
*mode, int fail);
 extern struct cod_entry *new_entry(char *ns, char *id, int mode, char 
*link_id);
 extern struct aa_network_entry *new_network_ent(unsigned int family,
                                                unsigned int type,
--- 2.9-test.orig/parser/parser_misc.c
+++ 2.9-test/parser/parser_misc.c
@@ -792,6 +792,81 @@
        return mode;
 }
 
+static int parse_X_sub_mode(const char *X, const char *str_mode, int *result, 
int fail, const char *mode_desc __unused)
+{
+       int mode = 0;
+       const char *p;
+
+       PDEBUG("Parsing X mode: %s\n", X, str_mode);
+
+       if (!str_mode)
+               return 0;
+
+       p = str_mode;
+       while (*p) {
+               char current = *p;
+               char lower;
+
+reeval:
+               switch (current) {
+               case COD_READ_CHAR:
+                       PDEBUG("Parsing %s mode: found %s READ\n", X, 
mode_desc);
+                       mode |= AA_DBUS_RECEIVE;
+                       break;
+
+               case COD_WRITE_CHAR:
+                       PDEBUG("Parsing %s mode: found %s WRITE\n", X,
+                              mode_desc);
+                       mode |= AA_DBUS_SEND;
+                       break;
+
+               /* error cases */
+
+               default:
+                       lower = tolower(current);
+                       switch (lower) {
+                       case COD_READ_CHAR:
+                       case COD_WRITE_CHAR:
+                               PDEBUG("Parsing %s mode: found invalid upper 
case char %c\n",
+                                      X, current);
+                               warn_uppercase();
+                               current = lower;
+                               goto reeval;
+                               break;
+                       default:
+                               if (fail)
+                                       yyerror(_("Internal: unexpected %s mode 
character '%c' in input"),
+                                               X, current);
+                               else
+                                       return 0;
+                               break;
+                       }
+                       break;
+               }
+               p++;
+       }
+
+       PDEBUG("Parsed %s mode: %s 0x%x\n", X, str_mode, mode);
+
+       *result = mode;
+       return 1;
+}
+
+int parse_X_mode(const char *X, int valid, const char *str_mode, int *mode, 
int fail)
+{
+       *mode = 0;
+       if (!parse_X_sub_mode(X, str_mode, mode, fail, ""))
+               return 0;
+       if (*mode & ~valid) {
+               if (fail)
+                       yyerror(_("Internal error generated invalid %s perm 
0x%x\n"),
+                               X, mode);
+               else
+                       return 0;
+       }
+       return 1;
+}
+
 struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id)
 {
        struct cod_entry *entry = NULL;


-- 
AppArmor mailing list
AppArmor@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/apparmor

Reply via email to