static char *sccsid
= "@(#)arff.c 4.8 (Berkeley) 81/11/13";
u_short rt_yr
:5; /* year-1972 */
u_short rt_dy
:5; /* day */
u_short rt_mo
:5; /* month */
char rt_pad
; /* unusued */
char rt_stat
; /* type of entry, or end of seg */
u_short rt_name
[3]; /* name, 3 words in rad50 form */
short rt_len
; /* length of file */
char rt_chan
; /* only used in temporary files */
char rt_job
; /* only used in temporary files */
struct rt_dat rt_date
; /* creation date */
#define RT_BLOCK 512 /* block size */
#define RT_DIRSIZE 31 /* max # of directory segments */
short rt_numseg
; /* # of segments available */
short rt_nxtseg
; /* # of next logical segment */
short rt_lstseg
; /* highest seg currently open */
u_short rt_entpad
; /* extra words/directory entry */
short rt_stfile
; /* block # where files begin */
struct rt_head rt_axhead
;
struct rt_ent rt_ents
[72];
extern struct rt_dir rt_dir
[RT_DIRSIZE
];
#define rt(p) ((struct rt_ent *) p )
#define flag(c) (flg[('c') - 'a'])
struct rt_dir rt_dir
[RT_DIRSIZE
] = {
{ {0, RT_NULL
, {0, 0, 0}, 494, 0}, {0, RT_ESEG
} }
struct rt_ent
*rt_curend
[RT_DIRSIZE
];
char *defdev
= "/dev/floppy";
int signum
[] = {SIGHUP
, SIGINT
, SIGQUIT
, 0};
int rcmd(), dcmd(), xcmd(), tcmd();
for (cp
= argv
[1]; *cp
; cp
++)
#define SURE "Last chance before clobbering floppy?"
tty
= open("/dev/tty", 2);
write(tty
, SURE
, sizeof(SURE
));
read(tty
, response
, sizeof(response
));
fprintf(stderr
, "arff: bad option `%c'\n", *cp
);
fprintf(stderr
, "arff: one of [%s] must be specified\n",
fprintf(stderr
, "arff: only one of [%s] allowed\n", man
);
fprintf(stderr
, "usage: ar [%s][%s] archive files ...\n", opt
, man
);
for (i
= 0; i
< namc
; i
++)
fprintf(stderr
, "arff: %s not found\n", namv
[i
]);
if (c
!= 'c' || flag(v
) > 1)
printf("%c - %s\n", c
, file
);
register char *de
, *last
;
register struct rt_ent
*rde
;
for (segnum
= 0; segnum
!= -1;
segnum
= rt_dir
[segnum
].rt_axhead
.rt_nxtseg
- 1)
last
= rt_last
+ segnum
*2*RT_BLOCK
;
for (de
= ((char *)&rt_dir
[segnum
])+10; de
<= last
;
nleft
= (last
-de
)/rt_entsiz
;
#define ENTRIES "\n%d entries remaining in directory segment %d.\n"
printf(ENTRIES
, nleft
, segnum
+1);
for (i
= 0; i
< namc
; i
++)
if (dope
= lookup(namv
[i
])) {
register struct rt_ent
*de
;
sunrad50(name
, de
->rt_name
);
unrad50(2, de
->rt_name
, name
);
unrad50(1, &(de
->rt_name
[2]), ext
);
year
= de
->rt_date
.rt_yr
+72;
month
= de
->rt_date
.rt_mo
;
printf("%6.6s %3.3s %02d/%02d/%02d %d\n",name
,
ext
, month
, day
, year
, de
->rt_len
);
printf("%-25.9s %d\n","<UNUSED>", de
->rt_len
);
register char *de
, *last
;
for (segnum
= 0; segnum
!= -1;
segnum
= rt_dir
[segnum
].rt_axhead
.rt_nxtseg
-1)
for (last
= rt_last
+(segnum
*2*RT_BLOCK
),
de
= ((char *)&rt_dir
[segnum
])+10; de
<= last
;
sunrad50(name
, rt(de
)->rt_name
), rtx(name
);
for (i
= 0; i
< namc
; i
++)
if (dope
= lookup(name
)) {
if ((file
= creat(name
, 0666)) < 0)
for( ; count
> 0 ; count
-= 512) {
lread(startad
, 512, buff
);
register char *de
, *last
;
if (flag(c
) || flag(d
) || flag(r
))
if ((temp_floppydes
= fopen(defdev
, mode
)) == NULL
) {
floppydes
= fileno(temp_floppydes
);
lread(6*RT_BLOCK
, 2*RT_BLOCK
, (char *)&rt_dir
[0]);
dirnum
= rt_dir
[0].rt_axhead
.rt_numseg
;
if (dirnum
> RT_DIRSIZE
) {
fprintf(stderr
,"arff: too many directory segments\n");
for (i
= 1; i
< dirnum
; i
++)
lread((6+2*i
)*RT_BLOCK
, 2*RT_BLOCK
, (char *)&rt_dir
[i
]);
rt_entsiz
= 2*rt_dir
[0].rt_axhead
.rt_entpad
+ 14;
rt_entsiz
= 14; /* assume rt_entpad = 0 ??? */
rt_last
= ((char *) &rt_dir
[0]) + 10 + 1014/rt_entsiz
*rt_entsiz
;
for (i
= 0; i
< dirnum
; i
++) {
last
= rt_last
+ i
*2*RT_BLOCK
;
for (de
= ((char *)&rt_dir
[i
])+10; de
<= last
; de
+= rt_entsiz
)
if (rt(de
)->rt_stat
== RT_ESEG
)
rt_nleft
+= (last
-de
)/rt_entsiz
;
register char *de
, *last
;
* Search for name, accumulate blocks in index
for (segnum
= 0; segnum
!= -1;
segnum
= rt_dir
[segnum
].rt_axhead
.rt_nxtseg
- 1)
last
= rt_last
+ segnum
*2*RT_BLOCK
;
for (de
=((char *)&rt_dir
[segnum
])+10;
rt(de
)->rt_stat
!= RT_ESEG
; de
+= rt_entsiz
)
switch(rt(de
)->rt_stat
) {
if(samename(rname
,rt(de
)->rt_name
)) {
result
.count
= rt(de
)->rt_len
* 512;
(rt_dir
[segnum
].rt_axhead
.rt_stfile
+ index
);
result
.rtdope
= (struct rt_ent
*) de
;
return(*a
== *b
&& a
[1] == b
[1] && a
[2] == b
[2] );
for (index
= 0; *cp
; index
++) {
temp
= Ain1
* table
[*cp
++];
temp
+= Ain2
* table
[*cp
++];
#define reduce(x, p, q) (x = v[p/q], p %= q);
register u_char
*v
= (u_char
*) val
;
for (i
= 0; i
< count
; i
++) {
reduce(*cp
++, temp
, Ain1
);
reduce(*cp
++, temp
, Ain2
);
while (cp
>= name
&& *--cp
!= '/')
if (*cp
== '.' || index
>= 3)
rname
[0] = rname
[1] = rname
[2] = 0;
rad50((u_char
*)file
, rname
);
rad50((u_char
*)ext
, rname
+2);
unrad50(1, rname
+ 2, ext
);
* Jam name and extension together with a dot
while (*--cp
== ' ' && cp
>= name
)
for (cp2
= ext
; *cp2
!= ' ' && cp2
< ext
+3;)
static char *oval
= " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.@0123456789";
static char *val
= " abcdefghijklmnopqrstuvwxyz$.@0123456789";
static char table
[256] = {
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29,
29, 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, 29, 29, 29, 29, 29,
29, 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, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29,
29, 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, 29, 29, 29, 29, 29,
29, 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, 29, 29, 29, 29 };
* Logical to physical adress translation
register int sector
, bytes
, track
;
sector
+= 26 + ((track
= (logical
/26))-1)*6;
return((((track
*26)+sector
) << 7) + bytes
);
lread(startad
, count
, obuff
)
register int size
= flag(m
) ? 512 : 128;
while ((count
-= size
) >= 0) {
lseek(floppydes
, flag(m
) ?
(long)startad
: trans(startad
), 0);
if (read(floppydes
, obuff
, size
) != size
)
fprintf(stderr
, "arff: read error block %d\n",
lwrite(startad
, count
, obuff
)
register int size
= flag(m
) ? 512 : 128;
while ((count
-= size
) >= 0) {
lseek(floppydes
, flag(m
) ?
(long)startad
: trans(startad
), 0);
if (write(floppydes
, obuff
, size
) != size
)
fprintf(stderr
, "arff: write error block %d\n",
for (i
= 0; i
< namc
; i
++)
register struct rt_ent
*de
;
register struct stat
*bufp
= &buf
;
if (stat(name
, bufp
) < 0) {
if (dope
= lookup(name
)) {
/* can replace, no problem */
if (bufp
->st_size
<= (de
->rt_len
* 512))
toflop(name
, bufp
->st_size
, dope
);
fprintf(stderr
, "%s will not fit in currently used file on floppy\n",name
);
/* Search for vacant spot */
for (segnum
= 0; segnum
!= -1;
segnum
= rt_dir
[segnum
].rt_axhead
.rt_nxtseg
- 1)
last
= rt_last
+ segnum
*2*RT_BLOCK
;
for (de
= rt_dir
[segnum
].rt_ents
;
rt(de
)->rt_stat
!= RT_ESEG
; de
++)
if ((de
)->rt_stat
== RT_NULL
) {
if (bufp
->st_size
<= (de
->rt_len
*512)) {
mkent(de
, segnum
, bufp
,name
);
printf("%s: no slot for file\n", name
);
if (dope
= lookup(name
)) {
toflop(name
, bufp
->st_size
, dope
);
printf("%s: internal error, added then not found\n", name
);
mkent(de
, segnum
, bufp
, name
)
register struct rt_ent
*de
;
register struct stat
*bufp
;
register struct tm
*timp
;
register struct rt_ent
*workp
;
count
= (((bufp
->st_size
-1) >>9) + 1);
/* make sure there is room */
if ((char *)rt_curend
[segnum
] == (rt_last
+ (segnum
*2*RT_BLOCK
))) {
/* no entries left on segment */
fprintf(stderr
,"Directory segment #%d full on %s\n",segnum
+1,
/* copy directory entries up */
for (workp
= rt_curend
[segnum
]+1; workp
> de
; workp
--)
srad50(name
,de
->rt_name
);
timp
= localtime(&bufp
->st_mtime
);
de
->rt_date
.rt_dy
= timp
->tm_mday
+ 1;
de
->rt_date
.rt_mo
= timp
->tm_mon
+ 1;
de
->rt_date
.rt_yr
= timp
->tm_year
- 72;
lwrite((6+segnum
*2)*RT_BLOCK
, 2*RT_BLOCK
, (char *)&rt_dir
[segnum
]);
toflop(name
, ocount
, dope
)
register file
, n
, startad
= dope
->startad
, count
= ocount
;
fprintf(stderr
, "arff: couldn't open %s\n",name
);
for( ; count
>= 512; count
-= 512) {
lwrite(startad
, 512, buff
);
for (n
= count
; n
< 512; n
++)
lwrite(startad
, 512, buff
);
count
= (dope
->rtdope
->rt_len
*512-ocount
)/512 ;
for ( ; count
> 0 ; count
--) {
lwrite(startad
, 512, zeroes
);
for (i
= 0; i
< namc
; i
++)
register struct rt_ent
*de
;
if (dope
= lookup(name
)) {
* ((u_short
*)&(de
->rt_date
)) = 0;
register struct rt_ent
*de
, *workp
;
for (segnum
= 0; segnum
!= -1;
segnum
= rt_dir
[segnum
].rt_axhead
.rt_nxtseg
- 1) {
for (de
= rt_dir
[segnum
].rt_ents
; de
<= rt_curend
[segnum
]; de
++)
if (de
->rt_stat
== RT_NULL
&& de
[1].rt_stat
== RT_NULL
) {
(de
+1)->rt_len
+= de
->rt_len
;
for (workp
= de
; workp
< rt_curend
[segnum
]; workp
++)
lwrite((6+segnum
*2)*RT_BLOCK
, 2*RT_BLOCK
,
(char *)&rt_dir
[segnum
]);