home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------- */
- /* CLEARHD.C */
- /* CLEARHD überprüft, ob sich die Dateien, die in */
- /* der angegebenen Schlüsseldatei vorhanden sind, */
- /* in Größe, Datum oder Uhrzeit geändert haben, ob */
- /* sie überhaupt noch existieren und ob es Dateien */
- /* gibt, die sich nicht in der Schlüsseldatei be- */
- /* finden. Bei nicht in der Schlüsseldatei vorhan- */
- /* denen Dateien wird das Löschen der entsprechen- */
- /* den Dateien angeboten, wenn der entsprechende */
- /* Schalter gesetzt wird. */
- /* ------------------------------------------------- */
- /* Parameter */
- /* Eingabe : argc : Anzahl der übergebenen */
- /* Parameter */
- /* *argv[] : Zeiger auf die übergebenen */
- /* Parameter */
- /* Ausgabe : Bei fehlerhaftem Aufruf wird das */
- /* Programm abgebrochen und */
- /* setzt mit exit() den ERRORLEVEL */
- /* auf 1 */
- /* ------------------------------------------------- */
- /* (c) 1991 Dirk Alpers & DMV-Verlag */
- /* ------------------------------------------------- */
-
- #include "def.h" /* enthält alle nötigen Prototypen
- und Konstanten */
-
- /* --- Typen --------------------------------------- */
- struct pointer {
- char name[80];
- struct pointer *next;
- };
-
- /* --- Prototypen ---------------------------------- */
- void Parameter_auswerten(int argc,
- char *argv[],
- char *source);
- void Anleitung_ausgeben(void);
- struct pointer *vergleichen(struct pointer *rootptr,
- char *dir);
- int cutstr(char *dest, char *source,
- int position, int length);
-
- /* --- Globale Variablen --------------------------- */
- int OK = FALSE,
- /* Bei korrekten Files OK ausgeben? */
- DELETE = FALSE,
- /* Bei unkorrekten Files löschen anbieten? */
- NOQUERY = FALSE;
- /* Löschen ohne Sicherheitsabfrage? */
-
- /* ------------------------------------------------- */
- void main(int argc,char *argv[])
- {
- char file[MAXPATH],
- /* Zeile aus der Schlüsseldatei */
- dir[MAXPATH];
- /* zu durchsuchendes Directory */
- char source[MAXPATH];
- /* Name der Schlüsseldatei */
- FILE *fp;
- /* Filepointer der Schlüsseldatei */
- struct pointer *rootptr,
- /* Anfang der einfach verketteten Liste */
- *helpptr,
- /* Hilfszeiger zum Aufbau und Durchlaufen */
- *laufzeiger;
- /* der einfach verketteten Liste */
-
- printf("\nCLEARHD 1.0 (c) 1991 Alpers/Dietl");
- Parameter_auswerten(argc, argv, source);
-
- fp = fopen(source, "r");
- /* Schlüsseldatei zum Lesen öffnen */
- if (errno == 0) {
- /* Konnte Schlüsseldatei geöffnet werden? */
- fscanf(fp, "%s", file);
- /* Ersten Eintrag aus Schlüsseldatei lesen */
- while (!feof(fp)) {
- strcpy(dir, file+1);
- /* "*" aus String streichen */
- printf("\nDir: %s", dir);
- /* Zu durchsuchenden Directorynamen ausgeben */
- rootptr = NULL; /* rootptr initialisieren */
- laufzeiger = NULL;
- fscanf(fp, "%s", file);
- /* Ersten Fileeintrag aus Schlüsseldatei lesen */
- /* Alle Fileeinträge aus einem Directory in */
- /* einer Pointerkette ablegen */
- while((file[0] != '*') && (!feof(fp)))
- {
- helpptr = (struct pointer *)
- malloc(sizeof(struct pointer));
- strcpy(helpptr->name,file);
- helpptr->next = NULL;
- if (rootptr == NULL)
- rootptr = helpptr;
- else
- laufzeiger->next = helpptr;
- laufzeiger = helpptr;
- fscanf(fp,"%s",file);
- /* Nächsten Eintrag aus Schlüsseldatei holen */
- }
- errno = 0;
-
- rootptr = vergleichen(rootptr, dir);
-
- /* Nicht gefundene Dateien ausgeben und */
- /* Pointer-Speicherplatz freigeben */
- helpptr = rootptr;
- while (helpptr)
- {
- printf("\n%s *** MISSING ***",helpptr->name);
-
- laufzeiger = helpptr->next;
- free(helpptr);
- /* Pointer-Speicherplatz freigeben */
- helpptr = laufzeiger;
- }
- }
-
- fclose(fp); /* Schlüsseldatei schließen */
- }
- else
- printf("\nCan't open Keyfile\n");
- /* Schlüsseldatei konnte nicht geöffnet werden */
- printf("\n");
- } /* clearhd */
-
-
- /* ------------------------------------------------- */
- /* Modulname : Parameter_auswerten */
- /* Aufgabe : Auswerten der dem Programm über- */
- /* gebenen Parameter */
- /* /O, -O : Bei Übereinstimmung "OK" ausgeben */
- /* /D, -D : Bei Nichtübereinstimmung Löschen */
- /* anbieten */
- /* /N, -N : Löschen ohne Nachfrage */
- /* (nur zusammen mit D) */
- /* ------------------------------------------------- */
- /* Parameter */
- /* Eingabe : argc : Anzahl der übergebenen */
- /* Parameter */
- /* *argv[] : Pointer auf die über- */
- /* gebenen Parameter */
- /* Ausgabe : *source : Name der Schlüsseldatei */
- /* ------------------------------------------------- */
- void Parameter_auswerten(int argc, char *argv[],
- char *source)
- {
- int zaehler; /* Schleifenzähler */
-
- strcpy(source, "");
- if ( (argc == 1) || (argv[1] == "/?") ||
- (argv[1] == "-?") )
- Anleitung_ausgeben();
- else {
- for (zaehler = 1; zaehler < argc; zaehler++) {
- strupr(argv[zaehler]);
-
- if ( (strcmp(argv[zaehler], "/O") == 0) ||
- (strcmp(argv[zaehler], "-O") == 0) )
- OK = TRUE;
- else if ( (strcmp(argv[zaehler], "/D") == 0) ||
- (strcmp(argv[zaehler], "-D") == 0) )
- DELETE = TRUE;
- else if ( (strcmp(argv[zaehler], "/N") == 0) ||
- (strcmp(argv[zaehler], "-N") == 0) )
- NOQUERY = TRUE;
- else strcpy(source, argv[zaehler]);
- }
- }
-
- if ((! strcmp(source, "")) ||
- (NOQUERY && ! DELETE) ||
- (source[0] == '/') || (source[0] == '-') )
- Anleitung_ausgeben();
- } /* Parameter_auswerten */
-
-
- /* ------------------------------------------------- */
- /* Modulname : Anleitung_ausgeben */
- /* Aufgabe : bei fehlerhaftem Programmaufruf eine */
- /* Kurzanleitung ausgeben und Abbruch */
- /* mit exit() */
- /* ------------------------------------------------- */
- /* Parameter */
- /* Eingabe : Keine */
- /* Ausgabe : mittels exit() wird der ERRORLEVEL */
- /* von DOS gesetzt */
- /* ------------------------------------------------- */
- void Anleitung_ausgeben(void)
- {
- printf("\nCLEARHD - Dateien mit Schlüsseldatei ");
- printf("vergleichen\n");
- printf("\nAufruf: CLEARHD <Schlüsseldateiname> ");
- printf("[/O] [/D [/N]]");
- printf("\n /O - (OK) für korrekte ");
- printf("Dateien wird OK ausgegeben");
- printf("\n /D - (Delete) unkorrekte ");
- printf("Dateien nach Abfrage löschen");
- printf("\n /N - (No query) unkorrekte ");
- printf("Dateien ohne Nachfrage löschen\n");
-
- exit(1);
- /* Programm abbrechen und ERRORLEVEL setzen */
- } /* Anleitung_ausgeben */
-
-
- /* ------------------------------------------------- */
- /* Modulname : vergleichen */
- /* Aufgabe : Sequentielles Durchlaufen des über- */
- /* gebenen Directories. */
- /* Jede gefundene Datei wird in der */
- /* Pointerliste gesucht. */
- /* Wenn die Datei gefunden wird, wird */
- /* sie aus der Pointerliste gestrichen. */ *
- /* Je nach gewählten Optionen wird */
- /* - bei Übereinstimmungen OK ausgegeben */
- /* - bei nicht in der Liste vorhandenen Dateien */
- /* das Löschen der entsprechenden Datei */
- /* angeboten */
- /* Bei falscher Größe, falscher Zeit und */
- /* falschem Datum wird eine entsprechende */
- /* Meldung ausgegeben. */
- /* ------------------------------------------------- */
- /* Parameter */
- /* Eingabe : *rootptr: Zeiger auf den Listenanfang */
- /* *dir : Name des zu durchsuchenden */
- /* Directory */
- /* Ausgabe : *rootptr: Zeiger auf den Listenanfang */
- /* ------------------------------------------------- */
- struct pointer *vergleichen(struct pointer *rootptr,
- char *dir)
- {
- char loeschen; /* Antwort auf Frage, ob */
- /* unkorrektes File */
- /* gelöscht werden soll */
- struct ffblk datei = {"",' ',0,0,0,""};
- char helpstr[80],
- helpstr2[80],
- helpstr3[80],
- dateiname[13];
- /* Dateiname des DIR-Eintrags */
- struct pointer *vorgaenger,
- /* Pointer zum Bearbeiten der Liste mit */
- *helpptr; /* den Dateieinträgen */
-
- /* Vergleich zwischen existierenden Dateien und */
- /* Einträgen in Schlüsseldatei */
- strcpy(helpstr,dir);
- if (helpstr[strlen(helpstr) - 1] != '\\')
- /* beim Hauptdirectory ist bereits ein '\\' */
- strcat(helpstr, "\\*.*");
- /* vorhanden, bei Subdirectorys nicht */
- else strcat(helpstr, "*.*");
-
- findfirst(helpstr,&datei,0x27);
- /* DOS: Ersten Fileeintrag im Directory suchen */
- while (errno == 0)
- { /* Noch ein Dateieintrag gefunden? */
- mkstring(helpstr,datei);
- /* Aus Filedaten String machen */
- /* TURBOC: Warning: Structure passed by */
- /* value ist ok */
- strcat(helpstr,"__");
- /* Notwendig für exakten Stringvergleich */
-
- cutstr(dateiname, helpstr, 0, 12);
- /* Dateinamen aus helpstr schneiden */
-
- /* In der Liste eine Datei mit gleichem */
- /* Namen suchen */
- helpptr = rootptr;
- while ((helpptr != NULL) &&
- (strncmp(dateiname,helpptr->name, 12) != 0))
- {
- vorgaenger = helpptr;
- /* Filenamen sind ungleich -> weitersuchen */
- helpptr = helpptr->next;
- } /* while */
-
- if (helpptr != NULL)
- /* Dateiname in der Liste gefunden */
- {
- /* Dateinamen isolieren und auf */
- /* Gleichheit prüfen */
- cutstr(helpstr2, helpptr->name, 0, 12);
- cutstr(helpstr3, helpstr, 0, 12);
-
- if (strcmp(helpstr2, helpstr3) == 0)
- /* Einträge absolut identisch */
- {
- if ((helpptr->name[39]=='C') ||
- (strcmp(helpptr->name, helpstr) == 0))
- {
- if (OK)
- {
- /* Filedaten gleich/dürfen geändert werden */
- printf("\n%s",helpptr->name);
- printf(" OK");
- }
- }
- else {
- if (strcmp(helpptr->name, helpstr) != 0)
- {
- /* LÄNGE, DATUM, ZEIT überprüfen */
- printf("\n%s",helpptr->name);
- /* Filestring ausgeben */
-
- cutstr(helpstr2,helpstr,13,8);
- /* Größe überprüfen */
- cutstr(helpstr3,helpptr->name,13,8);
- if (strcmp(helpstr2,helpstr3) != NULL)
- printf(" WRONG SIZE");
-
- cutstr(helpstr2,helpstr,22,10);
- /* Datum überprüfen */
- cutstr(helpstr3,helpptr->name,22,10);
- if (strcmp(helpstr2,helpstr3) != NULL)
- printf(" WRONG DATE");
-
- cutstr(helpstr2,helpstr,33,5);
- /* Zeit überprüfen */
- cutstr(helpstr3,helpptr->name,33,5);
- if (strcmp(helpstr2,helpstr3) != NULL)
- printf(" WRONG TIME");
- }
- } /* else */
-
- if (helpptr != rootptr)
- {
- /* Listenelement aus der Mitte der */
- /* Liste */
- vorgaenger->next = helpptr->next;
- free(helpptr);
- helpptr = vorgaenger->next;
- }
- else
- {
- /* Listenelement am Anfang der Liste */
- rootptr = helpptr->next;
- free(helpptr);
- helpptr = rootptr;
- vorgaenger = helpptr;
- } /* else */
- }
- }
- else
- {
- /* File nicht in Schlüsseldatei, */
- /* Datei löschen ? */
- printf("\n%s *** Not required",helpstr);
- /* Filestring ausgeben */
- if ((DELETE) && (!NOQUERY))
- /* Nachfrage: Datei löschen? */
- {
- printf(" - KILL (Y/N)?");
- do
- {
- loeschen = toupper(getche());
- }
- while ((loeschen != 'Y') &&
- (loeschen != 'N'));
- }
- else printf(" ***");
-
- if ( (NOQUERY) ||
- (DELETE && (loeschen =='Y')) )
- {
- strcpy(helpstr,dir);
- /* beim Hauptdirectory ist bereits */
- /* ein '\\' vorhanden, */
- /* bei Subdirectories nicht */
- if (helpstr[strlen(helpstr) -1] != '\\')
- strcat(helpstr,"\\");
- strcat(helpstr,datei.ff_name);
- /* Dateiname nach helpstr */
- unlink(helpstr);
- /* Datei löschen */
- if (! errno)
- printf("\n%40c KILLED", ' ');
- else
- printf("\n%40c WRITE-PROTECTED",' ');
- errno = 0;
- };
-
- } /* else */
-
- findnext(&datei);
- /* DOS: Nächsten Eintrag im Directory suchen */
- } /* while */
-
- return (rootptr);
- } /* vergleichen */
-
-
- /* ------------------------------------------------- */
- /* Modulname : cutstr */
- /* Aufgabe : Ausschneiden eines Strings aus einem */
- /* Quellstring ab der Position position */
- /* und der maximalen Länge length und */
- /* übertragen in einen Zielstring. */
- /* Wenn der Quellstring weniger Zeichen */
- /* als position+length besitzt, werden */
- /* nur die Zeichen bis zum Quellstring- */
- /* ende zurückgegeben. */
- /* ------------------------------------------------- */
- /* Parameter */
- /* Eingabe : char *dest Adresse des Zielstrings */
- /* char *source Adresse des Quellstrings*/
- /* int position ab welcher Position */
- /* ausgeschnitten werden */
- /* soll */
- /* int length wieviele Zeichen maximal*/
- /* ausgeschnitten */
- /* werden sollen */
- /* Ausgabe : Anzahl der ausgeschnittenen Zeichen */
- /* ------------------------------------------------- */
- int cutstr(char *dest, char *source,
- int position, int length)
- {
- int i = 0; /* Schleifenvariable */
-
- while ((i<length) &&
- (source[position+i] != '\0')) {
- dest[i] = source[position+i];
- i++;
- }
- dest[i] = '\0';
- return(i);
- } /* cutstr */
-
- /* ------------------------------------------------- */
- /* Ende von CLEARHD.C */
-
-