add rule_check and detail option in xevlog_analyze
authorHeebum Kwak <heebum0.kwak@samsung.com>
Wed, 1 May 2013 23:43:56 +0000 (08:43 +0900)
committerBoram Park <boram1288.park@samsung.com>
Mon, 17 Jun 2013 08:44:34 +0000 (17:44 +0900)
Change-Id: Ic9c97401a16682fe8293f1323d024a0332680b5f

bin/xevlog_analyze/xevlog_analyze.c
common/ds/bool_exp_rule_checker.c
common/xdbg_evlog.c
common/xdbg_evlog.h
common/xdbg_evlog_event.c
common/xdbg_evlog_event.h
common/xdbg_evlog_request.c
common/xdbg_evlog_request.h
module/xdbg_module_evlog.c

index 168f101..43add50 100644 (file)
@@ -50,44 +50,48 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <xdbg_types.h>
 #include <xdbg_evlog.h>
 
+#define LOG_SIZE 8192
+
 typedef struct _EvlogOption
 {
-    int pid;
-    Bool help_opt;
-    char command_name[PATH_MAX+1];
-    char path_name[PATH_MAX+1];
+    int    pid;
+    char   command_name[PATH_MAX+1];
+    char   path_name[PATH_MAX+1];
+    char** rule_argv;
+    int    rule_argc;
+    Bool   detail;
 } EvlogOption;
 
-#define BUF_SIZE 256
-
 
 static void
 _printUsage(char* name)
 {
-    fprintf(stderr, "Usage: %s [OPTION]...\n", name);
-    fprintf(stderr, "\n");
-    fprintf(stderr, " Options:\n");
-    fprintf(stderr, "       -f [File_Name]  File to save information\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "       -h              Command Usage information\n");
-    fprintf(stderr, "\n");
+    printf("Usage: %s [OPTION]...\n", name);
+    printf("\n");
+    printf(" Options:\n");
+    printf("       -f [File_Name]      File to save information\n");
+    printf("\n");
+    printf("       -r [Rule]           Setting Rule to find information you want\n");
+    printf("\n");
+    printf("            -r help        Detail Usage of -r option\n");
+    printf("\n");
+    printf("       -d [OFF:0/ON:1]     To Print detail log of extensions\n");
+    printf("\n");
+    printf("       -h                  Usage of xevlog_anlayze\n");
+    printf("\n");
 }
 
 static void _xEvlogAnalyzePrint (EvlogOption *eo)
 {
+    int i;
     int fd = -1, cfd = -1;
     int total, read_len;
     int evlog_len;
     char fd_name[256];
     EvlogInfo evinfo={0,};
 
-    if (eo->help_opt)
-    {
-        _printUsage(eo->command_name);
-        return;
-    }
 
-    if (strlen (eo->path_name) <= 0)
+    if (!strlen(eo->path_name))
     {
         printf ("failed: no evlog path\n");
         return;
@@ -111,8 +115,23 @@ static void _xEvlogAnalyzePrint (EvlogOption *eo)
 
     while ((read_len = read (fd, &evlog_len, sizeof (int))) == sizeof (int))
     {
-        char log[1024];
+        char log[LOG_SIZE];
         int size = sizeof (log);
+        static int init = 0;
+
+        if (!init)
+        {
+            int new_argc = 3;
+            char* new_argv[3] = {"add", "allow", "all"};
+
+            if(eo->rule_argc)
+                xDbgEvlogRuleSet ((const int) eo->rule_argc, (const char**) eo->rule_argv, log, &size);
+            else
+                xDbgEvlogRuleSet ((const int) new_argc, (const char**) new_argv, log, &size);
+
+            printf("%s", log);
+            init = 1;
+        }
 
         memset (&evinfo, 0, sizeof (EvlogInfo));
 
@@ -167,8 +186,11 @@ static void _xEvlogAnalyzePrint (EvlogOption *eo)
         }
         GOTO_IF_FAIL (evlog_len == total, print_done);
 
-        xDbgEvlogFillLog(&evinfo, log, &size);
-        printf ("%s", log);
+        if (xDbgEvlogRuleValidate (&evinfo))
+        {
+            xDbgEvlogFillLog(&evinfo, eo->detail, log, &size);
+            printf ("%s", log);
+        }
 
         if (evinfo.req.ptr)
         {
@@ -191,6 +213,15 @@ print_done:
     if (evinfo.evt.ptr)
         free (evinfo.evt.ptr);
 
+    for (i = 0 ; i < eo->rule_argc ; i++)
+    {
+        if (eo->rule_argv[i])
+           free (eo->rule_argv[i]);
+    }
+    if (eo->rule_argv)
+       free (eo->rule_argv);
+
+
     if (cfd >= 0)
         close (cfd);
 
@@ -198,6 +229,7 @@ print_done:
         close (fd);
 }
 
+
 static void
 _checkOption(int argc, char** argv)
 {
@@ -207,35 +239,89 @@ _checkOption(int argc, char** argv)
     EvlogOption eo = {0,};
 
     eo.pid = atoi (argv[0]);
-    eo.help_opt = TRUE;
+    eo.detail = TRUE;
     strncpy(eo.command_name, argv[1], PATH_MAX);
 
-    if (argc <= 2)
+    if (argc < 3)
     {
         _printUsage( eo.command_name );
         return;
     }
 
-    while ((c = getopt(argc, argv, "f:h")) != EOF)
+    while ((c = getopt(argc, argv, "f:r:d:h")) != EOF)
     {
         switch (c)
         {
 
             case 'f':
-                opt_str = optarg;
-                opt_str_len = strlen(opt_str);
+                {
+                    opt_str = optarg;
+                    opt_str_len = strlen(opt_str);
+
+                    if(opt_str_len > 0)
+                    {
+                        strncpy (eo.path_name, opt_str, PATH_MAX);
+                    }
+                    break;
+                }
 
-                if(opt_str_len > 0)
+            case 'r':
                 {
-                    eo.help_opt = FALSE;
-                    strncpy (eo.path_name, opt_str, opt_str_len);
+                    opt_str = optarg;
+                    opt_str_len = strlen(opt_str);
+                    if(opt_str_len > 0)
+                    {
+                        int i;
+                        eo.rule_argc = 1;
+
+                        for (i = optind ; i < argc && argv[i][0] != '-' ; i++)
+                        {
+                            eo.rule_argc++;
+                        }
+
+                        eo.rule_argv = (char**)malloc (eo.rule_argc * sizeof (char*));
+                        if (!eo.rule_argv)
+                        {
+                            printf ("failed: malloc rule_argv\n");
+                            return;
+                        }
+
+                        for (i = 0 ; i < eo.rule_argc ; i++)
+                        {
+                            eo.rule_argv[i] = (char*)malloc (strlen(argv[optind - 1 + i]) + 1);
+                            if (!eo.rule_argv[i])
+                            {
+                                printf ("failed: malloc rule_argv[%d]\n", i);
+                                return;
+                            }
+
+                            strncpy (eo.rule_argv[i], argv[optind -1 + i], strlen(argv[optind - 1 + i]));
+                        }
+
+                    }
+
+                    break;
+                }
+
+            case 'd':
+                {
+                    opt_str = optarg;
+                    opt_str_len = strlen(opt_str);
+
+                    if(opt_str_len > 0)
+                    {
+                        eo.detail = (atoi(optarg))?TRUE:FALSE;
+                        printf ("detail %s\n", (eo.detail)?"ON":"OFF");
+                    }
+                    break;
                 }
-                break;
 
             case 'h':
-                _printUsage( eo.command_name );
-                return;
-                break;
+                {
+                    _printUsage( eo.command_name );
+                    return;
+                    break;
+                }
 
             default:
                 break;
@@ -246,6 +332,7 @@ _checkOption(int argc, char** argv)
 }
 
 
+
 int main(int argc, char** argv)
 {
     char **new_argv;
@@ -256,7 +343,7 @@ int main(int argc, char** argv)
     new_argv = (char**)malloc (new_argc * sizeof (char*));
     if (!new_argv)
     {
-        fprintf (stderr, "failed: malloc new argv\n");
+        printf ("failed: malloc new argv\n");
         exit (-1);
     }
 
index a246e6b..3dd5e9b 100644 (file)
@@ -360,7 +360,10 @@ const char * rulechecker_print_usage()
         "-----------------------------------------------------------------\n"
         "Usage : xdbg evlog_rule add [POLICY] [RULE]\n"
         "        xdbg evlog_rule remove [INDEX]\n"
-        "        xdbg evlog_rule help /print\n"
+        "        xdbg evlog_rule help / print\n"
+        "        xevlog_analyze -r add [POLICY] [RULE] -f [FILENAME]\n"
+        "        xevlog_analyze -r remove [INDEX] -f [FILENAME]\n"
+        "        xevlog_analyze -r help / print -f [FILENAME]\n"
         "      [POLICY] : allow / deny \n"
         "      [RULE] : C Language-style boolean expression syntax. [VARIABLE] [COMPAROTOR] [VALUE]\n"
         "      [VARIABLE] : type / major / minor / command / cmd / pid\n"
index 6a581ba..948480e 100644 (file)
@@ -323,7 +323,7 @@ _EvlogGetExtentionEntry (int *return_extensions_size)
 
 
 void
-xDbgEvlogFillLog (EvlogInfo *evinfo, char *reply, int *len)
+xDbgEvlogFillLog (EvlogInfo *evinfo, Bool on, char *reply, int *len)
 {
     static CARD32 prev;
     static int Extensions_size = 0;
@@ -331,7 +331,7 @@ xDbgEvlogFillLog (EvlogInfo *evinfo, char *reply, int *len)
     RETURN_IF_FAIL (evinfo->type >= 0 && (sizeof (evt_dir) / sizeof (char*)));
     RETURN_IF_FAIL (evinfo->type >= 0 && (sizeof (evt_type) / sizeof (char*)));
 
-    REPLY ("[%10.3f][%5ld] %22s(%2d:%5d) %s %s",
+    REPLY ("[%10.3f][%5ld] %22s(%2d:%5d) %s %7s ",
                 evinfo->time / 1000.0,
                 evinfo->time - prev,
                 xDbgEvlogGetCmd (evinfo->client.command),
@@ -343,13 +343,13 @@ xDbgEvlogFillLog (EvlogInfo *evinfo, char *reply, int *len)
     if (evinfo->type == REQUEST && _EvlogGetExtentionEntry (&Extensions_size))
     {
         REPLY ("(");
-        reply = xDbgEvlogReqeust (evinfo, Extensions_size, reply, len);
+        reply = xDbgEvlogReqeust (evinfo, on, Extensions_size, reply, len);
         REPLY (")");
     }
     else if (evinfo->type == EVENT && _EvlogGetExtentionEntry (&Extensions_size))
     {
         REPLY ("(");
-        reply = xDbgEvlogEvent (evinfo, Extensions_size, reply, len);
+        reply = xDbgEvlogEvent (evinfo, on, Extensions_size, reply, len);
         REPLY (")");
     }
     else
index 275e4de..2625455 100644 (file)
@@ -50,6 +50,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 char*   xDbgEvlogGetCmd         (char *path);
 Bool    xDbgEvlogRuleSet        (const int argc, const char **argv, char *reply, int *len);
 Bool    xDbgEvlogRuleValidate   (EvlogInfo *evinfo);
-void    xDbgEvlogFillLog        (EvlogInfo *evinfo, char *reply, int *len);
+void    xDbgEvlogFillLog        (EvlogInfo *evinfo, Bool on, char *reply, int *len);
 
 #endif
index 11944bf..90f45b1 100644 (file)
@@ -62,7 +62,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 extern ExtensionInfo* Sorted_Evlog_extensions;
 
 char *
-xDbgEvlogEvent (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len)
+xDbgEvlogEvent (EvlogInfo *evinfo, Bool on, int Extensions_size, char *reply, int *len)
 {
     EvlogEvent   ev;
     xEvent *xEvt = NULL;
@@ -84,6 +84,9 @@ xDbgEvlogEvent (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len)
 
     type &= 0x7F;
 
+    if(!on)
+        return reply;
+
     if (type < EXTENSION_EVENT_BASE)
     {
         return xDbgEvlogEventCore (xEvt, reply, len);
index 4c42c01..0fae711 100644 (file)
@@ -34,6 +34,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "xdbg_types.h"
 
-char *  xDbgEvlogEvent (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len);
+char *  xDbgEvlogEvent (EvlogInfo *evinfo, Bool on, int Extensions_size, char *reply, int *len);
 
 #endif
index 2b29d75..ad4d0be 100644 (file)
@@ -62,7 +62,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 extern ExtensionInfo Evlog_extensions[];
 
 char *
-xDbgEvlogReqeust (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len)
+xDbgEvlogReqeust (EvlogInfo *evinfo, Bool on, int Extensions_size, char *reply, int *len)
 {
     EvlogRequest req;
     xReq *xReq = NULL;
@@ -75,6 +75,9 @@ xDbgEvlogReqeust (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len)
 
     REPLY ("%s", req.name);
 
+    if(!on)
+        return reply;
+
     if (xReq->reqType < EXTENSION_BASE)
     {
         return xDbgEvlogRequestCore (xReq, reply, len);
index 89e033c..5dc5b47 100644 (file)
@@ -34,6 +34,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "xdbg_types.h"
 
-char *  xDbgEvlogReqeust (EvlogInfo *evinfo, int Extensions_size, char *reply, int *len);
+char *  xDbgEvlogReqeust (EvlogInfo *evinfo, Bool on, int Extensions_size, char *reply, int *len);
 
 #endif
index dfab606..8488efb 100644 (file)
@@ -157,7 +157,7 @@ static void evtPrintF (int fd, EvlogInfo *evinfo)
     char log[1024];
     int size = sizeof (log);
 
-    xDbgEvlogFillLog (evinfo, log, &size);
+    xDbgEvlogFillLog (evinfo, TRUE, log, &size);
 
     if (fd < 0)
         ErrorF ("%s", log);