home *** CD-ROM | disk | FTP | other *** search
- /* CmdFile.c */
- /* 23 Mar 1996 13:05:51 */
-
- #ifndef BACKUP_INCLUDE
- #include "IncludeAll.c"
- #endif
- #include "Backup.h"
- #include "FileSelect.h"
- #include "Backup_proto.h"
- #include "BackupStrings.h"
-
-
- /* aus Revision.c */
- extern SHORT Version;
-
-
- FILE *aktCmdFile = NULL; /* fp für Kommandofile */
- char __far CmdFileName[FMSIZE]; /* Name des Kommandofile */
-
- static char __far LastCmdFileName[FMSIZE];
-
- static short CheckFSEntry(struct FSDir *Dir, struct FSDirEntry *FSe,
- struct BackupOptions *Opt, FILE *NewCmdFile);
- static char *ProcessIncludeFile(char *line, struct FSDir **Dir, struct BackupOptions *Opt);
-
- static unsigned short LineNo = 0;
-
-
- /* liefert TRUE wenn Ok */
- BOOL OpenCmdFile(const char *name)
- {
- ASSERT_VALID(name);
- LineNo = 0;
- stccpy(LastCmdFileName, name, sizeof(LastCmdFileName));
- aktCmdFile = fopen(name, "r");
- if (aktCmdFile == NULL)
- {
- alarm(GetString(MSG_CANNOTOPEN_CMDFILE),
- ShortFileName(NurName(name), 60), GetIoErrText() );
- return FALSE;
- }
- return TRUE;
- }
-
-
- void CloseCmdFile(void)
- {
- if (aktCmdFile)
- {
- fclose(aktCmdFile);
- aktCmdFile = NULL;
- }
- }
-
-
- void WriteCmdFile(struct Window *Win, char *FileName, short withIcon,
- struct BackupOptions *Opt)
- {
- struct FSDir *Dir;
- char FileMode[] = "w", CmdLine[FMSIZE+50] = "";
- FILE *NewCmdFile;
- short erg, error = 0;
-
- ASSERT_VALID(Win);
- ASSERT_VALID(FileName);
- ASSERT_VALID(Opt);
-
- stccpy(LastCmdFileName, FileName, sizeof(LastCmdFileName));
-
- if (access(FileName, 0) == 0)
- {
- /* Kommandofile gibt es schon */
- erg = AskReplace(Win, GetString(MSG_CMDFILE_EXISTS),
- ShortFileName(NurName(FileName), 30));
-
- if (erg == *GetString(MSG_ABORT_SHORT))
- {
- /* Abbruch */
- return;
- }
- else if (erg == *GetString(MSG_APPEND_SHORT))
- {
- /* Append */
- *FileMode = 'a';
- }
- else if (erg == *GetString(MSG_REPLACE_SHORT))
- {
- /* Replace */
- *FileMode = 'w';
- }
- }
-
- NewCmdFile = fopen(FileName, FileMode);
- if (NewCmdFile == NULL)
- {
- alarm(GetString(MSG_CANNOTOPEN_CMDFILE), NurName(FileName),
- GetIoErrText() );
- return;
- }
-
- fprintf(NewCmdFile, GetString(MSG_CMDFILE_HEADER), Version/100, Version % 100);
-
- if (aktCmdFile)
- {
- strcpy(CmdLine, "@");
- strcat(CmdLine, CmdFileName);
- }
- else
- {
- static const size_t OptOffsets[] =
- {
- offsetof(struct BackupOptions, bo_ProtFileName),
- offsetof(struct BackupOptions, bo_KeepProtFile),
- offsetof(struct BackupOptions, bo_UseGrepPattern),
- offsetof(struct BackupOptions, bo_IncludeSubDirs),
- offsetof(struct BackupOptions, bo_Append),
- offsetof(struct BackupOptions, bo_SaveSoftLinks),
- offsetof(struct BackupOptions, bo_SaveHardLinks),
- offsetof(struct BackupOptions, bo_UseArc),
- offsetof(struct BackupOptions, bo_SetArc),
- offsetof(struct BackupOptions, bo_FirstDate),
- offsetof(struct BackupOptions, bo_LastDate),
- offsetof(struct BackupOptions, bo_ProtFile),
- offsetof(struct BackupOptions, bo_Verify),
- offsetof(struct BackupOptions, bo_Compress),
- offsetof(struct BackupOptions, bo_Preview),
- offsetof(struct BackupOptions, bo_IncludeFile),
- offsetof(struct BackupOptions, bo_ExcludeFile),
- offsetof(struct BackupOptions, bo_UseHardwareCompression)
- };
- char *lp;
- size_t MaxLength;
- short m, n;
-
- lp = CmdLine;
- MaxLength = sizeof(CmdLine) - 1;
-
- for (m=0; m<sizeof(OptOffsets)/sizeof(OptOffsets[0]); m++)
- {
- size_t Length;
-
- GetToolTypeText(Opt, OptOffsets[m], lp, MaxLength);
- if (*lp)
- {
- strcat(lp, " ");
-
- Length = strlen(lp);
- if (strlen(CmdLine) < 75)
- {
- lp += Length;
- MaxLength -= Length;
- }
- else
- {
- // Neue Zeile anfangen
- fprintf(NewCmdFile, "%s+\n", CmdLine);
- lp = CmdLine;
- MaxLength = sizeof(CmdLine) - 1;
- *CmdLine = '\0';
- }
- }
- }
-
- if (strlen(CmdLine) > 0)
- fprintf(NewCmdFile, "%s+\n", CmdLine);
-
- for (erg=1, n=0; erg && n<Opt->bo_FSDirCount; n++)
- {
- Dir = Opt->bo_FSDirList[n];
- if (Dir->fsd_SelectCount > 0 && ManualSelectCount(Dir))
- {
- fprintf(NewCmdFile, "-ID\"%s\"+\n", Dir->fsd_Name);
-
- for (m=0; erg && m<Dir->fsd_DirCount; m++)
- erg = CheckFSEntry(Dir, Dir->fsd_EntryList[m], Opt, NewCmdFile);
- }
- }
- }
-
- if (erg)
- erg = fprintf(NewCmdFile, "\n");
-
- if (erg == 0)
- {
- error = 1;
- alarm(GetString(MSG_ERRORWRITING_CMDFILE), NurName(FileName),
- GetIoErrText() );
- }
-
- fclose(NewCmdFile);
-
- if (!error && withIcon)
- {
- if (!SaveListIcon(Opt, FileName))
- {
- alarm(GetString(MSG_ERRORCREATING_CMDFILE_ICON),
- NurName(FileName), GetIoErrText() );
- }
- }
- }
-
-
- static short CheckFSEntry(struct FSDir *Dir, struct FSDirEntry *FSe,
- struct BackupOptions *Opt, FILE *NewCmdFile)
- {
- char hilf[FMSIZE];
- short erg = 1;
- char *Name;
-
- ASSERT_VALID(FSe);
- ASSERT_VALID(Opt);
- ASSERT_VALID(NewCmdFile);
-
- if (FSe->fse_Selected == ST_Selected)
- {
- switch (FSe->fse_Typ)
- {
- case File:
- erg = fprintf(NewCmdFile, "-IF\"%s\"+\n", FSe->fse_Name);
- break;
- case SoftLinkDir:
- erg = fprintf(NewCmdFile, "-ILd\"%s\"+\n", FSe->fse_Name);
- break;
- case SoftLinkFile:
- erg = fprintf(NewCmdFile, "-ILf\"%s\"+\n", FSe->fse_Name);
- break;
- case HardLinkDir:
- erg = fprintf(NewCmdFile, "-ILD\"%s\"+\n", FSe->fse_Name);
- break;
- case HardLinkFile:
- erg = fprintf(NewCmdFile, "-ILF\"%s\"+\n", FSe->fse_Name);
- break;
- case Device:
- erg = fprintf(NewCmdFile, "-IP\"%s\"+\n", FSe->fse_Name); // Partition
- break;
- case Directory:
- case Assign:
- case Volume:
- Name = ConcatDirName(Dir->fsd_Name, FSe->fse_Name);
-
- if (ManualSelectCount(SearchFSDir(Name)) == 0 &&
- ManualSelectCount(FSe->fse_Contents) == 0)
- {
- /* Subdirectory komplett einschließen
- nur wenn nicht schon irgendwo manuell etwas
- eingetragen wurde */
- strmfn(hilf, NULL, FSe->fse_Name,
- Opt->bo_IncludeFile.RawName, NULL);
- erg = fprintf(NewCmdFile, "-IS\"%s\"+\n", hilf);
- }
- free(Name);
- break;
- }
- }
-
- return erg;
- }
-
-
- /* einen Eintrag aus dem Kommandofile lesen und auswerten */
- char *ReadCmdFile(struct BackupOptions *Opt, BOOL InitFS)
- {
- static char line[FMSIZE], name[FMSIZE];
- static char filepath[FMSIZE];
- char *p, lastc;
- struct FSDir *Dir = NULL;
- BOOL first = TRUE;
-
- ASSERT_VALID(Opt);
-
- do {
- p = fgets(line, sizeof(line)-1, aktCmdFile); /* 1 Zeile lesen */
- if (p == NULL) /* EOF erreicht */
- return NULL;
-
- /* Default-Einstellung nur wenn kein EOF */
- if (first)
- {
- /* Diese Switches können in jedem Eintrag anders gesetzt werden */
- Opt->bo_IncludeSubDirs = 1; /* Default: mit Subdirectories */
- Opt->bo_UseArc = Ignore; /* Default: Archiv-Flag ist egal */
- Opt->bo_SetArc = Set; /* default: Archiv-Flag setzen */
- Opt->bo_UseFirstDate = 0; /* default: nicht nach Datum prüfen */
- Opt->bo_UseLastDate = 0; /* default: nicht nach Datum prüfen */
- Opt->bo_UseGrepPattern = 1;
-
- if (InitFS)
- InitFileSelect(Opt);
-
- first = FALSE;
- }
-
- LineNo++;
-
- if (*p == '%')
- {
- lastc = '+';
- continue; /* Kommentar */
- }
-
- if (p[strlen(p)-1] == '\n')
- p[strlen(p)-1] = '\0';
-
- lastc = p[strlen(p)-1];
- if (lastc == '+')
- p[strlen(p)-1] = '\0';
-
- while (p && *p)
- {
- p = stpblk(p); /* Führende Leerzeichen überlesen */
- switch (*p)
- {
- case '-':
- case '/':
- if (p[1] == 'I')
- p = ProcessIncludeFile(++p, &Dir, Opt);
- else
- {
- char ErrorLine[129];
-
- sprintf(ErrorLine, GetString(MSG_CMDFILE_LINE),
- NurName(LastCmdFileName), LineNo); // Fehler-Kopf vorbereiten für processOption()
-
- p = processOption(++p, ErrorLine, Opt);
- }
- break;
- default:
- p = ReadString(name, p, sizeof(name)-1);
-
- // stcgfn(Opt->bo_IncludeFile.RawName, name); /* Get file node */
- // stcgfp(filepath, name); /* Get file path */
-
- if (*name)
- {
- // hier muß eine ToolType-Einstellung stehen
- if (!CheckLineForToolType(name, Opt))
- p = NULL; // <name> konnte nicht identifiziert werden!
- }
- break;
- }
- }
-
- if (p == NULL)
- {
- alarm(GetString(MSG_SYNTAXERROR_IN_CMDFILE),
- NurName(LastCmdFileName), LineNo, line);
- myabort(0);
- }
- } while (lastc == '+');
-
- InitSearchPattern(Opt);
-
- return filepath;
- }
-
-
- static char *ProcessIncludeFile(char *line, struct FSDir **Dir,
- struct BackupOptions *Opt)
- {
- static char FName[FMSIZE], FName2[FMSIZE];
- struct FSDirEntry *FSe;
- char LinkType;
-
- ASSERT_VALID(line);
- ASSERT_VALID(Dir);
- ASSERT_VALID(Opt);
-
- switch (*++line)
- {
- case 'D': /* Directory */
- line = ReadString(FName, ++line, sizeof(FName)-1);
- *Dir = CreateFSDir(FName, Opt);
- if (*Dir == NULL)
- return NULL;
- break;
- case 'L': /* SoftLink */
- if (*Dir == NULL)
- return NULL;
-
- LinkType = *++line;
-
- line = ReadString(FName, ++line, sizeof(FName)-1);
- switch (LinkType)
- {
- case 'D':
- FSe = AddFSEntry(*Dir, FName, HardLinkDir);
- break;
- case 'd':
- FSe = AddFSEntry(*Dir, FName, SoftLinkDir);
- break;
- case 'F':
- FSe = AddFSEntry(*Dir, FName, HardLinkFile);
- break;
- case 'f':
- FSe = AddFSEntry(*Dir, FName, SoftLinkFile);
- break;
- }
- SelectFSEntry(*Dir, FSe);
- break;
- case 'P': /* Partition */
- if (*Dir == NULL)
- return NULL;
-
- line = ReadString(FName, ++line, sizeof(FName)-1);
- if (FindPartition(FName))
- {
- FSe = AddFSEntry(*Dir, FName, Device);
- SelectFSEntry(*Dir, FSe);
- }
- else
- alarm(GetString(MSG_PARTITION_NOTFOUND), FName);
- break;
- case 'F': /* File */
- if (*Dir == NULL)
- return NULL;
-
- line = ReadString(FName, ++line, sizeof(FName)-1);
- FSe = AddFSEntry(*Dir, FName, File);
- SelectFSEntry(*Dir, FSe);
- break;
- case 'S': /* Subdirectory */
- if (*Dir == NULL)
- return NULL;
-
- line = ReadString(FName, ++line, sizeof(FName)-1);
- stcgfp(FName2, FName); /* Get file path */
- FSe = AddFSEntry(*Dir, FName2, Directory);
- SelectFSEntry(*Dir, FSe);
-
- stcgfn(Opt->bo_IncludeFile.RawName, FName); /* Get file node */
- Opt->bo_IncludeFile.isParsed = 0;
- break;
- }
-
- return line;
- }
-
-
- char *processOption(const char *opt, const char *ErrPrefix, struct BackupOptions *BOpt)
- {
- char c;
-
- ASSERT_VALID(opt);
- ASSERT_VALID(ErrPrefix);
- ASSERT_VALID(BOpt);
-
- while (*opt)
- {
- switch (c = *opt)
- {
- case 'a': /* Anhängen an altes Backup */
- BOpt->bo_Append = 1;
- break;
- case 'b': /* nur Files jünger als ..Datum */
- BOpt->bo_UseLastDate = (BOpt->bo_LastDate = ReadDate(++opt)) ? 1 : 0;
- while (*opt && !isspace(*opt))
- opt++; /* Datum überlesen */
- opt--;
- break;
- case 'c':
- if (!isspace(opt[1]))
- {
- char *p = BOpt->XPKPackerName;
-
- ++opt;
- BOpt->bo_Compress = COMPRESS_XPK;
- while (*opt && !isspace(*opt))
- *p++ = *opt++;
- opt--;
- }
- else
- BOpt->bo_Compress = COMPRESS_INTERNAL; /* Files komprimieren */
- break;
- #ifdef TAPEDEBUG
- case 'd':
- TapeDebugLevel = atoi(++opt);
- while (isdigit(*opt))
- opt++;
- break;
- #endif
- case 'e':
- BOpt->bo_Preview = TRUE;
- break;
- case 'f': /* Archiv-Flag nicht setzen */
- switch (opt[1])
- {
- case '1':
- opt++;
- BOpt->bo_SetArc = Set;
- break;
- case '2':
- opt++;
- BOpt->bo_SetArc = Reset;
- break;
- case '0':
- opt++;
- default:
- BOpt->bo_SetArc = Ignore;
- break;
- }
- break;
- case 'g': /* Laufwerke ohne TD_GETGEOMETRY */
- opt = ReadString(BOpt->bo_DrivesWithoutGeometry, ++opt,
- sizeof(BOpt->bo_DrivesWithoutGeometry));
- break;
- case 'k':
- switch (opt[1])
- {
- case '1':
- BOpt->bo_ProtFile = PT_Binary;
- opt++;
- break;
- case '2':
- BOpt->bo_ProtFile = PT_ASCII;
- opt++;
- break;
- default:
- BOpt->bo_ProtFile = PT_ASCII;
- break;
- }
- break;
- case 'l': /* Links */
- switch (opt[1])
- {
- case 'h':
- opt++;
- switch (opt[1])
- {
- case '0':
- BOpt->bo_SaveHardLinks = 0;
- opt++;
- break;
- case '1':
- BOpt->bo_SaveHardLinks = 1;
- opt++;
- break;
- }
- break;
- case 's': /* SoftLinks */
- opt++;
- default:
- switch (opt[1])
- {
- case '0':
- BOpt->bo_SaveSoftLinks = 0;
- opt++;
- break;
- case '1':
- BOpt->bo_SaveSoftLinks = 1;
- opt++;
- break;
- }
- break;
- }
- break;
- case 'n': /* nur geänderte Files */
- switch (opt[1])
- {
- case '0':
- BOpt->bo_UseArc = Ignore;
- opt++;
- break;
- case '1':
- BOpt->bo_UseArc = Set;
- opt++;
- break;
- case '2':
- opt++;
- default:
- BOpt->bo_UseArc = Reset;
- break;
- }
- break;
- case 'o': /* ohne Subdirectories */
- BOpt->bo_IncludeSubDirs = FALSE;
- break;
- case 'p':
- BOpt->bo_Verify = TRUE; /* mit Verify */
- break;
- case 'v': /* nur Files älter als ..Datum */
- BOpt->bo_UseFirstDate = (BOpt->bo_FirstDate = ReadDate(++opt)) ? 1 : 0;
- while (*opt && !isspace(*opt))
- opt++; /* Datum überlesen */
- opt--;
- break;
- case 'w': /* DOS oder einfache WildCards */
- switch (opt[1])
- {
- case '0':
- BOpt->bo_UseGrepPattern = FALSE;
- opt++;
- break;
- case '1':
- BOpt->bo_UseGrepPattern = TRUE;
- opt++;
- break;
- }
- break;
- case 'x': /* Exclude File Pattern */
- opt = ReadString(BOpt->bo_ExcludeFile.RawName, ++opt,
- sizeof(BOpt->bo_ExcludeFile.RawName));
- break;
-
- case '?':
- CallHelp(0L, 0);
- myabort(0);
- break;
-
- case '-': /* Beginn einer neuen Option */
- case '/':
- break;
- case ' ':
- case '\t':
- case '\n':
- while (isspace(*opt))
- opt++;
- break;
- default:
- alarm(GetString(MSG_INVALID_OPTION), ErrPrefix, opt);
- myabort(0);
- }
- if (*opt)
- opt++;
- }
-
- return opt;
- }
-