// ****************************************** // * unTar - razpakiranje datotek iz arhiva * // * * // * Jernej Virag * // ****************************************** #include #include #include typedef struct { char ime[FILENAME_MAX]; long offset; } F_Info; int main(int argc,char* argv[]) { if (argc<2) {printf("Manjkajo argumenti.\n"); return -1;} FILE *arhiv; FILE *output; char *buffer; F_Info *fileinfo; int i=0,j=0; long headerpos; //položaj začetka fileinfoja arhiv=fopen(argv[1],"rb"); if (arhiv==NULL) {printf("Napaka pri odpiranju arhiva."); return -1;} //najprej preverimo, če je arhiv sploh legalen buffer=(char*)malloc(4*sizeof(char)); memset(buffer,'\0',4); //inicializiramo fread(buffer,sizeof(char),3, arhiv); if(strcmp(buffer,"ARH\0")) {printf("Datoteka ni veljaven arhiv!\n"); return -1;} //pogledamo kje se začnejo informacije o datotekah fseek(arhiv,-sizeof(long),SEEK_END); fread(&headerpos,sizeof(long),1,arhiv); //pomaknemo se na začetek infoja fseek(arhiv,headerpos,SEEK_SET); fileinfo=(F_Info*)malloc(sizeof(F_Info)); buffer=realloc(buffer,sizeof(char)); //zmanjšamo buffer na velikost //enega znaka i=0; *buffer=fgetc(arhiv); while(!feof(arhiv)) { fileinfo=(F_Info*)realloc(fileinfo,(i+1)*sizeof(F_Info)); fileinfo[i].ime[0]='\0'; do { *buffer=fgetc(arhiv); strncat(fileinfo[i].ime,buffer,1); } while(*buffer!='\0'&&!feof(arhiv)); fread(&fileinfo[i].offset,sizeof(long),1,arhiv); printf("Najdena datoteka %s z offsetfom %ld.\n",fileinfo[i].ime,fileinfo[i].offset); i++; }; i--; fileinfo[i].offset=headerpos; //gremo pisat fajle... končno for(j=0;j