/* Extracts a tar archive from a tape in SIMH format */ #include #include #include #include int main(int argc, char **argv) { int f1, f2, n, recbytes, rootlen; int err = 0; char tapefile[512], tarfile[512]; char buf[512], *p; if (argc < 2) { fprintf(stderr, "usage: extar []\n"); exit(0); } strcpy(tapefile, argv[1]); if (argc > 2) strcpy(tarfile, argv[2]); else { p = strchr(tapefile, '.'); if (! p) rootlen = strlen(tapefile); else rootlen = p - tapefile; memset(tarfile, 0, 512); strncpy(tarfile, tapefile, rootlen); strcat(tarfile, ".tar"); } if ((f1 = open(tapefile, O_RDONLY)) == -1) { perror("open"); exit(1); } if ((f2 = open(tarfile, O_CREAT | O_WRONLY)) == -1) { perror("open"); exit(1); } fchmod(f2, 0666); while (1) { if ((n = read(f1, &recbytes, 4)) == 0) break; if (n == -1) { perror("read"); err++; break; } if (n != sizeof(recbytes)) { fprintf(stderr, "Error: read too few bytes\n"); err++; break; } if ((n = read(f1, buf, recbytes)) == -1) { perror("read"); err++; break; } if ((n != 0) && (n != sizeof(buf))) { fprintf(stderr, "Error: read too few bytes\n"); err++; break; } if ((n = read(f1, &recbytes, 4)) == -1) { perror("read"); err++; break; } if (n != sizeof(recbytes)) { fprintf(stderr, "Error: read too few bytes\n"); err++; break; } if ((write(f2, buf, recbytes)) == -1) { perror("write"); err++; break; } } close(f1); close(f2); if (err) { unlink(tarfile); exit(1); } exit(0); } .