]> granicus.if.org Git - procps-ng/commitdiff
Added support for vmflags in pmap
authorWilliam Orr <will@worrbase.com>
Wed, 23 Jan 2013 03:46:24 +0000 (22:46 -0500)
committerWilliam Orr <will@worrbase.com>
Wed, 23 Jan 2013 03:46:24 +0000 (22:46 -0500)
pmap.c

diff --git a/pmap.c b/pmap.c
index e1773457d7720fad8f604cdd3413af6065ae8810..4c92a5077b072a42bce796031f15d5a199f65458 100644 (file)
--- a/pmap.c
+++ b/pmap.c
@@ -172,6 +172,8 @@ static char *mapping_name(proc_t * p, unsigned KLONG addr,
 #define DETL "31"              /* for format strings */
 #define NUM_LENGTH 21          /* python says: len(str(2**64)) == 20 */
 #define NUML "20"              /* for format strings */
+#define VMFLAGS_LENGTH 81 /* There are 27 posible 2 character vmflags 
+                                                               as of this patch */
 
 struct listnode {
        char description[DETAIL_LENGTH];
@@ -204,12 +206,14 @@ static void print_extended_maps (FILE *f)
             detail_desc[DETAIL_LENGTH], value_str[NUM_LENGTH],
             start[NUM_LENGTH], end[NUM_LENGTH],
             offset[NUM_LENGTH], inode[NUM_LENGTH],
-            dev[64], fmt_str[64];
-       int maxw1=0, maxw2=0, maxw3=0, maxw4=0, maxw5=0;
+            dev[64], fmt_str[64],
+                vmflags[VMFLAGS_LENGTH];
+       int maxw1=0, maxw2=0, maxw3=0, maxw4=0, maxw5=0, maxwv=0;
        int nfields, firstmapping, footer_gap, i;
        unsigned KLONG value;
        char *ret;
        char c;
+       char has_vmflags = 0;
 
        ret = fgets(mapbuf, sizeof mapbuf, f);
        firstmapping = 1;
@@ -284,6 +288,15 @@ loop_end:
                        nfields = sscanf(mapbuf, "%"DETL"[^:]: %"NUML"[0-9] kB %c",
                                         detail_desc, value_str, &c);
                }
+
+               /* === GET VMFLAGS === */
+               nfields = sscanf(mapbuf, "VmFlags: %[a-z ]", vmflags);
+               if (nfields == 1) {
+                       if (! has_vmflags) has_vmflags = 1;
+                       ret = fgets(mapbuf, sizeof mapbuf, f);
+                       if (strlen(vmflags) > maxwv) maxwv = strlen(vmflags);
+               }
+
                /* === PRINT THIS MAPPING === */
                /* Print header */
                if (firstmapping && !q_option) {
@@ -292,6 +305,7 @@ loop_end:
                        if (strlen("Offset") > maxw3)   maxw3 = strlen("Offset");
                        if (strlen("Device") > maxw4)   maxw4 = strlen("Device");
                        if (strlen("Inode") > maxw5)    maxw5 = strlen("Inode");
+                       if (has_vmflags && strlen("VmFlags") > maxwv)   maxwv = strlen("VmFlags");
                        sprintf(fmt_str, "%%%ds %%%ds %%%ds %%%ds %%%ds",
                                maxw1, maxw2, maxw3, maxw4, maxw5);
                        printf(fmt_str, "Address", "Flags", "Offset", "Device", "Inode");
@@ -301,6 +315,12 @@ loop_end:
                                sprintf(fmt_str, " %%%ds", listnode->max_width);
                                printf(fmt_str, listnode->description);
                        }
+
+                       if (has_vmflags) {
+                               sprintf(fmt_str, " %%%ds", maxwv);
+                               printf(fmt_str, "VmFlags");
+                       }
+
                        printf(" %s\n", "Description");
                }
                /* Print data */
@@ -313,6 +333,12 @@ loop_end:
                        sprintf(fmt_str, " %%%ds", listnode->max_width);
                        printf(fmt_str, listnode->value_str);
                }
+
+               if (has_vmflags) {
+                       sprintf(fmt_str, " %%%ds", maxwv);
+                       printf(fmt_str, vmflags);
+               }
+
                printf(" %s\n", map_desc);
 
                firstmapping = 0;