|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 2690 (0xa82)
Types: TextFile
Names: »mount.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/multivol/mount.c«
/* multivol V1.00 5-Jun-85 Tony O'Hagan
* multivol (8) - handle multivolume files
* wrvols() - function of multivol main()
*/
#include <stdio.h>
#include <ctype.h>
#include "multivol.h"
/* Globals */
extern bool dsp_vols, vfy_vols, rd_flag, wr_flag;
extern char *label;
up_vhdr *
mount_vol(vol_nam, vol_num, timestamp)
/* returns header read on mounted volume */
char *vol_nam;
int vol_num;
long timestamp;
{
up_vhdr *upvh; /* returned value */
bool ok;
bool vol_ok();
void print_vhdr();
bool y_or_n();
up_vhdr *rd_vhdr();
char *askf();
#ifdef REWIND
char *ask();
#endif
tracef((tr, "+ mount_vol(%s, %d, %ld)", vol_nam, vol_num, timestamp));
do {
askf("Mount volume #%d and type <return> ", vol_num);
if (rd_flag || dsp_vols || vfy_vols)
upvh = rd_vhdr(vol_nam); /* Read volume header */
else {
upvh = NULVHD;
trace("goto no_vhdr");
goto no_vhdr; /* no volume header was read */
}
if (upvh == NULVHD) {
ok = !rd_flag; /* ok unless attempting to read volume */
} else {
if (dsp_vols || vfy_vols) {
/* Print header & check correct volume is read/overwritten */
putc('\n', stderr);
print_vhdr(upvh);
putc('\n', stderr);
}
ok = vol_ok(upvh, vol_num, timestamp);
}
tracef((tr, "vfy_vols=%d, ok=%d upvh=x%x", vfy_vols, ok, upvh));
} while ( (vfy_vols || !ok) && y_or_n("Remount required [y/n] ? ") );
#ifdef REWIND
ask("Ensure volume is rewound and type <return> ");
#endif
no_vhdr:
trace("- mount_vol()");
return(upvh);
}
bool
vol_ok(upvh, vol_num, timestamp)
up_vhdr *upvh;
int vol_num;
long timestamp;
/* Check correct volume is mounted
* vol_num = volume no. expected on this volume
* timestamp = timestamp on volumes being written
* upvh = unpacked volume header on volume about to be read/overwritten.
*/
{
bool ok = TRUE; /* returns ok */
static up_vhdr up_1st; /* first volume header read */
trace("+ vol_ok()");
if (wr_flag) { /* if writing volumes */
if (timestamp == upvh->up_timestamp) {
fprintf(stderr,
"** This clobbers a volume just written !\n");
ok = FALSE;
}
} else if (rd_flag) { /* if reading volumes */
if (vol_num == 1) { /* record header of first volume */
bcopy((char *)upvh, (char *)&up_1st, sizeof(up_vhdr));
if (label != NULL &&strcmp(label, upvh->up_label) != 0){
fprintf(stderr, "** Label does not match\n");
ok = FALSE;
}
}
if (vol_num >= 2 && up_1st.up_timestamp != upvh->up_timestamp) {
fprintf(stderr, "** Volume not part of volume set\n");
ok = FALSE;
} else if (upvh->up_vol_num != vol_num) {
fprintf(stderr, "** Volume no. out of sequence\n");
ok = FALSE;
}
}
trace("- vol_ok()");
return(ok);
}