Cod sursa(job #2107427)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 17 ianuarie 2018 10:18:28
Problema A+B Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 3.05 kb
#define FUSE_USE_VERSION 30

#include <linux/fuse.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <zip.h>
#include <errno.h>

zip_t* archive;


//path este calea directorului citit
//in buffer vor fi puse numele fisierelor si directoarelor ce exista in directorul din path
//filler este o functie transmisa de FUSE folosita pentru a atribui lui buffer numele corespunzatoare

static int read_director(const char *path, void *buffer, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
{
	printf( "--> Getting The List of Files of %s\n", path );

	//adauga in path intrarile
	filler( buffer, ".", NULL, 0 ); // Intrarea directorului curent
	filler( buffer, "..", NULL, 0 ); //Intrarea in directorul parinte

	// Cazul in care avem directorul radacina al arhivei, scriem in buffer numele fisierelor/directoarelor copii root-ului
	if ( strcmp( path, "/" ) == 0 ) 
	{
		filler( buffer, "nume_fisier", NULL, 0);
	}

	return 0;
}


//path este calea fisierului care trebuie citit
//buffer ofera informatii despre fisierul citit, face referire la segmentul din fisier care se citeste
//size reprezinta marimea segmentului din fisier citit
//offset reprezinta numarul de bytes peste care se sare, pozitia de pe care se porneste citirea este 0+offset
//functia returneaza numarul de bytes care au fost cititi


static int read_file( const char *path, char *buffer, size_t size, off_t offset, struct fuse_file_info *fi )
{
	char *Text_selectat = NULL;	//Variabila care va retine informatia citita
	
	//Folosind zip_fopen deschidem un fisier din arhiva la care vom ponta cu pointerul fisier
	zip_file_t* fisier = zip_fopen(zipArchive, path + 1, 0);
	
	if(fisier!=NULL)	//Daca fisierul a fost deschis
	{
		//Structura care memoreaza informatiile despre un fisier din zip
		zip_stat_t st;
	
		//Initializam valorile structurii asociate lui st;
		zip_stat_init(&st);

		//Functia zip_stat obtine informatiile despre fisierul cu numele path/ aflat la adresa indicata de path
		//Informatiile obtinute de zip_stat sunt puse in campurile variebilei st
		zip_stat(archive,path, 0, &st);

		//Atribuim lungimea necesara citirii variabilei Text_selectat
		char* Text_selectat= (char*) malloc( (st.size) *sizeof(char));
		
		//functia zip_fread citeste din fisier atatia bytes cat este lungimea fisierului(st.size) 
		//Si pune textul citit in Text_selectat
		if(zip_fread(fisier, Text_selectat, st.size)==-1)
		{
		perror("Probleme la citire din fisier");
		return errno;
		}
	}
	else	//Daca au fost probleme la deschiderea fisierului intoarcem valoarea -1
	{
		return -1;
	}
	
	//Copiem textul citit in buffer de la pozitia offsetului
	memcpy( buffer, Text_selectat + offset, size );

	return strlen((char*)buffer);
}

static struct fuse_operations operations = {
    .readdir	= read_director,
    .read	= read_file,
};


int main( int argc, char *argv[] )
{
	archive = zip_open(argv[1],0,0); 
	return fuse_main( argc, argv, &operations, NULL );
}