#include #define BLKSIZ 512 char ibuf[BLKSIZ]; int blksiz = BLKSIZ; int dbgflg = 0; /* Debug; print entry and value */ int main(argc, argv) int argc; char *argv[]; { char *arg; char *ifnm, *ofnm; register FILE *in, *out; int blkno, nblks, lstblk, cblk; int maxblk, eblksz; long size; if ((argc < 5) || (argc > 6)) { printf("\nblkex {-d} \n"); exit(1); } argv++; argc--; for (;;) { arg = *argv; if (*arg++ != '-') break; argv++; argc--; switch (*arg) { case 'd': dbgflg++; printf("\n"); break; default: printf("Bad flag: %c", *arg); exit(1); } } ifnm = *argv++; argc--; in = fopen(ifnm, "rb"); if (in == NULL) { printf("Error opening input file: '%s'\n", ifnm); exit(1); } ofnm = *argv++; argc--; out = fopen(ofnm, "wb"); if (out == NULL) { printf("Error opening output file: '%s'\n", ofnm); exit(1); } arg = *argv++; argc--; blkno = atoi(arg); if (blkno < 0) { printf("Bad block number: %d\n", blkno); exit(1); } arg = *argv++; argc--; nblks = atoi(arg); if (nblks < 0) { printf("Bad transfer size: %d\n", nblks); exit(1); } lstblk = (blkno + nblks); if (argc > 0) { printf("Unneeded extra arg '%s'", *argv); exit(1); } if (fseek(in, 0, SEEK_END) != 0) { printf("Size seek failed\n"); exit(1); } size = ftell(in); maxblk = (size / BLKSIZ); eblksz = (size - (maxblk * BLKSIZ)); printf("\nStart/End Block: %d %d\n", blkno, lstblk); printf("Size: %ld %d %d\n", size, eblksz, maxblk); if ((blkno + nblks) > maxblk) { printf("Block number/size too large\n"); exit(1); } if (fseek(in, (blkno * BLKSIZ), SEEK_SET) != 0) { printf("Read seek failed\n"); exit(1); } for (cblk = blkno; (cblk < lstblk); cblk++) { if (cblk == maxblk) blksiz = eblksz; if (fread(&ibuf[0], sizeof(char), blksiz, in) != blksiz) { printf("Read failed: block %d\n", cblk); exit(1); } if (fwrite(&ibuf[0], sizeof(char), blksiz, out) != blksiz) { printf("Write failed: block %d\n", cblk); exit(1); } } fclose(in); fclose(out); printf("%d blocks read\n", (cblk - blkno)); }