-
Notifications
You must be signed in to change notification settings - Fork 1
/
unzip.c
137 lines (107 loc) · 3.21 KB
/
unzip.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* Authors: Lalit D. Chandwani, Aastha Shrivastava, Rakshit Sundriyal and Ujwal Singhania
* Description: Unzip library
* Last Modified Date: 14 March 2018
* to compile run
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
#include "fileunzip.h"
//TODO: Make sure that directory can be made.
int makeDirectory(char *dir){
char command[50];
strcpy(command, "mkdir " );
printf("done1\n" );
strcat(command,dir);
printf("done2\n" );
system(command);
printf("done3\n" );
strcpy(command,"cd ");
printf("done4\n" );
strcat(command,dir);
printf("done5\n" );
system(command);
printf("done6\n" );
return EXIT_SUCCESS;
}
void writeFile(char *fileName, void *data, long bytes){
FILE *outFile;
int index;
for(index = 0; fileName[index]; index = index + 1){
if(fileName[index] != '/'){
continue;
}
fileName[index] = '\0'; //Terminate string at current position for the file name.
if(makeDirectory(fileName)){
fprintf(stderr, "Could not create subdirectory %s\n", fileName);
}
fileName[index] = '/'; //Restore the character.
}
if(!index || fileName[index-1] == '/'){
//Do nothing, this is just to find the empty file or directory
}
outFile = fopen(fileName, "w");
if(outFile != NULL){
fwrite(data, 1, bytes, outFile);
fclose(outFile);
}
else{
fprintf(stderr, "Could not open %s for writing.\n", fileName);
}
}
int processFile(zipFile *zip){
fileHeader header;
char fileName[1024];
unsigned char *data;
if(readLocalFileHeader(zip, &header, fileName, sizeof(fileName))){
printf("Could not read local file header.\n");
return -1;
}
if((data = (unsigned char*) malloc(header.uncompressedSize)) == NULL){
printf("Could not allocate requested memory.\n");
return -1;
}
printf("%s, %d / %d bytes at offset %08X\n", fileName, header.compressedSize, header.uncompressedSize, header.offset);
if(readData(zip, &header, data) != Z_OK){
printf("Could not read the file data.\n");
free(data);
return -1;
}
writeFile(fileName, data, header.uncompressedSize);
free(data);
return 0;
}
int recordCallback(zipFile *zip, int index, fileHeader *header, char *fileName, void *userData){
long offset;
offset = zip->tell(zip); //Keep old offset safe.
if(zip->seek(zip, header->offset, SEEK_SET)){
printf("Cannot seek in the given zip file.\n");
return 0; //This will help exit loop + if block, where it is being used.
}
processFile(zip); //This will change the file offset.
zip->seek(zip, offset, SEEK_SET); //Return to old offset.
return 1; //Allow to continue to next records.
}
int main(int argc, char const *argv[]) {
FILE *fp;
endCentralDirectoryRecord endRecord;
zipFile *zip;
if(argc < 2){
printf("Invalid arguments!\n");
return EXIT_FAILURE;
}
if(!(fp = fopen(argv[1], "r"))){
printf("Could not open \"%s\".\n", argv[1]);
return EXIT_FAILURE;
}
zip = zipFileFromStdioFile(fp);
if(readEndCentralDirectoryRecord(zip, &endRecord)){
printf("Could not read ZIP file end central record.\n");
}
if(readCentralDirectory(zip, &endRecord, recordCallback, NULL)) {
printf("Could not read ZIP file central directory record.\n");
}
return EXIT_SUCCESS;
}