home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d03xx
/
d0365.lha
/
EasyBackup
/
support.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-12
|
12KB
|
502 lines
/*************************************************/
/* EasyBackup, Support.c (c)1989 Oliver Enseling */
/*************************************************/
#include <exec/types.h>
#include <exec/io.h>
#include <exec/devices.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <devices/trackdisk.h>
#include <intuition/intuition.h>
#include <dos.h>
#include <proto/all.h>
#include <devices/audio.h>
#include <intuition/intuition.h>
#include <stdlib.h>
#include <ctype.h>
#define TRACK_SIZE (11 * TD_SECTOR)
#define LABEL_SIZE (11 * 16)
#define MAX_TRACKS 160
#define MAX_SECTORS (11 * MAX_TRACKS)
#define CONFIG_NAME "S:EasyBackup.config"
#define BUFFER_SIZE (1024) /* 1K File Buffer */
#define DATEIENDEMARKE 'ú' /* empirisch sehr wenig
* vorkommendes Zeichen */
#define ID_FILE 0
#define ID_DIR 1
#define ID_ENDDIR 2
struct NewWindow TrackNW =
{20, 20, 200, 50, 0, 1, NULL, SMART_REFRESH, NULL, NULL,
(UBYTE *) "EasyBackup Disk-Status",
NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN};
struct Window *TrackWin = NULL;
struct IntuitionBase *IntuitionBase;
extern int _OSERR;
BYTE *TrackBuffer, *LabelBuffer, *FileBuffer;
struct IOExtTD *TrackDiskBlock;
/* MakeDB: Device-Block anlegen und initialisieren */
void *
MakeDB(len)
LONG len;
{
struct MsgPort *p;
APTR req;
if (!(p = (struct MsgPort *) CreatePort(0L, 0L)))
return (NULL);
if (!(req = (APTR) CreateExtIO(p, len))) {
DeletePort(p);
return (NULL);
}
return (req);
}
/* FreeDB: Device-Block freigeben */
void
FreeDB(req)
struct IORequest *req;
{
if (req != 0L) {
if (req->io_Message.mn_ReplyPort != 0L)
DeletePort(req->io_Message.mn_ReplyPort);
DeleteExtIO(req);
}
}
/* InitDevice: Device ÷ffnen und initialisieren */
BOOL
InitDevice(name, unit, req, fl, len)
char *name;
LONG unit;
struct IORequest **req;
ULONG fl, len;
{
if (len != 0L)
if (!(*req = MakeDB(len)))
return (FALSE);
if (OpenDevice(name, unit, *req, fl))
return (FALSE);
else
return (TRUE);
}
/* ExitDevice: Device schlie▀en und Device-Block freigeben */
void
ExitDevice(req)
struct IORequest *req;
{
if (req != 0L) {
if (req->io_Message.mn_ReplyPort != 0L)
DeletePort(req->io_Message.mn_ReplyPort);
if (req->io_Device != 0L)
CloseDevice(req);
DeleteExtIO(req);
}
}
/* DeviceCommmand: Device-Kommando ausfⁿhren */
void
DeviceCommand(db, com)
struct IORequest *db;
UWORD com;
{
db->io_Command = com;
DoIO(db);
}
/* Fehlermeldungen des Trackdisk.device */
#ifdef DEUTSCH
char *Errors[] =
{
"Nicht bestimmt.",
"Kein Sektorkopf.",
"Fehlerhafte SektorprΣambel.",
"Fehlerhafte Sektoridentifikation.",
"Fehlerhafte Sektorkopfsumme.",
"Fehlerhafte Sektorsumme.",
"Nicht genⁿgend Sektoren.",
"Fehlerhafter Sektorkopf.",
"Diskette schreibgeschⁿtzt.",
"Diskette gewechselt.",
"Fehler beim Suchen.",
"Nicht genⁿgend Speicher.",
"Falsche Laufwerksnummer.",
"Falscher Laufwerkstyp.",
"Laufwerk ist schon Betrieb.",
"Zugriff nach System-Reset."};
#else
char *Errors[] =
{
"Not defined",
"No sector header",
"Wrong sector preambule",
"Wrong sector id",
"Wrong sector head checksum",
"Wrong sector checksum",
"Not enough sectors",
"Wrong sector header",
"Disk write-protected",
"Diskette gewechselt.",
"Search error",
"Not enough memory",
"Wrong drive number",
"Wrong drive type",
"Drive already in use",
"Access past system reset"};
#endif
char *
TrackDiskError(fn)
LONG fn;
{
if ((fn >= 20) && (fn <= 35))
return (Errors[fn - 20]);
#ifdef DEUTSCH
else
return ("Fehlerdiagnose nicht m÷glich.");
#else
else
return ("Unknown error");
#endif
}
/* WaitDisk: auf eine neue Diskette warten */
void
WaitDisk(db)
struct IOExtTD *db;
{
do {
DeviceCommand(db, (UWORD) TD_CHANGESTATE);
}
while (db->iotd_Req.io_Actual == 0);
do {
DeviceCommand(db, (UWORD) TD_CHANGESTATE);
}
while (db->iotd_Req.io_Actual != 0);
}
/* ReadTrack: einen Track lesen */
void
ReadTrack(db, tbuf, lbuf, nr)
struct IOExtTD *db;
BYTE *tbuf;
BYTE *lbuf;
LONG nr;
{
FOREVER
{
DeviceCommand(db, (UWORD) TD_CHANGENUM);
db->iotd_Count = db->iotd_Req.io_Actual;
db->iotd_Req.io_Data = (APTR) tbuf;
db->iotd_SecLabel = (ULONG) lbuf;
db->iotd_Req.io_Length = TRACK_SIZE;
db->iotd_Req.io_Offset = nr * TRACK_SIZE;
DeviceCommand(db, (UWORD) ETD_READ);
if (db->iotd_Req.io_Error) {
#ifdef DEUTSCH
printf("Fehler beim Lesen von Spur #%d\n%s\n",
nr, TrackDiskError((LONG) db->iotd_Req.io_Error));
#else
printf("Error reading track Track #%d\n%s\n",
nr, TrackDiskError((LONG) db->iotd_Req.io_Error));
#endif
UserRequest();
} else
break;
}
}
/* Alles ge÷ffnete schlie▀en und Programm beenden */
void
CloseAll(err)
int err;
{
if (TrackWin) {
CloseWindow(TrackWin);
TrackWin = NULL;
}
if (IntuitionBase)
CloseLibrary(IntuitionBase);
if ((LONG) TrackDiskBlock->iotd_Req.io_Device != -1) {
if (!TrackDiskBlock->iotd_Req.io_Error)
EndBackup();
ExitDevice(TrackDiskBlock);
} else
FreeDB(TrackDiskBlock);
if (TrackBuffer)
FreeMem(TrackBuffer, TRACK_SIZE + LABEL_SIZE);
if (FileBuffer)
FreeMem(FileBuffer, BUFFER_SIZE);
exit (err);
}
/* UserRequest: Ja-Nein-Abfrage */
void
UserRequest()
{
char c;
#ifdef DEUTSCH
printf("Abbrechen ? \033[32m(J/N)\033[31m");
#else
printf("Abort ? \033[32m(Y/N)\033[31m");
#endif
FOREVER
{
c = getchar();
#ifdef DEUTSCH
if (toupper(c) == 'J') {
printf("Abbruch !!!\n");
CloseAll(1);
}
#else
if (toupper(c) == 'Y') {
printf("Aborted\n");
CloseAll(1);
}
#endif
if (toupper(c) == 'N')
return;
}
}
int
DoNothing()
{
return (0);
}
/* Alles ben÷tigte ╓ffnen */
void
OpenAll(devunit)
int devunit;
{
if (onbreak(DoNothing))
#ifdef DEUTSCH
printf("Fehler beim Installieren der Unterbrechungsabfangroutine !!!\n"
"Bei Unterbrechen des Programmes mit Ctrl-C oder Ctrl-D\n"
"kann Datenverlust entstehen !\n");
#else
printf("Error installing routine to catch user breaks\n"
"User breaks by Ctrl-C or Ctrl-D may lead into loss of data\n");
#endif
if (!InitDevice("trackdisk.device", devunit, &TrackDiskBlock, 0,
sizeof(*TrackDiskBlock))) {
#ifdef DEUTSCH
printf("Trackdisk.device kann nicht ge÷ffnet werden !!!\n"
"Prⁿfen sie, ob das Laufwerk vorhanden ist.\n");
#else
printf("Unable to open trackdisk.device\n"
"Check disk drive\n");
#endif
exit(10);
}
if (!(TrackBuffer = AllocMem(TRACK_SIZE * 2 + LABEL_SIZE, MEMF_CHIP))) {
#ifdef DEUTSCH
printf("Nicht genⁿgend CHIP-Speicher !!!\n");
#else
printf("Not enough CHIP-memory\n");
#endif
CloseAll(20);
}
LabelBuffer = TrackBuffer + 2 * TRACK_SIZE;
if (!(FileBuffer = AllocMem(BUFFER_SIZE, MEMF_PUBLIC))) {
#ifdef DEUTSCH
printf("Nicht genⁿgend Speicher fⁿr Datenpuffer (1K) !!!\n");
#else
printf("Not enough memory for data buffer (1K)\n");
#endif
CloseAll(20);
}
if (IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0))
TrackWin = OpenWindow(&TrackNW);
}
/*
* ConcatPath: einen Dateinamen zusammensetzen p1: Directory oder
* Device p2: Directory oder Filename
*/
void
ConcatPath(buffer, p1, p2)
char *buffer, *p1, *p2;
{
strcpy(buffer, p1);
if (strlen(p1) > 0 && strlen(p2) > 0)
if (buffer[strlen(buffer) - 1] != ':')
strcat(buffer, "/");
strcat(buffer, p2);
}
/* FileAbfrage: Abfrage fⁿr interaktiven Modus */
BOOL
FileAbfrage()
{
char antwort[2];
do {
#ifdef DEUTSCH
printf("\033[33mJ\033[0ma/\033[33mN\033[0mein ");
#else
printf("\033[33mY\033[0mes/\033[33mN\033[0mo ");
#endif
scanf("%1s", antwort);
}
#ifdef DEUTSCH
while (tolower(antwort[0]) != 'j' && tolower(antwort[0]) != 'n');
return ((BOOL) (tolower(antwort[0]) == 'j'));
#else
while (tolower(antwort[0]) != 'y' && tolower(antwort[0]) != 'n');
return ((BOOL) (tolower(antwort[0]) == 'y'));
#endif
}
/*
* Beep: einen Ton variabler H÷he und LΣnge ausgeben freq: Frequenz
* cycles: Anzahl der Delay-Zyklen (1/50-Sekunde)
*/
UBYTE Channel_Map[] =
{1, 8, 2, 4};
BYTE WaveForm[] =
{0, 39, 74, 102, 120, 127, 120, 102, 74, 39,
0, -40, -75, -103, -121, -127, -121, -103, -75, -40};
struct IOAudio *
MakeIOA(rate, vol, repeat, buf, len)
LONG rate, vol, repeat;
UBYTE *buf;
LONG len;
{
struct IOAudio *ioa;
struct MsgPort *port;
char *PortName;
PortName = "Beep-Port";
/* IO-Request holen */
if (ioa = (struct IOAudio *) AllocMem((LONG) sizeof(struct IOAudio),
MEMF_PUBLIC | MEMF_CLEAR)) {
ioa->ioa_Request.io_Message.mn_Node.ln_Pri = 10;
if (!(port = CreatePort(PortName, 0L))) {
FreeMem(ioa, (LONG) sizeof(struct IOAudio));
/* War nix */
} else {
/* Audio-Kanal holen */
ioa->ioa_Request.io_Message.mn_ReplyPort = port;
ioa->ioa_Data = Channel_Map;
ioa->ioa_Length = (LONG) sizeof(Channel_Map);
/* Audio Device oeffnen */
if (OpenDevice(AUDIONAME, 0L, (struct IORequest *) ioa,
0L)) {
/* war nix */
DeletePort(port);
FreeMem(ioa, (LONG) sizeof(struct IOAudio));
} else {
/* Request initialisieren */
ioa->ioa_Request.io_Flags = ADIOF_PERVOL;
ioa->ioa_Request.io_Command = CMD_WRITE;
ioa->ioa_Period = (SHORT) (3579545L / rate);
ioa->ioa_Volume = (SHORT) vol;
ioa->ioa_Length = len;
ioa->ioa_Data = buf;
ioa->ioa_Cycles = (SHORT) repeat;
}
}
}
return (ioa);
}
void
Beep(freq, dauer, vol)
LONG freq, dauer, vol;
{
BYTE *DataPtr;
LONG PlayLen = sizeof(WaveForm);
LONG rate;
struct IOAudio *ioa;
rate = freq * sizeof(WaveForm);
if (DataPtr = (BYTE *) AllocMem(sizeof(WaveForm), MEMF_CHIP)) {
memcpy(DataPtr, WaveForm, sizeof(WaveForm));
/* IO-Request initialisieren */
if (ioa = MakeIOA(rate, vol, 0, DataPtr, PlayLen)) {
/* Starten */
BeginIO((struct IORequest *) ioa);
Delay(dauer);
AbortIO((struct IORequest *) ioa); /* Halt!!! */
if (ioa->ioa_Request.io_Device) {
CloseDevice((struct IORequest *) ioa);
}
if (ioa->ioa_Request.io_Message.mn_ReplyPort) {
DeletePort(ioa->ioa_Request.io_Message.mn_ReplyPort);
}
if (ioa) {
FreeMem(ioa, (LONG) sizeof(struct IOAudio));
}
}
FreeMem(DataPtr, sizeof(WaveForm));
}
}
/* Ausgabe fⁿr die Trackanzeige */
struct IntuiText TrackText =
{2, 0, JAM2, 0, 0, NULL, (UBYTE *) " "};
void
PrintTrack(nr)
{
if (TrackWin) {
#ifdef DEUTSCH
sprintf(TrackText.IText, "Spur:%3d, Kopf:%2d", nr / 2, nr % 2);
#else
sprintf(TrackText.IText,"Track:%3d, Head:%2d",nr / 2,nr % 2);
#endif
PrintIText(TrackWin->RPort, &TrackText, 20, 34);
}
}
void
PrintDisk(nr)
{
if (TrackWin) {
#ifdef DEUTSCH
sprintf(TrackText.IText, "Diskette:%4d", nr);
#else
sprintf(TrackText.IText, "Disk:%4d", nr);
#endif
PrintIText(TrackWin->RPort, &TrackText, 20, 18);
}
}