-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpart02
More file actions
1041 lines (989 loc) · 32.9 KB
/
part02
File metadata and controls
1041 lines (989 loc) · 32.9 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Subject: v08i100: ANSI tape program, Part02/02
Newsgroups: mod.sources
Approved: mirror!rs
Submitted by: David S. Hayes <sundc!hqda-ai!merlin>
Mod.sources: Volume 8, Issue 100
Archive-name: ansitape/Part02
This is the second part of Ansitape. It contains the makefile,
the manual pages, and miscellaneous small files. The program itself is
contained in the first message.
[ I left this in its original wrapper because it wouldn't fit in
one piece, so I didn't tamper... --r$ ]
#!/bin/sh
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# Makefile ansitape.h tables.c ansitape.1 ansitape.5.tbl
echo x - Makefile
cat > "Makefile" << '//E*O*F Makefile//'
# Makefile for ANSITAPE
#
# This program creates, reads, writes, and takes directory listings of
# ANSI-formatted tapes.
#
# This program was developed at
#
# HQDA Army Artificial Intelligence Center
# Pentagon Attn: DACS-DMA
# Washington, DC 20310-0200
#
# Phone: (202) 694-6900
# E-mail:
# Arpa: merlin%[email protected]
# alternate [email protected]
# UUCP: ...!seismo!sundc!hqda-ai!merlin
#
# Support? You want support? What do I look like, a software house?
# Mail me your gripes, comments, and bugs, and I'll try to keep
# up with them.
#
# THIS PROGRAM IS IN THE PUBLIC DOMAIN.
# Define AT MOST ONE of the following
# Define this if you want debugging.
#CCOPT = -g
# Define this if you want compiler optimizations.
CCOPT = -O
# Define this if you want to handle IBM EBCDIC tapes.
IBM = -DEBCDIC
# Define this to be the maximum size of a file you are willing to
# read to determine the record length. Files smaller than this
# are read twice: once to find the max record length, and the second
# time when writing the tape. Files larger than this just assume
# that the recordlength == blocklength. Probably not a great
# assumption, but we have to assume something.
#
# If this is not defined, the ansitape.c uses 100K by default.
#READMAX = 100000
# This is the directory where ansitape will go.
BIN = /usr/local/bin
# This is the directory where you put your
# unformatted manual pages for commands.
CMDMAN = /usr/man/man1
# This is the directory where you put your
# unformatted manual pages for file formats.
FILEMAN = /usr/man/man5
# This is the directory where you put your
# FORMATTED manual pages for file formats.
# Define this to be /tmp if you don't keep
# formatted copies of the file format manual pages.
# Cron should clean it out eventually.
FILECAT = /usr/man/cat5
all: ansitape man
ansitape: ansitape.c ansitape.h tables.o
cc ${CCOPT} -o ansitape ${IBM} ${READMAX} ansitape.c tables.o
mv ansitape ${BIN}
tables.o: tables.c
man: man1 man5
man1: ansitape.1
cp ansitape.1 ${CMDMAN}
man5: ansitape.5.tbl
tbl ansitape.5.tbl > ${FILEMAN}/ansitape.5
tbl ansitape.5.tbl | nroff -man | colcrt > ${FILECAT}/ansitape.5
//E*O*F Makefile//
echo x - ansitape.h
cat > "ansitape.h" << '//E*O*F ansitape.h//'
/*
* This file contains the definitions of the tape control records. This
* is to be used when developing a program to work with ANSI standard
* labelled tapes.
*/
/*
* Actually, these should be upper case. The ansitape program doesn't
* convert things to upper case until the headers are made -- the tape
* control block has everything in lower case. For the sake of easy
* comparisons, we define them here as lower case.
*/
#define NOPROTECT ' ' /* space if no protection */
#define REC_FIXED 'f' /* Records are all fixed length */
#define REC_VARIABLE 'd' /* Records are preceeded by a 4-digit
* zero-filled count of their length,
* including the 4 digits themselves */
#define IBM_VARIABLE 'v' /* IBM's version of ANSI D format */
#define CC_FORTRAN 'a' /* First char of rec is f-77 carriage
* control */
#define CC_EMBEDDED 'm' /* Carriage control is part of the data
* contained in each record */
#define CC_IMPLIED ' ' /* Each record goes on a separate line
* when printed */
/*
* VOLUME 1 Describes the owner of and access to the volume.
*/
struct ansi_vol1 {
char header[4]; /* VOL1 */
char label[6]; /* volume name, A-Z0-9 */
char access; /* access code */
char __ignored1[20]; /* reserved, space fill */
char __ignored2[6]; /* reserved, space fill */
char owner[14]; /* user name */
char __ignored3[28]; /* reserved, space fill */
char ansi_level; /* ansi standard level, always 3 */
};
/*
* VOLUME 2 optional, ignored by this software.
*/
/*
* HEADER 1 Begins basic description of a tape file.
*/
struct ansi_hdr1 {
char header[4]; /* HDR1 */
char name[17]; /* rightmost 17 characters of filename */
char fileset[6]; /* should be same as volume id of 1st
* tape */
char volume_num[4]; /* number of volume in set */
char file_num[4];/* number of file on tape */
char gen[4]; /* generation number */
char genver[2]; /* generation version number */
char created[6]; /* date of creation, "bYYDDD" */
char expires[6]; /* expiration date "bYYDDD" */
char access; /* protection, space = unprotected */
char blockcount[6]; /* zero in header */
char tapesys[13];/* name of software creating tape */
char __ignored[7]; /* reserved, space fill */
};
/*
* HEADER 2 Record format, record size, block size.
*/
struct ansi_hdr2 {
char header[4]; /* HDR2 */
char recfmt; /* record format */
char blocklen[5];/* file tape block length */
char reclen[5]; /* file logical record length */
char density; /* density/recording mode. Should be 2
* for 800 bpi, 3 for 1600 bpi. */
char vol_switch; /* 0, or 1 if this file was continued */
char job[17]; /* job name (8), /, job step (8) of
* creator */
char recording[2]; /* parity/conversion, space
* fill */
char carriage_control;
char alignment; /* reserved, space fill */
char blocked_records; /* 'B' if records are blocked */
char __ignored2[11];
char block_offset[2]; /* ingore 1st n char of each
* block */
char __ignored3[28];
};
/*
* HEADER 3 This contains a bunch of rms-dependent data. We will
* ignore it for now, and hope that it doesnt screw up VMS too badly.
*/
struct ansi_hdr3 {
char header[4]; /* HDR3 */
char os_reserved[76]; /* reserved to OS, space fill */
};
/*
* HEADER 4 This is the rest of the filename if its longer than 17
* characters. We should have no trouble fitting UNIX filenames into
* this.
*/
struct ansi_hdr4 {
char header[4]; /* HDR4 */
char name2[63]; /* leftmost char, if name is more than
* 17 characters long. */
char unknown[2]; /* fill with 00 */
char __ignored[11];
};
/*
* FORMAT NOTES
*
* 1. The tape always starts with a VOL1 record. Other volume records
* are optional. We ignore them, and do not generate them on output.
*
* 2. Each file starts with a set of HDRn records. The headers are
* followed by a tape mark.
*
* 3. The data is written to the tape in fixed-length blocks. Valid ANSI
* block lengths are 18 to 2048 bytes, although VMS will support longer
* blocks. The block does not have to be full. If the block is not
* completely filled, the remainder of the block is padded with
* circumflex (^) characters. The file is followed by a tape mark.
*
* 4. Trailing records are written. Either EOF or EOV records may be
* used. The record formats are the same as the HDR records, expect:
*
* a. the "HDR" is replaced by "EOF" or "EOV".
*
* b. the blockcount field in EOF1/EOV1 contains the actual number of
* physical tape blocks written in the preceding file section. In the
* HDR1 record, the blockcount is 000000.
*
* 5. A tape file may extend across a volume boundary. If it does, EOV
* labels are used, indicating that another tape must be read. If the
* file ends here, an EOF label is used.
*
* 6. After the EOF records, a tape mark is written. This separates the
* trailers from the headers for the next file. At the end of the
* tape, two tape marks are written.
*/
//E*O*F ansitape.h//
echo x - tables.c
cat > "tables.c" << '//E*O*F tables.c//'
/* Mapping of EBCDIC codes to ASCII equivalents. */
static char to_ascii_table[256] = {
'\000', '\001', '\002', '\003',
'\234', '\011', '\206', '\177',
'\227', '\215', '\216', '\013',
'\014', '\015', '\016', '\017',
'\020', '\021', '\022', '\023',
'\235', '\205', '\010', '\207',
'\030', '\031', '\222', '\217',
'\034', '\035', '\036', '\037',
'\200', '\201', '\202', '\203',
'\204', '\012', '\027', '\033',
'\210', '\211', '\212', '\213',
'\214', '\005', '\006', '\007',
'\220', '\221', '\026', '\223',
'\224', '\225', '\226', '\004',
'\230', '\231', '\232', '\233',
'\024', '\025', '\236', '\032',
'\040', '\240', '\241', '\242',
'\243', '\244', '\245', '\246',
'\247', '\250', '\133', '\056',
'\074', '\050', '\053', '\041',
'\046', '\251', '\252', '\253',
'\254', '\255', '\256', '\257',
'\260', '\261', '\135', '\044',
'\052', '\051', '\073', '\136',
'\055', '\057', '\262', '\263',
'\264', '\265', '\266', '\267',
'\270', '\271', '\174', '\054',
'\045', '\137', '\076', '\077',
'\272', '\273', '\274', '\275',
'\276', '\277', '\300', '\301',
'\302', '\140', '\072', '\043',
'\100', '\047', '\075', '\042',
'\303', '\141', '\142', '\143',
'\144', '\145', '\146', '\147',
'\150', '\151', '\304', '\305',
'\306', '\307', '\310', '\311',
'\312', '\152', '\153', '\154',
'\155', '\156', '\157', '\160',
'\161', '\162', '\313', '\314',
'\315', '\316', '\317', '\320',
'\321', '\176', '\163', '\164',
'\165', '\166', '\167', '\170',
'\171', '\172', '\322', '\323',
'\324', '\325', '\326', '\327',
'\330', '\331', '\332', '\333',
'\334', '\335', '\336', '\337',
'\340', '\341', '\342', '\343',
'\344', '\345', '\346', '\347',
'\173', '\101', '\102', '\103',
'\104', '\105', '\106', '\107',
'\110', '\111', '\350', '\351',
'\352', '\353', '\354', '\355',
'\175', '\112', '\113', '\114',
'\115', '\116', '\117', '\120',
'\121', '\122', '\356', '\357',
'\360', '\361', '\362', '\363',
'\134', '\237', '\123', '\124',
'\125', '\126', '\127', '\130',
'\131', '\132', '\364', '\365',
'\366', '\367', '\370', '\371',
'\060', '\061', '\062', '\063',
'\064', '\065', '\066', '\067',
'\070', '\071', '\372', '\373',
'\374', '\375', '\376', '\377'
};
/* Mapping of ASCII codes to EBCDIC equivalents. */
static char to_ebcdic_table[256] = {
'\000', '\001', '\002', '\003',
'\067', '\055', '\056', '\057',
'\026', '\005', '\045', '\013',
'\014', '\015', '\016', '\017',
'\020', '\021', '\022', '\023',
'\074', '\075', '\062', '\046',
'\030', '\031', '\077', '\047',
'\034', '\035', '\036', '\037',
'\100', '\117', '\177', '\173',
'\133', '\154', '\120', '\175',
'\115', '\135', '\134', '\116',
'\153', '\140', '\113', '\141',
'\360', '\361', '\362', '\363',
'\364', '\365', '\366', '\367',
'\370', '\371', '\172', '\136',
'\114', '\176', '\156', '\157',
'\174', '\301', '\302', '\303',
'\304', '\305', '\306', '\307',
'\310', '\311', '\321', '\322',
'\323', '\324', '\325', '\326',
'\327', '\330', '\331', '\342',
'\343', '\344', '\345', '\346',
'\347', '\350', '\351', '\112',
'\340', '\132', '\137', '\155',
'\171', '\201', '\202', '\203',
'\204', '\205', '\206', '\207',
'\210', '\211', '\221', '\222',
'\223', '\224', '\225', '\226',
'\227', '\230', '\231', '\242',
'\243', '\244', '\245', '\246',
'\247', '\250', '\251', '\300',
'\152', '\320', '\241', '\007',
'\040', '\041', '\042', '\043',
'\044', '\025', '\006', '\027',
'\050', '\051', '\052', '\053',
'\054', '\011', '\012', '\033',
'\060', '\061', '\032', '\063',
'\064', '\065', '\066', '\010',
'\070', '\071', '\072', '\073',
'\004', '\024', '\076', '\341',
'\101', '\102', '\103', '\104',
'\105', '\106', '\107', '\110',
'\111', '\121', '\122', '\123',
'\124', '\125', '\126', '\127',
'\130', '\131', '\142', '\143',
'\144', '\145', '\146', '\147',
'\150', '\151', '\160', '\161',
'\162', '\163', '\164', '\165',
'\166', '\167', '\170', '\200',
'\212', '\213', '\214', '\215',
'\216', '\217', '\220', '\232',
'\233', '\234', '\235', '\236',
'\237', '\240', '\252', '\253',
'\254', '\255', '\256', '\257',
'\260', '\261', '\262', '\263',
'\264', '\265', '\266', '\267',
'\270', '\271', '\272', '\273',
'\274', '\275', '\276', '\277',
'\312', '\313', '\314', '\315',
'\316', '\317', '\332', '\333',
'\334', '\335', '\336', '\337',
'\352', '\353', '\354', '\355',
'\356', '\357', '\372', '\373',
'\374', '\375', '\376', '\377'
};
to_ebcdic(source, dest, count)
char *source,
*dest;
int count;
{
for (; count--;)
*(dest++) = to_ebcdic_table[0377 & *(source++)];
}
to_ascii(source, dest, count)
char *source,
*dest;
int count;
{
for (; count--;)
*(dest++) = to_ascii_table[0377 & *(source++)];
}
//E*O*F tables.c//
echo x - ansitape.1
cat > "ansitape.1" << '//E*O*F ansitape.1//'
.TH ANSITAPE 1 "23 June 1986" AICenter Merlin
.\"@(#)ansitape.1 2.0 86/07/08 AICenter; by David S. Hayes
.SH NAME
ansitape \- ANSI-standard magtape label program
.SH SYNOPSIS
\fIansitape \fPtxrc\[vqfaei3\]
\[\mt=\fIdevice\fP\]
.RS +0.5i
.br
\[vo=\fIvolume-name\fP\]
\[rs=\[ r | \fIrecordsize\fP \]\]
\[bs=\fIblocksize\fP]
.br
\[rf=\[ v | f \]\]
\[cc=\[ i | f | e \]\]
.br
\fIfilename1 filename2\fR . . .
.RE -0.5i
.SH DESCRIPTION
.LP
\fIAnsitape\fP reads, writes, and creates magtapes conforming to
the ANSI standard for magtape labelling. Primarily, this is useful
to exchange tapes with VAX/VMS, which makes this kind of tape by default.
.LP
\fIAnsitape\fP is controlled by a function key letter
.BR "(t, x, c, or r)" .
Various options modify the format of the output tape.
.SH "Writing ANSI Tapes"
.PP
The list of files on the command line is written to the tape.
A full Unix pathname may be specified, however, only the last
pathname component (everything after the last /) is used as
the filename on the tape.
.PP
Normally, regular text files are to be exchanged.
.I ansitape
reads the files one line at a time and transfers them to the tape.
The newline character at the end of each line is removed, and the
file is written in a variable-length record format.
Variable-format files have the length of the longest record
specified in a file header.
Therefore,
.I ansitape
will read each input file from disk before it goes on to tape,
to determine the maximum record size. The read is skipped if
the file is more than 100,000 bytes long.
The default carriage control (implied)
instructs the other host to restore the
newline character before printing the record.
.PP
If \fIansitape\fP thinks that the input file is a Unix text file
(Fortran or implied carriage control), it will automatically strip the
the Unix newline from the end of each record. No strip is done with
embedded carriage control files, or with any file using a fixed-length
record format.
.PP
For binary files, fixed-length records should be used. VAX/VMS normally
uses a record length of 512 bytes for things like directories and
executable files, but data files may have any record length.
Binary files should be flagged for embedded (\fIrf=e\fP) carriage
control.
.sp
.SH "Reading ANSI Tapes"
.PP
When reading, the input file list is presumed to be the names
of files to be extracted from the tape. The shell wildcard
characters asterisk (*) and question-mark (?) may be used.
Of course, they must be quoted to prevent the shell from
interpreting them before
.I ansitape
sees them.
.PP
None of the options for record format or carriage control need
be specified when reading files.
.I Ansitape
will automatically pick up this information from the header
records on the tape, and do the right thing. If you can't get
just what you want from
.IR ansitape ,
the resulting files may be run through
.IR dd(1) .
.sp
.SH "FUNCTION LETTERS"
.PP
These function letters describe the overall operation desired.
One of them must be specified in the first argument to
.IR ansitape .
For lexically rigorous Unix fans, a minus sign (-) is allowed,
but optional, to introduce the first keyword option set.
.TP 6
.I r
Write the named files on the end of the tape. This requires that
the tape have been previously initialized with an ANSI volume header.
.TP 6
.I c
Create a new magtape. The tape is initialized with a new ANSI volume header.
All files previously on the tape are destroyed.
This option implies \fIr\fP.
.TP 6
.I x
Extract all files from the tape. Files are placed in the current directory.
Protection is r/w to everyone, modified by the current \fIumask(2)\fP.
.TP 6
.I t
List all of the names on the tape.
.sp
.SH "MODIFIER KEY LETTERS"
.PP
These key letters are part of the first argument to
.IR ansitape .
.TP 6
.I v
Normally \fIansitape\fP does its work silently; the \fIv\fP (verbose) option
displays the name of each file \fIansitape\fP treats, preceded by the function
letter. It also displays the volume name of each tape as it is mounted.
When used with the \fIt\fP option,
\fIansitape\fP displays the number of tape blocks
used by each file, the record format, and the carriage control option.
.TP 6
.I q
Query before writing anything. On write (c or r options), this
causes \fIansitape\fP to ask before writing to the tape. On extract
operations, \fIansitape\fP displays the
Unix pathname, and asks if it should extract the file. Any response
starting with a 'y' or 'Y' means yes, any other response (including
an empty line) means no.
.TP 6
.I f
File I/O is done to standard i/o instead. For example, when writing a
tape file that is to contain a lint listing, we could specify
.sp
lint xyz.c | ansitape rf xyz.lint
.sp
instead of
.sp
lint xyz.c > /tmp/xyz.lint
.br
ansitape r /tmp/xyz.lint
.br
rm /tmp/xyz.lint
.sp
When reading, this option causes the extracted files to be sent to
stdout instead of a disk file.
.TP 6
.I a
The tape should be read or written with the ASCII character set. This
is the default.
.TP 6
.I e
The tape should be written with the EBCDIC character set. The
mapping is the same one used by the
.I dd(1)
program with
.IR conv=ebcdic .
This option is automatically enabled if IBM-format labels are selected.
.TP 6
.I i
Use IBM-format tape labels. The IBM format is very similar, but
not identical, to the ANSI standard. The major difference is that
the tape will contain no HDR3 or HDR4 records, thus restricting the
name of the files on the tape to 17 characters. This option automatically
selects the EBCDIC character set for output. To make an IBM-format
label on a tape using the ASCII character set (why?), use the
option sequence
.IR ia .
.TP 6
.I 3
Do not write HDR3 or HDR4 labels. The HDR3 label is reserved for
the use of the operating system that created the file. HDR4 is for
overflow of filenames that are longer than the 17 characters allocated
in the HDR1 label. Not all systems process these labels correctly, or
even ignore them correctly. This switch suppresses the HDR3 and HDR4
labels when the tape is to be transfered to a system that would
choke on them.
.SH "FUNCTION MODIFIERS"
.PP
Each of these options should be given as a separate argument to
.IR ansitape .
Multiple options may be specified. They must appear as after the
key-letter options above, and before any filename arguments.
.TP 6
.IR mt= device
Select an alternate drive on which the tape is mounted.
The default is
.IR /dev/rmt8 .
.TP 6
.IR vo= volume-name
Specify the name of the output volume. Normally, this defaults
to the first six characters of your login name. The string 'UNIX'
is used as the default if \fIansitape\fP cannot determine your login name.
.TP 6
.IR rs= recordsize
Specify the output recordsize in bytes. This is the maximum size
in the case of variable-format files. This option also turns on
the fixed-record-format option. Thus, if you want to have variable
record sizes with a smaller maximum, you must specify
.sp
.ce
.IR rs= "recordsize " rf=v
.sp
When the recordsize is manually given,
.I ansitape
does not read disk files to determine the maximum record length.
.TP 6
.I rs=r
This is a variant of the
.I rs=
option. This causes
.I ansitape
to read all disk files for recordsize, regardless of their size.
Normally, files larger than 100K bytes are not scanned for recordsize.
Using this option also implies variable-length records.
.TP 6
.IR bs= blocksize
Specify the output blocksize, in bytes. As many records as will
fit are crammed into each physical tape block. ANSI standards
limit this to 2048 bytes (the default), but you may specify more
or less. Be advised that specifying more may prevent some
systems from reading the tape.
.TP 6
.I rf=v
Record format is variable-length. In other words, they are
text files. This is the default, and should be left alone unless
you really know what you're doing.
.TP 6
.I rf=f
Record format is fixed-length. This is usually
a bad choice, and should be reserved for binary files. This also
turns off the newline strip usually done for Unix text files.
.TP 6
.I cc=i
Carriage control implied (default).
Unlike Unix text files, where records are delimited by a newline character,
ANSI files do not normally include the newline as part of the record.
Instead, a newline is automatically added to the record whenever it is
sent to a printing device.
.TP 6
.I cc=f
Carriage control Fortran.
Each line is expected to start with a Fortran carriage-control
character. \fIAnsitape\fP does not insert these characters
automatically, it merely marks the file as having them.
This is of limited usefulness. (Good opportunity for another
ambitious hacker.)
.TP 6
.I cc=e
Carriage control is embedded. Carriage control
characters (if any) are a part of the data records. This is usually used in
the case of binary data files.
.TP 6
.SH FILES
/dev/rmt? half-inch magnetic tape interface
.br
/dev/rar? quarter-inch magnetic tape interface
.br
/dev/rst? SCSI tape interface
.SH "SEE ALSO"
dd(1), umask(2), mtio(4), tp(5)
.SH AUTHOR
David S. Hayes, Site Manager, US Army Artificial Intelligence Center.
Originally developed June 1986.
Revised August 1986. This software is in the public domain.
.SH BUGS
.LP
The
.I r
(write) option cannot be used with quarter-inch archive tapes,
since these tape drives cannot backspace.
.LP
There is no way to ask for the
.IR n -th
occurrence of a file.
.LP
Tape errors are handled ungracefully.
.LP
Files with names longer than 80 characters have the name truncated.
This is a limitation of the ANSI labelling standard. If the tape is
made without HDR3 and HDR4 labels (\fI3\fP or \fIi\fP switch), the
name is limited to 17 characters.
.LP
Multi-volume tape sets cannot yet be generated.
.I ansitape
will read them just fine, but it won't write them.
Unix provides no device-independent way to detect
a physical end-of-tape. It was decided that a 2400-foot
limitation was preferrable to device-dependence.
.TP 6
Note to Systems Programmers:
.I ansitape
uses a boolean function
.I (eot)
to determine when the tape drive
has hit the end of file. It is called every time a block
of data is written to the tape. If this function ever returns
TRUE (a defined constant), an automatic volume switch occurs.
The pertinent device registers are obtained by a MTIOCGET
ioctl system call. The registers are described in
.I /sys/sundev/tmreg.h
(Sun system with TapeMaster controller). If you
have a VAX, the filename will be slightly different.
Sun Microsystems supplies this file even with binary-only
distributions.
//E*O*F ansitape.1//
echo x - ansitape.5.tbl
cat > "ansitape.5.tbl" << '//E*O*F ansitape.5.tbl//'
.TH ANSITAPE 5 "8 August 1986"
.SH NAME
ansitape - ANSI standard magtape labels
.SH DESCRIPTION
.PP
An ANSI-labelled tape starts with a volume header.
This header specifies the volume name and protection,
the owner of the volume, and the ANSI label standard level
that the tape conforms to.
.PP
Every file on the tape has a header, some data blocks, and
a trailer. A tape mark follows each of these elements.
At the end of the tape, two tape marks follow the trailer,
to indicate logical end-of-tape.
.PP
If a file is too large to be copied onto one tape, it may
be continued on another tape by modifying the trailer section.
.sp
.SH "VOLUME HEADER"
.TS
expand allbox;
c c c c
l n c l .
Field Width Example Use
VOL1 4 VOL1 T{
Indicates this is a volume header.
T}
Label 6 VAX1 T{
The name of the volume.
T}
Access 1 space T{
Volume protection. Space means unprotected.
T}
IGN1 20 << ignored >>
IGN2 6 << ignored >>
Owner 14 Joe User T{
The name of the user.
T}
IGN3 28 << ignored >>
Level 1 3 ANSI standard level.
.TE
.sp
.TP 10
Owner
The owner field is 14 characters in ANSI labels.
IBM labels cut the owner field to 10 characters.
The IGN2 field is 10 characters on IBM-format tapes.
.bp
.SH "FILE HEADERS"
.LP
.TS
expand allbox;
c c c c
l n c l .
Field Width Example Use
HDR1 4 HDR1 T{
Identifies first file header.
T}
Name 17 FILE.DAT T{
Leftmost 17 characters of filename.
T}
Set 6 VAX1 T{
Name of volume set this file is part of.
T}
Vol Num 4 0001 T{
Number of this volume within volume set.
T}
File Num 4 0001 T{
Number of file on this tape.
T}
Generation 4 0001 T{
Like a major release number.
T}
Gen Version 2 00 T{
Version of a file within a release.
T}
Created 6 b86001 T{
The date of file creation.
T}
Expires 6 b86365 T{
Date file expires.
T}
Access 1 space T{
File protection. Space means unprotected.
T}
Blockcount 6 000000 T{
Number of blocks in the file.
T}
System 13 OS360 T{
The name of the software system
that created the tape.
T}
IGN 7 << ignored >>
.TE
.sp
.TP 1i
Name
The filename may be up to 17 characters in IBM labels,
and ANSI labels before standard level 3.
On ANSI level 3 and after, the HDR4 record provides
overflow storage for up to 63 more characters of filename.
.TP
Set Name
On multi-reel tape sets, a name identifying the set as a whole.
Normally, this is just the volume name of the first reel in the set.
.TP
Generation
Like a major release number. The version field is a version
within a generation. On VAX/VMS systems, these two fields are
mathematically related to the (single) version number of disk files.
.TP
Created
The date the file was created. This is a six character field,
where the first character is always a space.
The next two are the year. The final 3 are the day within
the year, counting January 1st as day 1.
.TP
Blocks
The number of blocks in the file. In HDR1 records, this is
always zero. The corresponding EOF1 or EOV1 contains the
number of tape blocks written in the file on the current reel.
.bp
.LP
.TS
expand allbox;
c c c c
l n c l .
Field Width Example Use
HDR2 4 HDR2 T{
Second file header.
T}
Rec Format 1 D Record format.
Blk Length 5 02048 Tape block size.
Rec Length 5 00080 Record size.
Density 1 3 Recording density code.
Vol Switch 1 0 T{
1 if this is a continuation of a file from a previous reel.
T}
Job 17 user/program See following notes.
Recording 2 space Unused in 9-track tapes.
Car Control 1 space See following notes.
Blocking 1 B See following notes.
IGN 11 << ignored >>
Offset 2 00 T{
Bytes to skip at front of each block.
T}
.TE
.TP
Rec Format
A single character indicating what type of records are
provided. The codes are
.sp
.TS
center allbox;
c c
c l .
Code Meaning
F Fixed-length
D Variable up to rec length
V IBM code for variable
U Unknown
.TE
.TP
Job
The name of the job (username in Unix) right-padded
to 8 characters, a slash (/), and the job step
(program name in Unix) right-padded to 8 characters.
This identifies where the JCL was when this file
was created.
.TP
Carriage Control
Normally a space, indicating that the records do not
contain carriage control information. When printed,
each record is placed on a separate line.
If an 'A' is used, the first character of each record
is presumed to be a Fortran carriage-control character.
VAX/VMS also uses 'M' to indicate that carriage-control
is embedded as part of the data. This is usually used
in the case of binary files.
.TP
Blocking
The B indicates that as many records as will fit are
placed in a physical tape block. Records do not cross
block boundaries. A space indicates only one record
per physical tape block.
.bp
.LP
The HDR3 and HDR4 labels are not written on IBM tapes.
ANSI allows, but does not require, these labels.
.sp
.TS
expand allbox;
c c c c
l n c l .
Field Width Example Use
HDR3 4 HDR3 Third file header.
OS 76 Operating-system dependent.
.TE
.TP
OS
This field is reserved for the use of the operating system
that created the file. Other operating systems are supposed
to disregard HDR3 records. On VAX/VMS, this record contains
the RMS file description.
.sp
.LP
.TS
expand allbox;
c c c c
l n c l .
Field Width Example Use
HDR4 4 HDR4 Fourth file header.
Name 2 63 Name continuation from HDR1.
Unknown 2 00 Unknown, fill with 00.
IGN 11 << ignored >>
.TE
.TP
Name 2
On ANSI tapes, if the filename is longer than
17 characters, the first 17 are placed in the HDR1
record. The next 63 are put in HDR4. Filenames
longer than 80 characters are truncated. Note
that it is not required to have a HDR3 record
in order to have a HDR4.
.sp
.SH "FILE TRAILING LABELS"
.PP
These labels are written after a tape file.
For every label written at the head of the file,
there will be a corresponding label at the tail.
Except for the
.I "block count"
field in HDR1, the only difference is in the name
of the label.
If we have reached the logical end of the file,
the characters
.I HDR
in the headers are replaced by the characters
.I EOF
in the trailing labels.
If we are not at the logical end of the file, but
are merely pausing at the physical end of tape before
continuing on another reel, the
.I HDR
characters are replaced by
.I EOV
(end-of-volume).
.PP
The
.I "block count"
field of HDR1 was initially recorded as 000000. When
the trailers are written, the block count is changed
to indicate the number of tape data blocks written.
A file that is continued over several volumes maintains
separate counts for each reel.
.SH "RECORD FORMATS"
.PP
The two basic record formats are fixed and variable.
.PP
Fixed format uses records that are all constant length. This
is the case with VAX/VMS executable images (record length = 512).
It is also used by IBM systems for text files, with a record length
of 80 (card images). The record size field of HDR2 tells how long each
record is.
.PP
With fixed-length records, the blocksize is usually selected to
be some multiple of the recordsize. As many records as will
fit are placed in each block. Since records do not (normally)
span physical tape blocks, extra space at the end of a block is wasted.
.PP