home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
prog
/
c
/
hardbloc.lha
/
HardBlocks
/
src
/
tool.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-04
|
8KB
|
282 lines
/* $Revision Header *** Header built automatically - do not edit! ***********
*
* (C) Copyright 1992 by Torsten Jürgeleit
*
* Name .....: tool.c
* Created ..: Wednesday 19-Feb-92 10:05:27
* Revision .: 2
*
* Date Author Comment
* ========= ==================== ====================
* 27-Apr-92 Torsten Jürgeleit add no library option
* 11-Mar-92 Torsten Jürgeleit argv[ARGUMENT_UNIT] is a (BYTE *)
* 19-Feb-92 Torsten Jürgeleit Created this file!
*
****************************************************************************
*
* Tool for manipulating hardblocks
*
* $Revision Header ********************************************************/
/* Includes */
#include <exec/types.h>
#include <devices/hardblocks.h>
#include <libraries/arpbase.h>
#include <functions.h>
#include <stdlib.h>
#ifndef LINK_TEST
#include "hardblocks.h"
#else LINK_TEST
#include "hardblocks_link.h"
#endif LINK_TEST
/* Defines */
#define DEFAULT_DEVICE "scsi.device"
#define DEFAULT_UNIT "0"
#define MAX_ARGUMENTS 11
#define ARGUMENT_DEVICE 0
#define ARGUMENT_UNIT 1
#define ARGUMENT_FILE 2
#define ARGUMENT_LOAD 3
#define ARGUMENT_RESTORE 4
#define ARGUMENT_DEFAULT 5
#define ARGUMENT_SHOW 6
#define ARGUMENT_OUTPUT 7
#define ARGUMENT_SAVE 8
#define ARGUMENT_BACKUP 9
#define ARGUMENT_REMOVE 10
/* Externals */
IMPORT struct DOSBase *DOSBase;
/* Globals */
struct ArpBase *ArpBase;
#ifndef LINK_TEST
struct Library *HardBlocksBase;
#endif LINK_TEST
BYTE template[] = "Device,Unit,FILE/k,LOAD/s,RESTORE/s,DEFAULT/s,SHOW/s,"
"OUTPUT/k,SAVE/s,BACKUP/s,REMOVE/s",
xtra_help[] = "HBtool v1.1 - Copyright © 1992 Torsten Jürgeleit\n\n"
"Usage: HBtool [Device] [Unit] [FILE name] [LOAD]"
" [RESTORE] [DEFAULT] [SHOW] [OUTPUT file] [SAVE]"
" [BACKUP] [REMOVE]\n"
"\t[Device] = device name (default: scsi.device)\n"
"\t[Unit] = device unit num (default 0)\n"
"\t[FILE name] = file to restore/save hardblocks\n"
"\t[LOAD] = load hardblocks from device (default)\n"
"\t[RESTORE] = restore hardblocks from file\n"
"\t[DEFAULT] = create standard rigid disk block\n"
"\t[SHOW] = show currently loaded hardblocks (default)\n"
"\t[OUTPUT file] = output file for show (default: NULL -> stdout)\n"
"\t[SAVE] = save currently loaded hardblocks to device\n"
"\t[BACKUP] = backup currently loaded hardblocks to file\n"
"\t[REMOVE] = delete rigid disk block from device";
/* Prototypes */
LONG _main(LONG alen, BYTE *aptr);
BOOL safety_check(BYTE *device, ULONG unit);
/* Main routine - no startup code */
LONG
_main(LONG alen, BYTE *aptr)
{
LONG return_code = RETURN_FAIL;
/* First open ARP library */
if (!(ArpBase = OpenLibrary(ArpName, ArpVersion))) {
Write(Output(), "Need ARP library V39+\n", 22L);
} else {
#ifndef LINK_TEST
if (!(HardBlocksBase = OpenLibrary(HardBlocksName,
HardBlocksVersion))) {
Puts("Need hardblocks library");
} else {
#endif LINK_TEST
BYTE *argv[MAX_ARGUMENTS];
USHORT i;
/* Clear argument array */
for (i = 0; i < MAX_ARGUMENTS; i++) {
argv[i] = NULL;
}
/* Parse command line arguments */
if (GADS(aptr, alen, &xtra_help[0], &argv[0], &template[0]) < 0) {
Puts(argv[0]);
} else {
struct RigidDiskBlock rdb;
BPTR fh;
BYTE *device, *file = argv[ARGUMENT_FILE];
ULONG unit;
USHORT error;
/* Install default arguments if not present */
if (!argv[ARGUMENT_DEVICE]) {
argv[ARGUMENT_DEVICE] = DEFAULT_DEVICE;
}
device = argv[ARGUMENT_DEVICE];
if (!argv[ARGUMENT_UNIT]) {
argv[ARGUMENT_UNIT] = DEFAULT_UNIT;
}
unit = Atol(argv[ARGUMENT_UNIT]);
if (!argv[ARGUMENT_LOAD] && !argv[ARGUMENT_RESTORE] &&
!argv[ARGUMENT_DEFAULT] && !argv[ARGUMENT_REMOVE]) {
argv[ARGUMENT_LOAD] = (BYTE *)-1L;
}
if (!argv[ARGUMENT_SHOW] && !argv[ARGUMENT_SAVE] &&
!argv[ARGUMENT_BACKUP] && !argv[ARGUMENT_REMOVE]) {
argv[ARGUMENT_SHOW] = (BYTE *)-1L;
}
/* Get output file handle for show */
if (argv[ARGUMENT_SHOW]) {
BYTE *output = argv[ARGUMENT_OUTPUT];
if (!output) {
fh = Output();
} else {
if (!(fh = Open(output, (LONG)MODE_NEWFILE))) {
Printf("Can't open '%s'\n", output);
error = HBERR_FILE_OPEN_FAILED;
}
}
}
/* Load hardblocks from device */
if (!error && argv[ARGUMENT_LOAD]) {
Printf("Loading hardblocks from unit %ld of `%s'\n", unit,
device);
if (!(error = LoadHardBlocks(&rdb, device, unit))) {
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW]) {
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_BACKUP]) {
if (!file) {
Printf("No backup file name\n");
error = HBERR_FILE_OPEN_FAILED;
} else {
Printf("Backup hardblocks to `%s'\n", file);
error = BackupHardBlocks(&rdb, file);
}
}
FreeHardBlocks(&rdb);
}
}
/* Restore hardblocks from file */
if (!error && argv[ARGUMENT_RESTORE]) {
if (!file) {
Printf("No restore file name\n");
error = HBERR_FILE_OPEN_FAILED;
} else {
Printf("Restoring hardblocks from `%s'\n", file);
if (!(error = RestoreHardBlocks(&rdb, file))) {
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW]) {
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_SAVE]) {
Printf("Saving hardblocks to unit %ld of"
" `%s'\n", unit, device);
if (safety_check(device, unit) == TRUE) {
error = SaveHardBlocks(&rdb, device, unit);
}
}
FreeHardBlocks(&rdb);
}
}
}
/* Create standard rigid disk block */
if (!error && argv[ARGUMENT_DEFAULT]) {
Printf("Creating standard rigid disk block for unit %ld"
" of `%s'\n", unit, device);
if (!(error = InitRigidDiskBlock(&rdb, device, unit))) {
/* Now play with hardblocks data */
if (argv[ARGUMENT_SHOW]) {
error = PrintHardBlocks(&rdb, fh);
}
if (!error && argv[ARGUMENT_SAVE]) {
Printf("Saving hardblocks to unit %ld of `%s'\n", unit,
device);
if (safety_check(device, unit) == TRUE) {
error = SaveHardBlocks(&rdb, device, unit);
}
}
if (!error && argv[ARGUMENT_BACKUP]) {
if (!file) {
Printf("No backup file\n");
error = HBERR_FILE_OPEN_FAILED;
} else {
Printf("Backup hardblocks to `%s'\n", file);
error = BackupHardBlocks(&rdb, file);
}
}
FreeHardBlocks(&rdb);
}
}
/* Delete rigid disk block */
if (!error && argv[ARGUMENT_REMOVE]) {
Printf("Removing hardblocks from unit %ld of `%s'\n", unit,
device);
if (safety_check(device, unit) == TRUE) {
error = RemoveHardBlocks(device, unit);
}
}
/* Close output file handle opened for show */
if (argv[ARGUMENT_SHOW] && argv[ARGUMENT_OUTPUT]) {
Close(fh);
}
/* Print error msg */
if (error) {
Printf("Error: primary=%d secondary=%ld\n", error, IoErr());
} else {
return_code = RETURN_OK;
}
}
#ifndef LINK_TEST
CloseLibrary(HardBlocksBase);
}
#endif LINK_TEST
CloseLibrary(ArpBase);
}
/* MANX crt0.asm forget to close DOS library, so we have to do it */
CloseLibrary(DOSBase);
return(return_code);
}
/* Safety check before any writing to device unit */
STATIC BOOL
safety_check(BYTE *device, ULONG unit)
{
BYTE buffer[MaxInputBuf];
BOOL answer = FALSE;
Printf("DANGER: Do you really want to change hardblocks on unit %ld of\n"
" device `%s' (YES|NO)? ", unit, device);
ReadLine(&buffer[0]);
if (strcmp(&buffer[0], "YES")) {
Puts("Change aborted");
} else {
answer = TRUE;
}
return(answer);
}