home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************
- * *
- * ZIP Processing Functions *
- * *
- **************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-
- #undef MAIN
-
- #include "fff.h"
- #include "zip.h"
-
- int Match (char *Str, char *Pat);
- void PrtVerbose (char *Path, char *Name, DOS_FILE_TIME Time, DOS_FILE_DATE Date,
- long Size);
- void ChkPage (void);
-
-
- extern char Pattern[66];
-
- void
- DoZip (char *Name) {
- FILE *ZIPFile;
-
- if ( (ZIPFile = fopen(Name, "rb")) == NULL ) {
- fprintf(stderr, "%s", Name);
- perror("");
- }
- ProcessHeaders(ZIPFile, Name);
- fclose(ZIPFile);
- }
-
-
- void
- ProcessHeaders (FILE *ZIPFile, char *Path) {
- extern int TotalMatch, VerboseSwt, Spaced, PageSwt;
- extern ARC_TYPE ArcType;
- extern int Lnno;
- extern S[6][3];
-
- int i, Printed;
- long ZipLen, FileLen;
- char *Buffer, *Name, *p;
- char DireName[65];
- unsigned Count;
- long Offset, S_Offset, Block, Index;
- unsigned long *Ptr;
- unsigned long CentralSig;
- END_CENTRAL_DIRECTORY_RECORD *EndPtr;
- CENTRAL_DIRECTORY_FILE_HEADER *CentralHeader;
-
- if ( (Buffer = malloc(SEARCH_SIZE)) == NULL) {
- fprintf(stderr, "Insufficient memory!\n");
- exit(1);
- }
- fseek(ZIPFile, 0, SEEK_END);
- FileLen = ZipLen = ftell(ZIPFile);
- fseek(ZIPFile, 0, SEEK_SET);
- if (ZipLen < SEARCH_SIZE) {
- ZipLen = fread(Buffer, 1, ZipLen, ZIPFile);
- }
- else {
- fseek(ZIPFile, -SEARCH_SIZE, SEEK_END);
- ZipLen = fread(Buffer, 1, SEARCH_SIZE, ZIPFile);
- }
- for (i = ZipLen - 4; i >= 0; --i) {
- Ptr = (unsigned long *) &Buffer[i];
- if (*Ptr == END_CENTRAL_DIR_SIGNATURE) break;
- }
- if (i < 0) {
- fprintf(stderr, "%s: Invalid ZIP format\n", Path);
- fprintf(stderr, " - No \"End-of-Central-Directory\" record!\n");
- free(Buffer);
- return;
- }
- EndPtr = (END_CENTRAL_DIRECTORY_RECORD *) &Buffer[i + 4];
- Count = EndPtr->TotalEntriesCentralDirOnThisDisk;
- S_Offset = Offset = EndPtr->OffsetStartCentralDirectory;
- Block = FileLen - Offset;
- free(Buffer);
-
- Buffer = malloc(Block);
- fseek(ZIPFile, S_Offset, SEEK_SET);
- fread(Buffer, 1, Block, ZIPFile);
- Printed = 0;
- for (Index = i = 0; i < Count; ++i) {
- ++S[ArcType][1];
- memmove(&CentralSig, &Buffer[Index], 4);
- if (CentralSig != CENTRAL_FILE_HEADER_SIGNATURE) {
- fprintf(stderr, "%s: Invalid ZIP format\n", Path);
- fprintf(stderr, " - bad \"Central Directory\" record!\n");
- free(Buffer);
- return;
- }
- Index += 4;
- CentralHeader = (CENTRAL_DIRECTORY_FILE_HEADER *) &Buffer[Index];
- Index += sizeof(CENTRAL_DIRECTORY_FILE_HEADER);
- Name = malloc(CentralHeader->FileNameLength + 1);
- memmove(Name, &Buffer[Index], CentralHeader->FileNameLength);
- Name[CentralHeader->FileNameLength] = '\0';
- Index += (CentralHeader->FileNameLength + CentralHeader->FileCommentLength);
- if ( (p = strrchr(Name, '/')) != NULL) {
- *p = '\0';
- strcpy(DireName, Name); strcat(DireName, "/");
- ++p;
- }
- else {
- DireName[0] = '\0';
- p = Name;
- }
- if (Match(p, Pattern) ) {
- ++S[ArcType][2];
- ++TotalMatch;
- if (PageSwt) ChkPage();
- if (VerboseSwt) {
- if (!Printed) {
- if (!Spaced) {
- if (PageSwt) ChkPage();
- printf("\n");
- ++Lnno;
- }
- if (PageSwt) ChkPage();
- printf("%s\n", Path);
- ++Lnno;
- Printed = 1;
- }
- fputs("* ", stdout);
- PrtVerbose(DireName, p, CentralHeader->LastModFileTime,
- CentralHeader->LastModFileDate,
- CentralHeader->UncompressedSize);
- }
- else printf("%s--> (%s/%s)\n", Path, DireName, p);
- ++Lnno;
- }
- free(Name);
- }
- free(Buffer);
- if (Printed) {
- if (PageSwt) ChkPage();
- printf("\n");
- ++Lnno;
- Spaced = 1;
- }
- }