/* * vma-merge-test.c --- count # entries in /proc//maps as well as * indication of mergability (is that a word?) * * technically this is buggy --- pass the paper bag :) * * cw@f00f.org, 6 Aug 2001 * */ #include #include int main(int argc, char *argv[]) { FILE *f; char linebuf[128]; long st, en, len, dunno; long pen = 0, ms = 0; char flags[32], indev[32], path[256]; char pflags[32], pindev[32]; int cu = 0, cm = 0, mc = 0; if(argc != 2) { fprintf(stderr, "Please supply one argument, the 'maps' file\n"); return 1; } if(!(f = fopen(argv[1],"r"))) { fprintf(stderr, "error (%s) trying to open '%s'\n", strerror(errno), argv[1]); return 2; } pflags[0] = '\000'; pindev[0] = '\000'; while(!feof(f)) { if(!fgets(linebuf, sizeof linebuf, f)) break; if(sscanf(linebuf, "%lx-%lx %s %8lx %s %ld %s\n", &st, &en, flags, &len, indev, &dunno, path) < 5) { fprintf(stderr, "Bad line\n\t%s\nAborting\n", linebuf); break; } cu++; /* same as previous mapping and adjacent, then merge is possible */ if(!strcmp(indev, pindev) && !strcmp(flags, pflags) && (st == pen)) { cm++; mc++; } else { if(mc) { /* show merged results */ printf("%08lx-%08lx %s %s (%d)\n", ms, pen, flags, indev, mc); } /* show these results */ printf("%08lx-%08lx %s %s\n", st, en, flags, indev); strcpy(pindev, indev); strcpy(pflags, flags); ms = st; mc = 0; } pen = en; } printf("\n%d entries, %d merges\n", cu, cm); printf("%d with merging, %4.1f%% of original\n", cu - cm, (double)(100.0 * (cu - cm) / cu)); fclose(f); return 0; }