home *** CD-ROM | disk | FTP | other *** search
- /* DiskSave.c */
- /* 28 Jan 1996 13:06:28 */
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include "Backup_proto.h"
- #include "BackupStrings.h"
-
-
- #define SAVE_LIMIT (4*1024l*1024l) /* 4MB: größtes Laufwerk mit DiskSaveInfo */
-
-
- /* Info für Restart nach Disk-Schreibfehler */
- struct DiskSaveInfo
- {
- BOOL Allocated;
-
- APTR *SaveBuffers; /* Array SaveBuffers[Cylinders] */
- unsigned long SaveBuffCount; /* Länge von SaveBuffers */
- unsigned long LastUsedCyl;
-
- BPTR SaveFileHandle;
- char *SaveFileName;
- APTR FileBuffer;
- };
-
-
- /* globale Disk-Parameter, aus Backup.c */
- extern struct BackupDevInfo globDrvDat;
- extern struct BackupOptions myOptions; /* Einstellungen für die aktuelle Sicherung */
-
-
- struct DiskSaveInfo __far SaveDisk;
-
-
- unsigned long CreateSaveInfo(unsigned long FreeMemory)
- {
- unsigned long n, Capacity;
-
- DeleteSaveInfo();
-
- if (CYLSIZE_TAPE == globDrvDat.CylSize)
- return FreeMemory;
-
- if (!globDrvDat.isTape)
- {
- Capacity = globDrvDat.CylSize * globDrvDat.NumCyls;
-
- if (Capacity < FreeMemory/4)
- {
- /* maximal 1/4 des verfügbaren RAMs nutzen */
- /* Save-Buffer im Speicher */
-
- SaveDisk.SaveBuffCount = globDrvDat.NumCyls;
- SaveDisk.SaveBuffers = calloc(SaveDisk.SaveBuffCount, sizeof(APTR));
- if (SaveDisk.SaveBuffers == NULL)
- {
- return FreeMemory;
- }
-
- for (n=0; n<SaveDisk.SaveBuffCount; n++)
- {
- SaveDisk.SaveBuffers[n] = AllocVec(globDrvDat.CylSize, globDrvDat.BufMemType);
- if (SaveDisk.SaveBuffers[n] == NULL)
- {
- DeleteSaveInfo();
- return FreeMemory;
- }
- FreeMemory -= globDrvDat.CylSize;
- }
- }
- else if (Capacity < SAVE_LIMIT)
- {
- /* Save-Buffer auf Disk */
-
- SaveDisk.FileBuffer = AllocVec(globDrvDat.CylSize, globDrvDat.BufMemType);
- if (SaveDisk.FileBuffer == NULL)
- {
- DeleteSaveInfo();
- return FreeMemory;
- }
-
- SaveDisk.SaveFileName = tempname(myOptions.bo_DiskSavePrefix);
- if (NULL == SaveDisk.SaveFileName)
- return FreeMemory;
-
- if (SaveDisk.SaveFileName == NULL
- || (SaveDisk.SaveFileHandle = Open(SaveDisk.SaveFileName,
- MODE_NEWFILE)) == NULL)
- {
- DeleteSaveInfo();
- return FreeMemory;
- }
-
- NameFromFH(SaveDisk.SaveFileHandle, SaveDisk.SaveFileName, FMSIZE);
-
- FreeMemory -= globDrvDat.CylSize;
- }
-
- SaveDisk.LastUsedCyl = 0l;
- SaveDisk.Allocated = TRUE;
- }
-
- return FreeMemory;
- }
-
-
- void DeleteSaveInfo(void)
- {
- if (SaveDisk.SaveFileHandle != NULL)
- {
- Close(SaveDisk.SaveFileHandle);
- SaveDisk.SaveFileHandle = NULL;
-
- DeleteFile(SaveDisk.SaveFileName);
- }
- if (SaveDisk.FileBuffer)
- {
- FreeVec(SaveDisk.FileBuffer);
- SaveDisk.FileBuffer = NULL;
- }
- if (SaveDisk.SaveFileName)
- {
- free(SaveDisk.SaveFileName);
- SaveDisk.SaveFileName = NULL;
- }
-
- if (SaveDisk.SaveBuffers)
- {
- unsigned long n;
-
- for (n=0; n<SaveDisk.SaveBuffCount; n++)
- {
- if (SaveDisk.SaveBuffers[n])
- {
- FreeVec(SaveDisk.SaveBuffers[n]);
- SaveDisk.SaveBuffers[n] = NULL;
- }
- }
- free(SaveDisk.SaveBuffers);
- SaveDisk.SaveBuffers = NULL;
- }
- SaveDisk.Allocated = FALSE;
- }
-
-
- void RememberSaveInfo(unsigned long Offset, UBYTE *Data, unsigned long Length)
- {
- unsigned long Cyl, CylOffset, WriteLength;
-
- if (!SaveDisk.Allocated)
- return;
-
- Offset -= globDrvDat.FirstCyl * globDrvDat.CylSize;
-
- if (SaveDisk.SaveFileHandle)
- {
- Cyl = Offset / globDrvDat.CylSize;
- SaveDisk.LastUsedCyl = max(SaveDisk.LastUsedCyl, Cyl);
-
- if (Seek(SaveDisk.SaveFileHandle, Offset, OFFSET_BEGINNING) == -1
- || Write(SaveDisk.SaveFileHandle, Data, Length) != Length)
- {
- /* Positionier- oder Schreibfehler */
- PostError(TRUE, MSGPRI_Error, GetString(MSG_REMEMBERSAVE_IOERROR),
- "RememberSaveInfo",
- SaveDisk.SaveFileName, GetIoErrText() );
-
- DeleteSaveInfo();
- }
- }
- else
- {
- while (Length)
- {
- Cyl = Offset / globDrvDat.CylSize;
- CylOffset = Offset % globDrvDat.CylSize;
- WriteLength = min(globDrvDat.CylSize-CylOffset, Length);
-
- if (Cyl > SaveDisk.SaveBuffCount)
- {
- alarm(GetString(MSG_INTERNALERROR_CYLRANGE),
- __FUNC__, Cyl, SaveDisk.SaveBuffCount);
-
- DeleteSaveInfo();
- return;
- }
-
- SaveDisk.LastUsedCyl = max(SaveDisk.LastUsedCyl, Cyl);
-
- CopyMem(Data, ((UBYTE *)SaveDisk.SaveBuffers[Cyl]) + CylOffset,
- WriteLength);
-
- Data += WriteLength;
- Length -= WriteLength;
- Offset += WriteLength;
- }
- }
- }
-
-
- void ResetDiskSave(void)
- {
- SaveDisk.LastUsedCyl = 0l;
- }
-
-
- BOOL DiskSaveAvailable(void)
- {
- return (BOOL) SaveDisk.Allocated;
- }
-
-
- APTR RetrieveSaveInfo(unsigned long Cyl)
- {
- APTR Result = NULL;
-
- if (Cyl <= SaveDisk.LastUsedCyl)
- {
- if (SaveDisk.SaveFileHandle)
- {
- unsigned long Offset;
-
- Offset = Cyl * globDrvDat.CylSize;
- if (Seek(SaveDisk.SaveFileHandle, Offset, OFFSET_BEGINNING) == -1
- || Read(SaveDisk.SaveFileHandle, SaveDisk.FileBuffer,
- globDrvDat.CylSize) != globDrvDat.CylSize)
- {
- alarm(GetString(MSG_RETRIEVESAVE_IOERROR),
- __FUNC__, SaveDisk.SaveFileName,
- GetIoErrText() );
- myabort(20);
- }
-
- Result = SaveDisk.FileBuffer;
- }
- else
- Result = SaveDisk.SaveBuffers[Cyl];
- }
-
- return Result;
- }
-
-
- BOOL isDiskSaveFile(char *Path, char *FileName)
- {
- char FilePath[FMSIZE];
-
- if (SaveDisk.SaveFileHandle == NULL)
- return FALSE;
-
- stccpy(FilePath, Path, sizeof(FilePath));
- if (!AddPart(FilePath, FileName, sizeof(FilePath)))
- return FALSE;
-
- return (BOOL) (stricmp(FilePath, SaveDisk.SaveFileName) == 0);
- }
-
-
- char *tempname(const char *prefix)
- {
- char *result;
- int randomnumber;
-
- if (prefix == NULL)
- prefix = "t:temp";
-
- result = malloc(strlen(prefix)+5);
- if (NULL == result)
- return NULL;
-
- do {
- randomnumber = rand() % 10000; /* nur 4stellig */
- sprintf(result, "%s%04d", prefix, randomnumber);
- } while (access(result, F_OK) == 0);
-
- return result;
- }
-
-
-