home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d3xx
/
d365
/
easybackup.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);
}
}