void lister(char *file) { long taille_fichier_entier; taille_fichier_entier = taille_fichier(file); //ouverture du fichier TAR à desarchiver FILE *fr = NULL; fr = fopen(file, "rb"); // en mode "read binary" if (fr != NULL) { int end_file; end_file=0; while (end_file==0) { // on récupère le nom du fichier char filename[TAILLE_NOM_FICHIER]; fread (filename, TAILLE_NOM_FICHIER, 1, fr); printf("Nom du fichier : %s\n", filename); fseek(fr, 24, SEEK_CUR); char taille_octal_str[TAILLE_TAILLE_FICHIER]; int taille_dec; fread (taille_octal_str, TAILLE_TAILLE_FICHIER, 1, fr); taille_dec = ocToDec(atoi(taille_octal_str)); printf("Taille du fichier : %i\n", taille_dec); fseek(fr, (taille_dec+TAILLE_FIN_HEADER), SEEK_CUR); //------------------------------------------------------------------------------------------------------------------------ int decalage; decalage = decalage_curseur_fichier_suivant(ftell(fr), taille_dec); fseek(fr, decalage, SEEK_CUR); long sauv_position_curseur; sauv_position_curseur = ftell(fr); char testfinfichier[TAILLE_BLOC]; fread (testfinfichier, TAILLE_BLOC, 1, fr); end_file=1; int i; i = 0; while (end_file==1 && i<TAILLE_BLOC) { if (testfinfichier[i] != 0) { end_file=0; } i++; } fseek(fr, sauv_position_curseur, SEEK_SET); } fseek(fr, 0, SEEK_END); fclose(fr); } }
int main(void) { char *ptr, req[500], resource[500]; int fd, langeur; langeur = recv_ligne(0, req); ptr = strstr(req, " HTTP/"); if(ptr == NULL) perror("HTTP"); else { *ptr = 0; ptr = NULL; if(strncmp(req, "GET ", 4) == 0) ptr = req+4; if(strncmp(req, "HEAD ", 5) == 0) ptr = req+5; if(ptr == NULL) printf("\trequete inconnue !\n"); else { if (ptr[strlen(ptr) - 1] == '/') strcat(ptr, "index.html"); strcpy(resource, WEBROOT); strcat(resource, ptr); fd = open(resource, O_RDONLY, 0); if(fd == -1) { envoyer_chaine(1, "HTTP/1.0 404 NOT FOUND\r\n"); envoyer_chaine(1, "Server: Zorgos webserver\r\n\r\n"); envoyer_chaine(1, "<html><head><title>404 Not Found</title></head>"); envoyer_chaine(1, "<body><h1>URL not found</h1></body></html>\r\n"); } else { envoyer_chaine(1, "HTTP/1.0 200 OK\r\n"); envoyer_chaine(1, "Server: Zorgos webserver\r\n\r\n"); if(ptr == req + 4) { langeur = taille_fichier(fd); ptr = (char *) malloc(langeur); read(fd, ptr, langeur); send(1, ptr, langeur, 0); free(ptr); } close(fd); } } } return 0; }
void extraire(char *filetar, char *sortie) { long taille_fichier_entier; taille_fichier_entier = taille_fichier(filetar); //creation du dossier de sortie char dossier_cmd[100]; sprintf(dossier_cmd, "mkdir %s%s", sortie, filetar); printf("dossier_cmd %s\n", dossier_cmd ); // system(dossier_cmd); //ouverture du fichier TAR à desarchiver FILE *fr = NULL; fr = fopen(filetar, "rb"); // en mode "read binary" if (fr != NULL) { int end_file; end_file=0; while (end_file==0) { // on récupère le nom du fichier char filename[TAILLE_NOM_FICHIER]; fread (filename, TAILLE_NOM_FICHIER, 1, fr); // on créé le chemin complet du fichier de sortie char filepath[100]; sprintf(filepath, "%s%s", sortie, filename); //on créé un nouveau fichier portant ce nom FILE *file_n = NULL; file_n = fopen(filepath, "w"); // en mode write if (file_n != NULL) { fclose(file_n); } char permissions[TAILLE_PERMISSIONS]; fread (permissions, TAILLE_PERMISSIONS, 1, fr); int perm_int; perm_int = atoi(permissions); char perm_cmd[100]; sprintf(perm_cmd, "chmod %i %s", perm_int, filepath); system(perm_cmd); char proprio[TAILLE_PROPRIETAIRE]; fread (proprio, TAILLE_PROPRIETAIRE, 1, fr); char groupe[TAILLE_GROUPE]; fread (groupe, TAILLE_GROUPE, 1, fr); char taille_octal_str[TAILLE_TAILLE_FICHIER]; int taille_dec; fread (taille_octal_str, TAILLE_TAILLE_FICHIER, 1, fr); taille_dec = ocToDec(atoi(taille_octal_str)); char last_modif[TAILLE_DERNIERE_MODIF]; fread (last_modif, TAILLE_DERNIERE_MODIF, 1, fr); char checksum[TAILLE_CHEKSUM]; fread (checksum, TAILLE_CHEKSUM, 1, fr); char type[TAILLE_TYPE]; fread (type, TAILLE_TYPE, 1, fr); char linkname[TAILLE_NOM_FICHIER_LIE]; fread (linkname, TAILLE_NOM_FICHIER_LIE, 1, fr); char headrest[TAILLE_USTAR_HEADER]; fread (headrest, TAILLE_USTAR_HEADER, 1, fr); char *fileraw; fileraw = malloc(taille_dec*sizeof(char)); // char fileraw[taille_dec]; fread (fileraw, 1, taille_dec, fr); //------------------------------------------------------------------------------------------------------------------------ //ecriture du fichier lui même [ 512 -> ...] file_n = fopen(filepath, "ab"); /* add binary */ if (file_n != NULL) { fwrite(fileraw, 1, taille_dec, file_n); fclose(file_n); } int decalage; decalage = decalage_curseur_fichier_suivant(ftell(fr), taille_dec); fseek(fr, decalage, SEEK_CUR); long sauv_position_curseur; sauv_position_curseur = ftell(fr); char testfinfichier[TAILLE_BLOC]; fread (testfinfichier, TAILLE_BLOC, 1, fr); end_file=1; int i; i = 0; while (end_file==1 && i<TAILLE_BLOC) { if (testfinfichier[i] != 0) { end_file=0; } i++; } fseek(fr, sauv_position_curseur, SEEK_SET); free(fileraw); } fseek(fr, 0, SEEK_END); fclose(fr); } }