|
|
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: 3284 (0xcd4)
Types: TextFile
Names: »multivol.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/multivol/multivol.c«
/* multivol V1.00 5-Jun-85 Tony O'Hagan
* multivol (8) - handle multivolume files
* multivol [-i] [-o] [-v] [-w] [-t] [-b blocksize]
* [-n blocks-per-vol] [-l label] [device]
* Source files:
* ask.c bcopy.c error.c mount.c multivol.c rd.c testdata.c trace.c vhdr.c wr.c
* multivol.h options.h trace.h
* Other files:
* Makefile READ_ME multivol.8 testdata.c
*/
#include <stdio.h>
#include <ctype.h>
#include "options.h"
#include "multivol.h"
#define ACCREAD 4
#define ACCWRIT 2
#ifndef DEFBSIZ
# include <sys/param.h>
# undef bcopy
# define DEFBSIZ BSIZE /* default block size */
#endif
#ifndef DEFBLIM
# define DEFBLIM NOLIMIT /* default block limit (no. per volume) */
#endif
#define DEFLABEL "no_label" /* Default label */
#ifndef DEFDEV /* may be cc -DDEFDEV= */
# define DEFDEV "/dev/multivol"
#endif
/* Globals */
export char *prog_name, *label = DEFLABEL, *device = DEFDEV;
export bool dsp_blks, dsp_vols, vfy_vols, rd_flag , wr_flag;
export long blk_lim = DEFBLIM;
export long blk_siz = DEFBSIZ;
void
main(argc, argv) /* multivol main() */
int argc;
char *argv[];
{
char *bsizstr;
up_vhdr *upvh;
void rd_vols(), wrvols(), print_vhdr();
up_vhdr *rd_vhdr();
long kval(), atol();
char *vol_file();
int t_int;
bool y_or_n();
trace( "+ main()");
rd_flag = wr_flag = dsp_vols = dsp_blks = vfy_vols = FALSE;
OPTIONS ("[-i] [-o] [-v] [-w] [-t] [-b blocksize] [-n blocks-per-vol] [-l label] [device]")
FLAG ('i', rd_flag)
#ifdef DEBUG
FLAG ('D', tron)
#endif
FLAG ('o', wr_flag)
FLAG ('t', dsp_vols)
FLAG ('v', dsp_blks)
FLAG ('w', vfy_vols)
STRING ('b', bsizstr)
if ((blk_siz = kval(bsizstr)) == -1)
fatal("** Illegal block size %s", bsizstr);
else if (blk_siz < MINBLK)
fatal("** Minimum block size is %d", MINBLK);
else { /* test if blk_siz value fits in int */
t_int = blk_siz;
if (blk_siz != t_int)
fatal("** Block size too big");
}
NUMBER ('n', blk_lim)
STRING ('l', label)
if (index(label, ' ') != 0)
fatal("** Label must not contain white space");
ENDOPTS
prog_name = argv[0];
if (argc > 1)
device = argv[1];
tracef((tr, "BHDSIZ = %d VHDSIZ = %d", BHDSIZ, VHDSIZ));
tracef((tr, "prog_name:%s label:%s blk_siz:%ld",
prog_name, label, blk_siz));
tracef((tr, "blk_lim:%ld dsp_blks:%d dsp_vols:%d vfy_vols:%d",
blk_lim, dsp_blks, dsp_vols, vfy_vols));
if (rd_flag && wr_flag)
fatal("** Only -i or -o may be specified");
else if (rd_flag) {
if (access(device, ACCREAD) == -1)
sfatal(device);
rd_vols();
} else if (wr_flag) {
if (access(device, ACCREAD & ACCWRIT) == -1)
sfatal(device);
wrvols();
} else {
/* Print details of volume header */
/* Note: No prompt to mount volume */
if (access(device, ACCREAD) == -1)
sfatal(device);
if ((upvh = rd_vhdr(vol_file(device, 1))) != NULVHD)
print_vhdr(upvh);
}
trace("- main()");
exit(0);
}
long
kval(kstr)
char *kstr;
{
long n, atol(); /* return n */
char c;
trace("+ kstr()");
n = atol(kstr);
c = kstr[strlen(kstr)-1];
if (! isdigit(c)) {
switch (c) {
case 'b':case 'B':
n *= 512; break;
case 'k':case 'K':
n *= 1024; break;
/* case 'm':case 'M':
n *= 1024*1024; break; */
default:
n = -1;
}
}
trace("- kstr()");
return(n);
}