Pagini recente » Cod sursa (job #153279) | Cod sursa (job #1554517) | Cod sursa (job #637839) | Cod sursa (job #1802543) | Cod sursa (job #2107427)
#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 );
}