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);
163 GOTO_IF_FAIL (Extensions_size > 0, print_done);
166 for (i = 0 ; i < Extensions_size ; i++)
168 read_len = read (fd, &Evlog_extensions[i].opcode, sizeof (int));
169 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
172 read_len = read (fd, &Evlog_extensions[i].evt_base, sizeof (int));
173 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
176 read_len = read (fd, &Evlog_extensions[i].err_base, sizeof (int));
177 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
181 if (!xDbgEvlogGetExtensionEntry ())
183 printf ("failed: get extentions\n");
190 read_len = read (fd, &evinfo.time, sizeof (CARD32));
191 GOTO_IF_FAIL (read_len == sizeof (CARD32), print_done);
194 read_len = read (fd, &evinfo.type, sizeof (EvlogType));
195 GOTO_IF_FAIL (read_len == sizeof (EvlogType), print_done);
196 GOTO_IF_FAIL (evinfo.type >= EVENT && evinfo.type <= ERROR, print_done);
199 read_len = read (fd, &evinfo.mask, sizeof (int));
200 GOTO_IF_FAIL (read_len == sizeof (int), print_done);
203 if (evinfo.mask & EVLOG_MASK_CLIENT)
205 read_len = read (fd, &evinfo.client, sizeof (EvlogClient));
206 GOTO_IF_FAIL (read_len == sizeof (EvlogClient), print_done);
210 if (evinfo.mask & EVLOG_MASK_REQUEST)
214 read_len = read (fd, &evinfo.req, sizeof(EvlogRequest));
215 GOTO_IF_FAIL (read_len == sizeof(EvlogRequest), print_done);
218 size = (int)(evinfo.req.length * 4);
219 GOTO_IF_FAIL (size > 0, print_done);
221 evinfo.req.ptr = malloc (size);
222 GOTO_IF_FAIL (evinfo.req.ptr != NULL, print_done);
224 read_len = read (fd, evinfo.req.ptr, size);
225 GOTO_IF_FAIL (read_len == size, print_done);
229 if (evinfo.mask & EVLOG_MASK_EVENT)
231 read_len = read (fd, &evinfo.evt, sizeof(EvlogEvent));
232 GOTO_IF_FAIL (read_len == sizeof(EvlogEvent), print_done);
235 evinfo.evt.ptr = malloc (evinfo.evt.size);
236 GOTO_IF_FAIL (evinfo.evt.ptr != NULL, print_done);
238 WARNING_IF_FAIL (evinfo.evt.size > 0);
240 read_len = read (fd, evinfo.evt.ptr, evinfo.evt.size);
241 GOTO_IF_FAIL (read_len == evinfo.evt.size, print_done);
245 if (evinfo.mask & EVLOG_MASK_REPLY)
247 read_len = read (fd, &evinfo.rep, sizeof(EvlogReply));
248 GOTO_IF_FAIL (read_len == sizeof(EvlogReply), print_done);
251 evinfo.rep.ptr = malloc (evinfo.rep.size);
252 GOTO_IF_FAIL (evinfo.rep.ptr != NULL, print_done);
254 WARNING_IF_FAIL (evinfo.rep.size > 0);
256 read_len = read (fd, evinfo.rep.ptr, evinfo.rep.size);
257 GOTO_IF_FAIL (read_len == evinfo.rep.size, print_done);
261 if (evinfo.mask & EVLOG_MASK_ERROR)
263 read_len = read (fd, &evinfo.err, sizeof(EvlogError));
264 GOTO_IF_FAIL (read_len == sizeof(EvlogError), print_done);
268 if (evinfo.mask & EVLOG_MASK_ATOM)
270 EvlogAtomTable *table;
272 read_len = read (fd, &evinfo.evatom.size, sizeof (int));
273 GOTO_IF_FAIL (read_len == sizeof(int), print_done);
276 for (i = 0 ; i < evinfo.evatom.size ; i++)
278 table = malloc (sizeof(EvlogAtomTable));
279 GOTO_IF_FAIL (table != NULL, print_done);
281 if (!evinfo.evatom.init)
283 xorg_list_init(&evinfo.evatom.list);
284 evinfo.evatom.init = 1;
287 read_len = read (fd, table, sizeof (EvlogAtomTable));
288 if (read_len != sizeof(EvlogAtomTable))
290 WARNING_IF_FAIL (read_len == sizeof(EvlogAtomTable));
296 xorg_list_add(&table->link, &evinfo.evatom.list);
300 if (evinfo.mask & EVLOG_MASK_REGION)
302 EvlogRegionTable *table;
304 read_len = read (fd, &evinfo.evregion.size, sizeof (int));
305 GOTO_IF_FAIL (read_len == sizeof(int), print_done);
308 for (i = 0 ; i < evinfo.evregion.size ; i++)
310 table = malloc (sizeof(EvlogRegionTable));
311 GOTO_IF_FAIL (table != NULL, print_done);
313 if (!evinfo.evregion.init)
315 xorg_list_init(&evinfo.evregion.list);
316 evinfo.evregion.init = 1;
319 read_len = read (fd, table, sizeof (EvlogRegionTable));
320 if (read_len != sizeof(EvlogRegionTable))
322 WARNING_IF_FAIL (read_len == sizeof(EvlogRegionTable));
328 xorg_list_add(&table->link, &evinfo.evregion.list);
332 GOTO_IF_FAIL (evlog_len == total, print_done);
334 if (xDbgEvlogRuleValidate (&evinfo))
336 if (xDbgEvlogFillLog(&evinfo, eo->detail_level, log, &size))
342 free (evinfo.req.ptr);
343 evinfo.req.ptr = NULL;
348 free (evinfo.evt.ptr);
349 evinfo.evt.ptr = NULL;
352 xDbgDistroyAtomList(&evinfo);
353 xDbgDistroyRegionList(&evinfo);
359 free (evinfo.req.ptr);
362 free (evinfo.evt.ptr);
364 xDbgDistroyAtomList(&evinfo);
365 xDbgDistroyRegionList(&evinfo);
376 _checkOption(int argc, char** argv)
379 EvlogOption eo = {0,};
380 char rule_log[LOG_SIZE];
381 int rule_size = sizeof (rule_log);
383 eo.pid = atoi (argv[0]);
386 snprintf (eo.command_name, sizeof (eo.command_name), "%s", argv[1]);
390 _printUsage( eo.command_name );
394 while ((c = getopt(argc, argv, "f:a:n:r:d:h")) != EOF)
400 if (!optarg || strlen(optarg) <= 0)
402 snprintf (eo.path_name, sizeof (eo.path_name), "%s", optarg);
409 char* new_argv[3] = {"add", "allow", };
411 if (!optarg || strlen(optarg) <= 0)
414 new_argv[2] = (char*)calloc (1, PATH_MAX);
417 printf ("failed: malloc new_argv[2]\n");
421 snprintf (new_argv[2], PATH_MAX, "%s", optarg);
422 if(!xDbgEvlogRuleSet ((const int) new_argc,
423 (const char**) new_argv,
424 rule_log, &rule_size))
426 printf("%s\n", rule_log);
439 char* new_argv[3] = {"add", "deny", };
441 if (!optarg || strlen(optarg) <= 0)
444 new_argv[2] = (char*)calloc (1, PATH_MAX);
447 printf ("failed: malloc new_argv[2]\n");
451 snprintf (new_argv[2], PATH_MAX, "%s", optarg);
452 if(!xDbgEvlogRuleSet ((const int) new_argc,
453 (const char**) new_argv,
454 rule_log, &rule_size))
456 printf("%s\n", rule_log);
468 if (!optarg || strlen(optarg) <= 0)
471 if(!xDbgEvlogReadRuleFile(optarg, rule_log, &rule_size))
473 printf("%s", rule_log);
482 if (!optarg || strlen(optarg) <= 0 || strlen(optarg) > 2)
485 eo.detail_level = atoi(optarg);
486 printf ("Detail Level: %d\n", eo.detail_level);
493 _printUsage( eo.command_name );
503 _xEvlogAnalyzePrint(&eo, rule_log, &rule_size);
508 int main(int argc, char** argv)
515 new_argv = (char**)malloc (new_argc * sizeof (char*));
518 printf ("failed: malloc new argv\n");
522 snprintf (temp, sizeof(temp), "%d", (int)getpid());
525 for (i = 0; i < argc; i++)
526 new_argv[i+1] = argv[i];
528 _checkOption(new_argc, new_argv);