X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=trace%2Ftrace.c;h=35bc548d08ac1f2c4782920135ab0c06157aae4a;hp=662010e339ea224d04d9a5e701b1eeed5855934f;hb=c6b6ec6d234e3de3dba573d59754a8c434741e39;hpb=4004b68fe57dd72197b8a00b0756cc7f978ad88a diff --git a/trace/trace.c b/trace/trace.c index 662010e..35bc548 100644 --- a/trace/trace.c +++ b/trace/trace.c @@ -77,6 +77,16 @@ static void set_syscall(const char *name, int val) } } +struct syscall { + int syscall; + int count; +}; + +static int cmp_count(const void *a, const void *b) +{ + return ((struct syscall*)b)->count - ((struct syscall*)a)->count; +} + static void print_syscalls(int policy, const char *json) { void *c; @@ -88,19 +98,29 @@ static void print_syscalls(int policy, const char *json) set_syscall("exit_group", 1); set_syscall("exit", 1); + struct syscall sorted[ARRAY_SIZE(syscall_names)]; + + for (i = 0; i < ARRAY_SIZE(syscall_names); i++) { + sorted[i].syscall = i; + sorted[i].count = syscall_count[i]; + } + + qsort(sorted, ARRAY_SIZE(syscall_names), sizeof(sorted[0]), cmp_count); + blob_buf_init(&b, 0); c = blobmsg_open_array(&b, "whitelist"); for (i = 0; i < ARRAY_SIZE(syscall_names); i++) { - if (!syscall_count[i]) - continue; - if (syscall_names[i]) { + int sc = sorted[i].syscall; + if (!sorted[i].count) + break; + if (syscall_names[sc]) { if (debug) printf("syscall %d (%s) was called %d times\n", - i, syscall_names[i], syscall_count[i]); - blobmsg_add_string(&b, NULL, syscall_names[i]); + sc, syscall_names[sc], sorted[i].count); + blobmsg_add_string(&b, NULL, syscall_names[sc]); } else { - ERROR("no name found for syscall(%d)\n", i); + ERROR("no name found for syscall(%d)\n", sc); } } blobmsg_close_array(&b, c); @@ -177,7 +197,7 @@ int main(int argc, char **argv, char **envp) char **_argv = calloc(argc + 1, sizeof(char *)); char **_envp; char *preload = "LD_PRELOAD=/lib/libpreload-trace.so"; - int envc = 1; + int envc = 0; int ret; memcpy(_argv, argv, argc * sizeof(char *)); @@ -185,11 +205,11 @@ int main(int argc, char **argv, char **envp) while (envp[envc++]) ; - _envp = calloc(envc, sizeof(char *)); - memcpy(&_envp[1], _envp, envc * sizeof(char *)); - *envp = preload; + _envp = calloc(envc + 1, sizeof(char *)); + memcpy(&_envp[1], envp, envc * sizeof(char *)); + *_envp = preload; - ret = execve(_argv[0], _argv, envp); + ret = execve(_argv[0], _argv, _envp); ERROR("failed to exec %s: %s\n", _argv[0], strerror(errno)); free(_argv);