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