diff options
author | Colin Cross <ccross@android.com> | 2013-05-22 15:03:52 -0700 |
---|---|---|
committer | Colin Cross <ccross@google.com> | 2013-06-11 00:45:23 +0000 |
commit | 72f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4 (patch) | |
tree | 7da15c7aaadd2637d098487e6348a24602a861bc /librank | |
parent | d11471ca09827ff15912044e1ba69e3eedd69b15 (diff) | |
download | extras-72f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4.tar.gz |
librank: add permissions command line argument
Add a command line argument to only list pages with the given
permissions.
Change-Id: I884eedea607b250ac721e7fdac555992c435441f
Diffstat (limited to 'librank')
-rw-r--r-- | librank/librank.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/librank/librank.c b/librank/librank.c index bc6991c4..ef115b13 100644 --- a/librank/librank.c +++ b/librank/librank.c @@ -163,6 +163,30 @@ struct process_info *get_process(pid_t pid) { return process; } +static int parse_perm(const char *perm) +{ + int ret = 0; + + while (*perm) { + switch(*perm) { + case 'r': + ret |= PM_MAP_READ; + break; + case 'w': + ret |= PM_MAP_WRITE; + break; + case 'x': + ret |= PM_MAP_EXEC; + break; + default: + fprintf(stderr, "Unknown permission '%c'\n", *perm); + exit(EXIT_FAILURE); + } + perm++; + } + return ret; +} + int main(int argc, char *argv[]) { char cmdline[256]; char *prefix; @@ -184,6 +208,7 @@ int main(int argc, char *argv[]) { struct process_info *pi; int i, j, error; + int perm; signal(SIGPIPE, SIG_IGN); compfn = &sort_by_pss; @@ -191,6 +216,7 @@ int main(int argc, char *argv[]) { prefix = NULL; prefix_len = 0; opterr = 0; + perm = 0; while (1) { int c; @@ -202,9 +228,10 @@ int main(int argc, char *argv[]) { {"rss", 0, 0, 'r'}, {"reverse", 0, 0, 'R'}, {"path", required_argument, 0, 'P'}, + {"perm", required_argument, 0, 'm'}, {0, 0, 0, 0} }; - c = getopt_long(argc, argv, "hpP:uvrR", longopts, NULL); + c = getopt_long(argc, argv, "hm:pP:uvrR", longopts, NULL); if (c < 0) { break; } @@ -213,6 +240,9 @@ int main(int argc, char *argv[]) { case 'h': usage(argv[0]); exit(EXIT_SUCCESS); + case 'm': + perm = parse_perm(optarg); + break; case 'p': compfn = &sort_by_pss; break; @@ -279,6 +309,9 @@ int main(int argc, char *argv[]) { if (prefix && (strncmp(pm_map_name(maps[j]), prefix, prefix_len))) continue; + if (perm && (pm_map_flags(maps[j]) & PM_MAP_PERMISSIONS) != perm) + continue; + li = get_library(pm_map_name(maps[j])); if (!li) continue; @@ -339,6 +372,7 @@ static void usage(char *myname) { " (Default sort order is PSS.)\n" " -P /path Limit libraries displayed to those in path.\n" " -R Reverse sort order (default is descending).\n" + " -m [r][w][x] Only list pages that exactly match permissions\n" " -h Display this help screen.\n", myname); } |