int msync_f( int argc, char **argv) { off64_t offset; ssize_t length; void *start; int c, flags = 0; size_t blocksize, sectsize; while ((c = getopt(argc, argv, "ais")) != EOF) { switch (c) { case 'a': flags |= MS_ASYNC; break; case 'i': flags |= MS_INVALIDATE; break; case 's': flags |= MS_SYNC; break; default: return command_usage(&msync_cmd); } } if (optind == argc) { offset = mapping->offset; length = mapping->length; } else if (optind == argc - 2) { init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); return 0; } optind++; length = cvtnum(blocksize, sectsize, argv[optind]); if (length < 0) { printf(_("non-numeric length argument -- %s\n"), argv[optind]); return 0; } } else { return command_usage(&msync_cmd); } start = check_mapping_range(mapping, offset, length, 1); if (!start) return 0; if (msync(start, length, flags) < 0) perror("msync"); return 0; }
int madvise_f( int argc, char **argv) { off64_t offset, llength; size_t length; void *start; int advise = MADV_NORMAL, c; size_t blocksize, sectsize; while ((c = getopt(argc, argv, "drsw")) != EOF) { switch (c) { case 'd': /* Don't need these pages */ advise = MADV_DONTNEED; break; case 'r': /* Expect random page references */ advise = MADV_RANDOM; break; case 's': /* Expect sequential page references */ advise = MADV_SEQUENTIAL; break; case 'w': /* Will need these pages */ advise = MADV_WILLNEED; break; default: return command_usage(&madvise_cmd); } } if (optind == argc) { offset = mapping->offset; length = mapping->length; } else if (optind == argc - 2) { init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); return 0; } optind++; llength = cvtnum(blocksize, sectsize, argv[optind]); if (llength < 0) { printf(_("non-numeric length argument -- %s\n"), argv[optind]); return 0; } else if (llength > (size_t)llength) { printf(_("length argument too large -- %lld\n"), (long long)llength); return 0; } else length = (size_t)llength; } else { return command_usage(&madvise_cmd); } start = check_mapping_range(mapping, offset, length, 1); if (!start) return 0; if (madvise(start, length, advise) < 0) { perror("madvise"); return 0; } return 0; }
int mincore_f( int argc, char **argv) { off64_t offset, llength; size_t length; size_t blocksize, sectsize; void *start; void *current, *previous; unsigned char *vec; int i; if (argc == 1) { offset = mapping->offset; length = mapping->length; } else if (argc == 3) { init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[1]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[1]); return 0; } llength = cvtnum(blocksize, sectsize, argv[2]); if (llength < 0) { printf(_("non-numeric length argument -- %s\n"), argv[2]); return 0; } else if (llength > (size_t)llength) { printf(_("length argument too large -- %lld\n"), (long long)llength); return 0; } else length = (size_t)llength; } else { return command_usage(&mincore_cmd); } start = check_mapping_range(mapping, offset, length, 1); if (!start) return 0; vec = calloc(length/pagesize, sizeof(unsigned char)); if (!vec) { perror("calloc"); return 0; } if (mincore(start, length, vec) < 0) { perror("mincore"); free(vec); return 0; } previous = NULL; current = start; for (i = 0; i < length/pagesize; i++, current += pagesize) { if (vec[i]) { if (!previous) { /* print start address */ printf("0x%lx - ", (unsigned long)current); previous = start + (i * pagesize); } } else if (previous) { /* print end and page count */ printf(_("0x%lx %lu pages (%llu : %lu)\n"), (unsigned long)current, (unsigned long)(current - previous) / pagesize, (unsigned long long)offset + (unsigned long long)(previous - start), (unsigned long)(current - previous)); previous = NULL; } } if (previous) printf(_("0x%lx %lu pages (%llu : %lu)\n"), (unsigned long)current, (unsigned long)(current - previous) / pagesize, (unsigned long long)offset + (unsigned long long)(previous - start), (unsigned long)(current - previous)); free(vec); return 0; }
int mwrite_f( int argc, char **argv) { off64_t offset, tmp; ssize_t length; void *start; char *sp; int seed = 'X'; int rflag = 0; int c; size_t blocksize, sectsize; while ((c = getopt(argc, argv, "rS:")) != EOF) { switch (c) { case 'r': rflag = 1; break; case 'S': seed = (int)strtol(optarg, &sp, 0); if (!sp || sp == optarg) { printf(_("non-numeric seed -- %s\n"), optarg); return 0; } break; default: return command_usage(&mwrite_cmd); } } if (optind == argc) { offset = mapping->offset; length = mapping->length; } else if (optind == argc - 2) { init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); return 0; } optind++; length = cvtnum(blocksize, sectsize, argv[optind]); if (length < 0) { printf(_("non-numeric length argument -- %s\n"), argv[optind]); return 0; } } else { return command_usage(&mwrite_cmd); } start = check_mapping_range(mapping, offset, length, 0); if (!start) return 0; offset -= mapping->offset; if (rflag) { for (tmp = offset + length -1; tmp >= offset; tmp--) ((char *)mapping->addr)[tmp] = seed; } else { for (tmp = offset; tmp < offset + length; tmp++) ((char *)mapping->addr)[tmp] = seed; } return 0; }
int mread_f( int argc, char **argv) { off64_t offset, tmp, dumpoffset, printoffset; ssize_t length; size_t dumplen, cnt = 0; char *bp; void *start; int dump = 0, rflag = 0, c; size_t blocksize, sectsize; while ((c = getopt(argc, argv, "frv")) != EOF) { switch (c) { case 'f': dump = 2; /* file offset dump */ break; case 'r': rflag = 1; /* read in reverse */ break; case 'v': dump = 1; /* mapping offset dump */ break; default: return command_usage(&mread_cmd); } } if (optind == argc) { offset = mapping->offset; length = mapping->length; } else if (optind == argc - 2) { init_cvtnum(&blocksize, §size); offset = cvtnum(blocksize, sectsize, argv[optind]); if (offset < 0) { printf(_("non-numeric offset argument -- %s\n"), argv[optind]); return 0; } optind++; length = cvtnum(blocksize, sectsize, argv[optind]); if (length < 0) { printf(_("non-numeric length argument -- %s\n"), argv[optind]); return 0; } } else { return command_usage(&mread_cmd); } start = check_mapping_range(mapping, offset, length, 0); if (!start) return 0; dumpoffset = offset - mapping->offset; if (dump == 2) printoffset = offset; else printoffset = dumpoffset; if (alloc_buffer(pagesize, 0, 0) < 0) return 0; bp = (char *)buffer; dumplen = length % pagesize; if (!dumplen) dumplen = pagesize; if (rflag) { for (tmp = length - 1, c = 0; tmp >= 0; tmp--, c = 1) { *bp = *(((char *)mapping->addr) + dumpoffset + tmp); cnt++; if (c && cnt == dumplen) { if (dump) { dump_buffer(printoffset, dumplen); printoffset += dumplen; } bp = (char *)buffer; dumplen = pagesize; cnt = 0; } else { bp++; } } } else { for (tmp = 0, c = 0; tmp < length; tmp++, c = 1) { *bp = *(((char *)mapping->addr) + dumpoffset + tmp); cnt++; if (c && cnt == dumplen) { if (dump) dump_buffer(printoffset + tmp - (dumplen - 1), dumplen); bp = (char *)buffer; dumplen = pagesize; cnt = 0; } else { bp++; } } } return 0; }