pdp11v/usr/src/cmd/labelit.c
static char sccsid[] = "@(#)labelit.c 1.5";
#include <stdio.h>
#include <sys/param.h>
#ifndef RT
#include <signal.h>
#include <sys/types.h>
#endif
#include <sys/sysmacros.h>
#include <sys/filsys.h>
#define DEV 1
#define FSNAME 2
#define VOLUME 3
/* write fsname, volume # on disk superblock */
struct {
char fill1[BSIZE];
union {
char fill2[BSIZE];
struct filsys fs;
} f;
} super;
#ifdef RT
#define IFTAPE(s) (equal(s,"/dev/mt",7)||equal(s,"mt",2))
#else
#define IFTAPE(s) (equal(s,"/dev/rmt",8)||equal(s,"rmt",3)||equal(s,"/dev/rtp",8)||equal(s,"rtp",3))
#endif
struct {
char t_magic[8];
char t_volume[6];
char t_reels,
t_reel;
long t_time,
t_length,
t_dens;
char t_fill[484];
} Tape_hdr;
sigalrm()
{
signal(SIGALRM, sigalrm);
}
main(argc, argv) char **argv; {
int fsi, fso;
long curtime;
int i;
signal(SIGALRM, sigalrm);
#ifdef RT
setio(-1,1); /* use physical io */
#endif
if(argc!=4 && argc!=2 && argc!=5) {
showusage:
#ifdef RT
fprintf(stderr,"Usage: labelit /dev/??? [fsname volume [-n]]\n");
#else
fprintf(stderr,"Usage: labelit /dev/r??? [fsname volume [-n]]\n");
#endif
exit(2);
}
if(argc==5) {
if(strcmp(argv[4], "-n")!=0)
goto showusage;
if(!IFTAPE(argv[DEV])) {
fprintf(stderr, "labelit: `-n' option for tape only\n");
exit(2);
}
printf("Skipping label check!\n");
goto do_it;
}
if((fsi = open(argv[DEV],0)) < 1) {
fprintf(stderr, "labelit: cannot open device\n");
exit(2);
}
if(IFTAPE(argv[DEV])) {
alarm(5);
read(fsi, &Tape_hdr, sizeof(Tape_hdr));
alarm(0);
if(!(equal(Tape_hdr.t_magic, "Volcopy", 7)||
equal(Tape_hdr.t_magic,"Finc",4))) {
fprintf(stderr, "labelit: tape not labelled!\n");
exit(2);
}
printf("%s tape volume: %s, reel %d of %d reels\n",
Tape_hdr.t_magic, Tape_hdr.t_volume, Tape_hdr.t_reel, Tape_hdr.t_reels);
printf("Written: %s", ctime(&Tape_hdr.t_time));
if(argc==2 && Tape_hdr.t_reel>1)
exit(0);
}
if((i=read(fsi, &super, sizeof(super))) != sizeof(super)) {
fprintf(stderr, "labelit: cannot read superblock\n");
exit(2);
}
#define S super.f.fs
printf("Current fsname: %.6s, Current volname: %.6s,",
S.s_fname, S.s_fpack, S.s_fsize);
if (S.s_magic == FsMAGIC && S.s_type == Fs2b)
printf(" Blocks: %ld, Inodes: %d\nFS Units: 1Kb, ",
S.s_fsize * 2, (S.s_isize - 2) * 16);
else
printf(" Blocks: %ld, Inodes: %d\nFS Units: 512b, ",
S.s_fsize, (S.s_isize - 2) * 8);
printf("Date last mounted: %s", ctime(&S.s_time));
if(argc==2)
exit(0);
do_it:
printf("NEW fsname = %.6s, NEW volname = %.6s -- DEL if wrong!!\n",
argv[FSNAME], argv[VOLUME]);
sleep(10);
sprintf(super.f.fs.s_fname, "%.6s", argv[FSNAME]);
sprintf(super.f.fs.s_fpack, "%.6s", argv[VOLUME]);
close(fsi);
fso = open(argv[DEV],1);
if(IFTAPE(argv[DEV])) {
strcpy(Tape_hdr.t_magic, "Volcopy");
sprintf(Tape_hdr.t_volume, "%.6s", argv[VOLUME]);
if(write(fso, &Tape_hdr, sizeof(Tape_hdr)) < 0)
goto cannot;
}
if(write(fso, &super, sizeof(super)) < 0) {
cannot:
fprintf(stderr, "labelit cannot write label\n");
exit(2);
}
exit(0);
}
equal(s1, s2, ct)
char *s1, *s2;
int ct;
{
register i;
for(i=0; i<ct; ++i) {
if(*s1 == *s2) {;
if(*s1 == '\0') return(1);
s1++; s2++;
continue;
} else return(0);
}
return(1);
}