#include #include #include #include #include #include #include #include #include #define PAGEPROT PROT_READ|PROT_WRITE #define MAPFLAGS MAP_PRIVATE|MAP_ANONYMOUS static int syspagesize = 0, pagemask, offmask, error_cnt = 0; void sigsegv(int unused) { _exit(0); } caddr_t femmap(int fd, off_t foff, size_t syz, int prot, u_char *msg) { /* femmap() and femunmap() take care of the need to allocate on page boundaries and in multiples of pages. */ off_t pfoff; /* foff on a page boundary */ size_t psyz; /* syz rounded up to full pages */ int chopped; caddr_t rslt; if (syspagesize == 0) { syspagesize = getpagesize(); offmask = syspagesize - 1; pagemask = ~offmask; if (1) printf("--- Syspagesize %d, pagemask %X, offmask %X\n", syspagesize, pagemask, offmask); } printf("foff is %d\n", foff); printf("--- Syspagesize %d, pagemask %X, offmask %X\n", syspagesize, pagemask, offmask); pfoff = foff & pagemask; printf("pfoff is %d\n", pfoff); chopped = foff & offmask; psyz = (syz + chopped + syspagesize - 1) & pagemask; printf("**** Vars just before mmap call ****\n"); printf("psyz = %d\nprot = %d\nfd = %d\npfoff = %d\n", psyz, prot, fd, (int)pfoff); if ((rslt = mmap(0, psyz, prot, MAP_SHARED, fd, pfoff)) ==MAP_FAILED) { /* if ((rslt = mmap(0, psyz, prot, MAP_SHARED, fd, 0)) ==MAP_FAILED) { */ printf("perror reports errno of %d\n", errno); printf(" Mapping %d at %X <---> %d (%s\n", psyz, (int)rslt, (int)pfoff, msg); error_cnt++; exit(1); } if (1) printf(" Mapping %d at %X <---> %d (%s\n", psyz, (int)rslt, (int)pfoff, msg); return (rslt + chopped); /* return (rslt + chopped + pfoff); */ } int main(int argc, char **argv) { int fh; off_t foff; size_t syz; int prot; u_char *msg; int i; off_t size; u_char *result = NULL; struct stat finfo; foff = atoi(argv[1]); printf("Offset is %d\n", foff); for (i=2; i