forked from RetroBSD/2.11BSD
-
Notifications
You must be signed in to change notification settings - Fork 0
/
maketape.c
103 lines (94 loc) · 2.12 KB
/
maketape.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)maketape.c 1.1 (2.10BSD Berkeley) 12/1/86
* (2.11BSD Contel) 4/20/91
* TU81s didn't like open/close/write at 1600bpi, use
* ioctl to write tape marks instead.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mtio.h>
#define MAXB 30
extern int errno;
char buf[MAXB * 512];
char name[50];
struct mtop mtio;
int blksz, recsz;
int mt;
int fd;
int cnt;
main(argc, argv)
int argc;
char *argv[];
{
register int i, j = 0, k = 0;
FILE *mf;
if (argc != 3) {
fprintf(stderr, "usage: maketape tapedrive makefile\n");
exit(1);
}
if ((mt = creat(argv[1], 0666)) < 0) {
perror(argv[1]);
exit(1);
}
if ((mf = fopen(argv[2], "r")) == NULL) {
perror(argv[2]);
exit(1);
}
for (;;) {
if ((i = fscanf(mf, "%s %d", name, &blksz))== EOF)
exit(0);
if (i != 2) {
fprintf(stderr, "Help! Scanf didn't read 2 things (%d)\n", i);
exit(1);
}
if (blksz <= 0 || blksz > MAXB) {
fprintf(stderr, "Block size %d is invalid\n", blksz);
exit(1);
}
recsz = blksz * 512; /* convert to bytes */
if (strcmp(name, "*") == 0) {
mtio.mt_op = MTWEOF;
mtio.mt_count = 1;
if (ioctl(mt, MTIOCTOP, &mtio) < 0)
fprintf(stderr, "MTIOCTOP err: %d\n", errno);
k++;
continue;
}
fd = open(name, 0);
if (fd < 0) {
perror(name);
exit(1);
}
printf("%s: block %d, file %d\n", name, j, k);
/*
* wfj fix to final block output.
* we pad the last record with nulls
* (instead of the bell std. of padding with trash).
* this allows you to access text files on the
* tape without garbage at the end of the file.
* (note that there is no record length associated
* with tape files)
*/
while ((cnt=read(fd, buf, recsz)) == recsz) {
j++;
if (write(mt, buf, cnt) < 0) {
perror(argv[1]);
exit(1);
}
}
if (cnt>0) {
j++;
bzero(buf + cnt, recsz - cnt);
if (write(mt, buf, recsz) < 0) {
perror(argv[1]);
exit(1);
}
}
close(fd);
}
}