|
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 v
Length: 2489 (0x9b9) Types: TextFile Names: »vhdr.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec8/multivol/vhdr.c«
/* multivol V1.00 5-Jun-85 Tony O'Hagan * multivol (8) - handle multivolume files * vhdr.c - functions performed on volume header */ #include <stdio.h> #include "multivol.h" extern long blk_siz, blk_lim; extern char *label; up_vhdr * rd_vhdr(devname) char *devname; /* Read volume header from the first block and rewind (close()) the volume */ { up_vhdr *ans; int dev; int n_read; char *blk; char *new_buf(); up_vhdr *unpack_vhdr(); void free(); tracef((tr, "+ rd_vhdr(%s)", devname)); if ((dev = open(devname, READ)) == -1) { swarning(devname); trace("- rd_vhdr()"); return(NULVHD); } blk = new_buf(blk_siz); trace("reading volume header"); tracef((tr, "read(%d, %x, %d)", dev, blk, (int)blk_siz)); if ((n_read = read(dev, blk, (int)blk_siz) ) == -1) { swarning(devname); ans = NULVHD; } else { if (n_read == 0) { fprintf(stderr, "** No header found on volume\n"); ans = NULVHD; } else if (n_read < MINBLK) { fprintf(stderr, "** Header block is only %d bytes\n", n_read); ans = NULVHD; } else { /* vol_hdr after blk_hdr */ tracef((tr, "blk+BHDSIZ = %x", (vol_hdr *)(blk + BHDSIZ))); if (NULVHD == (ans = unpack_vhdr((vol_hdr *)(blk + BHDSIZ))) ) fprintf(stderr, "** Invalid volume header\n"); } } close(dev); trace("free(blk)"); free(blk); trace("- rd_vhdr()"); return ans ; } void print_vhdr(up) up_vhdr *up; /* Print volume header details */ { #ifndef time_t # include <sys/types.h> #endif char *ctime(); time_t t_stamp; trace("+print_vhdr()"); t_stamp = (time_t) up->up_timestamp; /* Note: ctime() returns date & time with a \n following */ fprintf(stderr, "Written using: %s V%s Label: %s %s", up->up_prog_name, up->up_version, up->up_label, ctime(&t_stamp) ); fprintf(stderr, "Vol. no.: %d Block size: %ld Blocks per volume: %ld\n", up->up_vol_num, up->up_siz_blk, up->up_lim_blk); trace("-print_vhdr()"); } void pack_vhdr(pk, vol_num, timestamp) char *pk; int vol_num; long timestamp; { sprintf(pk, VHDPACK, vol_num, PROGNAM, VERSION, label, timestamp, blk_siz, blk_lim); } up_vhdr * unpack_vhdr(pk) vol_hdr *pk; { static up_vhdr up; tracef((tr, "+ unpack_vhdr(pk = %x)", pk)); if(VHDFIELDS == sscanf((char *)pk, VHDUNPACK, &up.up_vol_num, up.up_prog_name, up.up_version, up.up_label, &up.up_timestamp, &up.up_siz_blk, &up.up_lim_blk)) { trace("- unpack_vhdr"); return &up; } else { trace("- unpack_vhdr = NULVHD"); return NULVHD; } }