1
0
Files
irix-657m-src/eoe/cmd/bru/inspect.c
2022-09-29 17:59:04 +03:00

222 lines
4.8 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/************************************************************************
* *
* Copyright (c) 1984, Fred Fish *
* All Rights Reserved *
* *
* This software and/or documentation is protected by U.S. *
* Copyright Law (Title 17 United States Code). Unauthorized *
* reproduction and/or sales may result in imprisonment of up *
* to 1 year and fines of up to $10,000 (17 USC 506). *
* Copyright infringers may also be subject to civil liability. *
* *
************************************************************************
*/
/*
* FILE
*
* inspect.c routines for doing self consistency checks
*
* SCCS
*
* @(#)inspect.c 9.11 5/11/88
*
* DESCRIPTION
*
* Contains routines for doing archive self consistency check.
* A self consistency check scans every block of the archive,
* verifying the checksum, the file logical block number,
* the header information, etc.
*
*/
#include "autoconfig.h"
#include <stdio.h>
#if (unix || xenix)
# include <sys/types.h>
# include <sys/stat.h>
#else
# include "sys.h"
#endif
#include "typedefs.h" /* Locally defined types */
#include "dbug.h"
#include "manifest.h" /* Manifest constants */
#include "config.h" /* Configuration information */
#include "errors.h" /* Error codes */
#include "blocks.h" /* Archive format */
#include "macros.h" /* Useful macros */
#include "trees.h" /* Tree types */
#include "finfo.h" /* File information structure */
/*
* External bru functions.
*/
extern BOOLEAN confirmed (); /* Confirm action */
extern BOOLEAN chksum_ok (); /* Test for good checksum */
extern VOID ar_close (); /* Flush buffers and close the archive */
extern VOID ar_open (); /* Open the archive */
extern union blk *ar_next (); /* Get pointer to next archive block */
extern VOID ar_read (); /* Read archive block */
extern VOID reload (); /* Reload first volume for rescan */
extern S32BIT fromhex (); /* Convert hex to 32 bit integer */
extern VOID verbosity (); /* Give a verbosity message */
extern VOID scan (); /* Scan an archive */
/*
* External bru variables.
*/
extern char mode; /* Current mode (citdxh) */
/*
* Local functions.
*/
static VOID fcheck (); /* Check file */
static VOID ccheck (); /* Check contents */
/*
* FUNCTION
*
* inspect mainline for the inspect mode
*
* SYNOPSIS
*
* VOID inspect ()
*
* DESCRIPTION
*
* Mainline for the inspect mode. Called after all initialization
* is complete. Controls inspection of archive.
*
*/
VOID inspect ()
{
DBUG_ENTER ("inspect");
mode = 'i';
reload ("archive inspection");
ar_open ();
scan (fcheck);
ar_close ();
DBUG_VOID_RETURN;
}
/*
* FUNCTION
*
* fcheck check a single file in archive
*
* SYNOPSIS
*
* static VOID fcheck (blkp, fip)
* register union blk *blkp;
* register struct finfo *fip;
*
* DESCRIPTION
*
* Given pointer to the header block of an archived file (blkp)
* and pointer to a file info structure for archived file (fip),
* examines the file for readability and self consistency.
*
*/
/*
* PSEUDO CODE
*
* Begin fcheck
* If file is explicitly or implicitly named then
* If action confirmed then
* Issue verbosity message
* If the file is a regular file and not linked then
* Check the file contents
* End if
* End if
* End if
* End fcheck
*
*/
static VOID fcheck (blkp, fip)
register union blk *blkp;
register struct finfo *fip;
{
DBUG_ENTER ("fcheck");
if (IS_LEAF (fip) || IS_EXTENSION (fip)) {
if (confirmed ("i %s", fip)) {
verbosity (fip);
if (IS_REG (fip -> statp -> st_mode) && !LINKED (blkp)) {
ccheck (fip);
}
}
}
DBUG_VOID_RETURN;
}
/*
* FUNCTION
*
* ccheck check contents of an archive file
*
* SYNOPSIS
*
* static VOID ccheck (fip)
* register struct finfo *fip;
*
* DESCRIPTION
*
* Given pointer to a file info structure for and archived file,
* examines the file's archived contents for consistency and
* data integrity.
*
* BUGS
*
* This function needs to be expanded to perform more
* comprehensive checks. Currently only checks readibility
* and checksums for each block. Need to also check headers.
* Notice that simply reading the block also verifies it's
* checksum via "scan" and "ar_read".
*
*/
/*
* PSEUDO CODE
*
* Begin ccheck
* Get size of the file to check
* While there is more archive blocks to check
* Seek to the next archive block
* Read the archive block
* Reduce number of bytes left to read
* End while
* End ccheck
*
*/
static VOID ccheck (fip)
register struct finfo *fip;
{
register S32BIT bytes;
DBUG_ENTER ("ccheck");
DBUG_PRINT ("verify", ("verify contents of %s", fip -> fname));
bytes = ZSIZE (fip);
while (bytes > 0L) {
(VOID) ar_next ();
ar_read (fip);
bytes -= DATASIZE;
}
DBUG_VOID_RETURN;
}