summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2013-05-22 15:03:52 -0700
committerColin Cross <ccross@google.com>2013-06-11 00:45:23 +0000
commit72f75f0b12ca23cf91ecfcb945ee42a0e1da9fd4 (patch)
tree7da15c7aaadd2637d098487e6348a24602a861bc
parentd11471ca09827ff15912044e1ba69e3eedd69b15 (diff)
downloadextras-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
-rw-r--r--librank/librank.c36
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);
}