1 /**************************************************************************
5 Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
7 Contact: Boram Park <boram1288.park@samsung.com>
8 Sangjin LEE <lsj119@samsung.com>
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
41 #include <sys/types.h>
43 #include <sys/ioctl.h>
49 #include <X11/Xw32defs.h>
50 #include <xdbg_types.h>
51 #include <xdbg_evlog.h>
55 typedef struct _EvlogOption
58 char command_name[PATH_MAX+1];
59 char path_name[PATH_MAX+1];
66 _printUsage(char* name)
68 printf("Usage: %s [OPTION]...\n", name);
70 printf(" Options:\n");
71 printf(" -f [File_Name] File to save information\n");
73 printf(" -r [Rule_File_Name] Setting Rule of certain policy read in File to find information you want\n");
75 printf(" [How To write Rule file form]\n");
76 printf(" ------------------------\n");
77 printf(" | allow [RULE] |\n");
78 printf(" | deny [RULE] |\n");
79 printf(" ------------------------\n");
80 printf(" * It is possible to write multiple policies.\n");
82 printf(" -a [ALLOW Rule] Setting Rule of 'ALLOW' policy to find information you want\n");
84 printf(" -n [Deny Rule] Setting Rule of 'Deny' policy to find information you want\n");
86 printf(" [RULE] : C Language-style boolean expression syntax. [VARIABLE] [COMPAROTOR] [VALUE]\n");
87 printf(" [VARIABLE] : type / major / minor / command / cmd / pid\n");
88 printf(" [COMPARATOR] : & / && / and / | / || / or / = / == / != / > / >= / < / <=\n");
89 printf(" [VALUE] : string / number \n");
92 printf(" xevlog_analyze -a \"(type=request) && (major == X11 and (minor = SendEvent or minor = ReceiveEvent))\"\n");
93 printf(" xevlog_analyze -n cmd!=ls\n");
95 printf(" * WARNING : If you set both -a and -n option, must set -a option first. Otherwise Logs you DO NOT want can be printed.\n");
97 printf(" -d [0-2] To Set printing detail log level\n");
99 printf(" 0: To Print Primary Logs (XID, Root, Atom, Region ...)\n");
100 printf(" 1: To Print More Detail Logs (Time, State, Mask ...\n");
101 printf(" 2: To Print Supplementary Reply Logs (Information Including Each Item)\n");
103 printf(" -h Usage of xevlog_anlayze\n");
107 static void _xEvlogAnalyzePrint (EvlogOption *eo, char* reply, int* len)
109 int fd = -1, cfd = -1;
113 EvlogInfo evinfo={0,};
116 if (!eo->path_name || !strlen(eo->path_name))
118 printf ("failed: no evlog path\n");
119 _printUsage(eo->command_name);
123 fd = open (eo->path_name, O_RDONLY);
126 printf ("failed: open '%s'. (%s)\n", eo->path_name, strerror(errno));
130 snprintf (fd_name, sizeof (fd_name), "/proc/%d/fd/1", eo->pid);
131 cfd = open (fd_name, O_RDWR);
135 printf ("failed: open consol '%s'. (%s)\n", fd_name, strerror(errno));
139 while ((read_len = read (fd, &evlog_len, sizeof (int))) == sizeof (int))
142 int size = sizeof (log);
145 memset (&evinfo, 0, sizeof (EvlogInfo));
150 extern ExtensionInfo Evlog_extensions[];
151 extern int Extensions_size;
153 char* new_argv[3] = {"add", "allow", "all"};
157 xDbgEvlogRuleSet ((const int) new_argc, (const char**) new_argv, reply, len);
159 printf("%s\n", reply);
161 read_len = read (fd, &Extensions_size, sizeof (int));
162 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
165 for (i = 0 ; i < Extensions_size ; i++)
167 read_len = read (fd, &Evlog_extensions[i].opcode, sizeof (int));
168 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
171 read_len = read (fd, &Evlog_extensions[i].evt_base, sizeof (int));
172 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
175 read_len = read (fd, &Evlog_extensions[i].err_base, sizeof (int));
176 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
180 if (!xDbgEvlogGetExtensionEntry ())
182 printf ("failed: get extentions\n");
189 read_len = read (fd, &evinfo.time, sizeof (CARD32));
190 GOTO_IF_FAIL (read_len == sizeof (CARD32), print_done);
193 read_len = read (fd, &evinfo.type, sizeof (EvlogType));
194 GOTO_IF_FAIL (read_len == sizeof (EvlogType), print_done);
195 GOTO_IF_FAIL (evinfo.type >= EVENT && evinfo.type <= ERROR, print_done);
198 read_len = read (fd, &evinfo.mask, sizeof (int));
199 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
202 if (evinfo.mask & EVLOG_MASK_CLIENT)
204 read_len = read (fd, &evinfo.client, sizeof (EvlogClient));
205 GOTO_IF_FAIL (read_len == sizeof (EvlogClient), print_done);
209 if (evinfo.mask & EVLOG_MASK_REQUEST)
213 read_len = read (fd, &evinfo.req, sizeof(EvlogRequest));
214 GOTO_IF_FAIL (read_len == sizeof(EvlogRequest), print_done);
217 size = (int)(evinfo.req.length * 4);
218 GOTO_IF_FAIL (size > 0, print_done);
220 evinfo.req.ptr = malloc (size);
221 GOTO_IF_FAIL (evinfo.req.ptr != NULL, print_done);
223 read_len = read (fd, evinfo.req.ptr, size);
224 GOTO_IF_FAIL (read_len == size, print_done);
228 if (evinfo.mask & EVLOG_MASK_EVENT)
230 read_len = read (fd, &evinfo.evt, sizeof(EvlogEvent));
231 GOTO_IF_FAIL (read_len == sizeof(EvlogEvent), print_done);
234 evinfo.evt.ptr = malloc (evinfo.evt.size);
235 GOTO_IF_FAIL (evinfo.evt.ptr != NULL, print_done);
237 WARNING_IF_FAIL (evinfo.evt.size > 0);
239 read_len = read (fd, evinfo.evt.ptr, evinfo.evt.size);
240 GOTO_IF_FAIL (read_len == evinfo.evt.size, print_done);
244 if (evinfo.mask & EVLOG_MASK_REPLY)
246 read_len = read (fd, &evinfo.rep, sizeof(EvlogReply));
247 GOTO_IF_FAIL (read_len == sizeof(EvlogReply), print_done);
250 evinfo.rep.ptr = malloc (evinfo.rep.size);
251 GOTO_IF_FAIL (evinfo.rep.ptr != NULL, print_done);
253 WARNING_IF_FAIL (evinfo.rep.size > 0);
255 read_len = read (fd, evinfo.rep.ptr, evinfo.rep.size);
256 GOTO_IF_FAIL (read_len == evinfo.rep.size, print_done);
260 if (evinfo.mask & EVLOG_MASK_ERROR)
262 read_len = read (fd, &evinfo.err, sizeof(EvlogError));
263 GOTO_IF_FAIL (read_len == sizeof(EvlogError), print_done);
267 if (evinfo.mask & EVLOG_MASK_ATOM)
269 EvlogAtomTable *table;
271 read_len = read (fd, &evinfo.evatom.size, sizeof (int));
272 GOTO_IF_FAIL (read_len == sizeof(int), print_done);
275 for (i = 0 ; i < evinfo.evatom.size ; i++)
277 table = malloc (sizeof(EvlogAtomTable));
278 GOTO_IF_FAIL (table != NULL, print_done);
280 if (!evinfo.evatom.init)
282 xorg_list_init(&evinfo.evatom.list);
283 evinfo.evatom.init = 1;
286 read_len = read (fd, table, sizeof (EvlogAtomTable));
287 if (read_len != sizeof(EvlogAtomTable))
289 WARNING_IF_FAIL (read_len == sizeof(EvlogAtomTable));
295 xorg_list_add(&table->link, &evinfo.evatom.list);
299 if (evinfo.mask & EVLOG_MASK_REGION)
301 EvlogRegionTable *table;
303 read_len = read (fd, &evinfo.evregion.size, sizeof (int));
304 GOTO_IF_FAIL (read_len == sizeof(int), print_done);
307 for (i = 0 ; i < evinfo.evregion.size ; i++)
309 table = malloc (sizeof(EvlogRegionTable));
310 GOTO_IF_FAIL (table != NULL, print_done);
312 if (!evinfo.evregion.init)
314 xorg_list_init(&evinfo.evregion.list);
315 evinfo.evregion.init = 1;
318 read_len = read (fd, table, sizeof (EvlogRegionTable));
319 if (read_len != sizeof(EvlogRegionTable))
321 WARNING_IF_FAIL (read_len == sizeof(EvlogRegionTable));
327 xorg_list_add(&table->link, &evinfo.evregion.list);
331 GOTO_IF_FAIL (evlog_len == total, print_done);
333 if (xDbgEvlogRuleValidate (&evinfo))
335 if (xDbgEvlogFillLog(&evinfo, eo->detail_level, log, &size))
341 free (evinfo.req.ptr);
342 evinfo.req.ptr = NULL;
347 free (evinfo.evt.ptr);
348 evinfo.evt.ptr = NULL;
351 xDbgDistroyAtomList(&evinfo);
352 xDbgDistroyRegionList(&evinfo);
358 free (evinfo.req.ptr);
361 free (evinfo.evt.ptr);
363 xDbgDistroyAtomList(&evinfo);
364 xDbgDistroyRegionList(&evinfo);
375 _checkOption(int argc, char** argv)
378 EvlogOption eo = {0,};
379 char rule_log[LOG_SIZE];
380 int rule_size = sizeof (rule_log);
382 eo.pid = atoi (argv[0]);
385 snprintf (eo.command_name, sizeof (eo.command_name), "%s", argv[1]);
389 _printUsage( eo.command_name );
393 while ((c = getopt(argc, argv, "f:a:n:r:d:h")) != EOF)
399 if (!optarg || strlen(optarg) <= 0)
401 snprintf (eo.path_name, sizeof (eo.path_name), "%s", optarg);
408 char* new_argv[3] = {"add", "allow", };
410 if (!optarg || strlen(optarg) <= 0)
413 new_argv[2] = (char*)calloc (1, PATH_MAX);
416 printf ("failed: malloc new_argv[2]\n");
420 snprintf (new_argv[2], PATH_MAX, "%s", optarg);
421 if(!xDbgEvlogRuleSet ((const int) new_argc,
422 (const char**) new_argv,
423 rule_log, &rule_size))
425 printf("%s\n", rule_log);
438 char* new_argv[3] = {"add", "deny", };
440 if (!optarg || strlen(optarg) <= 0)
443 new_argv[2] = (char*)calloc (1, PATH_MAX);
446 printf ("failed: malloc new_argv[2]\n");
450 snprintf (new_argv[2], PATH_MAX, "%s", optarg);
451 if(!xDbgEvlogRuleSet ((const int) new_argc,
452 (const char**) new_argv,
453 rule_log, &rule_size))
455 printf("%s\n", rule_log);
467 if (!optarg || strlen(optarg) <= 0)
470 if(!xDbgEvlogReadRuleFile(optarg, rule_log, &rule_size))
472 printf("%s", rule_log);
481 if (!optarg || strlen(optarg) <= 0 || strlen(optarg) > 2)
484 eo.detail_level = atoi(optarg);
485 printf ("Detail Level: %d\n", eo.detail_level);
492 _printUsage( eo.command_name );
502 _xEvlogAnalyzePrint(&eo, rule_log, &rule_size);
507 int main(int argc, char** argv)
514 new_argv = (char**)malloc (new_argc * sizeof (char*));
517 printf ("failed: malloc new argv\n");
521 snprintf (temp, sizeof(temp), "%d", (int)getpid());
524 for (i = 0; i < argc; i++)
525 new_argv[i+1] = argv[i];
527 _checkOption(new_argc, new_argv);