#include "hyppocampus.h"
Definizioni | |
| #define | BLOCK_BACK() |
| #define | FORWARD_BLOCK() |
| #define | JUMP_NEXT_HEADER(node) |
| #define | REWRITE_NODE(node) |
| #define | UPDATE_COUNTERS_IN_HEADER(meta, valid, free) |
| #define | GET_NODES_COUNT(node, valid, free) |
| #define | IS_NODE_EMPTY(node) |
| #define | IS_META_HEADER(node) ( node->prev == HEADER_INODE_IDENTIFIER ) |
| #define | IS_META_HEADER_FOR(node, meta) ( IS_META_HEADER ( node ) && ( node->file == meta ) ) |
Ridefinizioni di tipo (typedefs) | |
| typedef int(*) | EvaluationCallback (void *, void *, int) |
Funzioni | |
| HyppoNode * | get_node () |
| int | compare_char (void *first, void *second, int dim) |
| int | compare_ushort (void *first, void *second, int dim) |
| int | compare_short (void *first, void *second, int dim) |
| int | compare_uint (void *first, void *second, int dim) |
| int | compare_int (void *first, void *second, int dim) |
| int | compare_double (void *first, void *second, int dim) |
| int | compare_float (void *first, void *second, int dim) |
| int | compare_ulong (void *first, void *second, int dim) |
| int | compare_long (void *first, void *second, int dim) |
| int | compare_ullong (void *first, void *second, int dim) |
| int | compare_llong (void *first, void *second, int dim) |
| int | compare_wchar (void *first, void *second, int dim) |
| int | compare_string (void *first, void *second, int dim) |
| int | compare_wstring (void *first, void *second, int dim) |
| EvaluationCallback | get_evaluation_callback (UINT64 meta) |
| void | add_in_opened_file (UINT64 fileid, unsigned long desc) |
| UINT64 | look_into_opened_files (unsigned long desc) |
| void | remove_from_opened_file (unsigned long desc) |
| int | go_to_start_of_array (UINT64 meta) |
| int | go_to_end_of_array (UINT64 meta) |
| UINT64 | search_file_by_meta (char *data, UINT64 meta, int size) |
| void | add_node_here (HyppoNode *node) |
| UINT64 | get_real_path (const char *path) |
| int | check_meta (UINT64 fileid, UINT64 metaid, HyppoNode *node) |
| int | reconstruct_file (UINT64 fileid, UINT64 array[], UINT64 size, UINT64 max) |
| int | convert_string_to_value (int type, char *string, void *value) |
| int | convert_value_to_string (int type, void *value, char *string, int size) |
| void | add_sorted_node_special (UINT64 meta, char *value, int size, UINT64 file, UINT64 prev, UINT64 next) |
| void | add_sorted_node (UINT64 meta, char *value, int size, UINT64 file, UINT64 prev, UINT64 next, gboolean exists) |
| int | setattr (UINT64 fileid, UINT64 metaid, const char *value, size_t size, int flags) |
| int | getattr (UINT64 fileid, UINT64 metaid, char *value, size_t size) |
| int | distruggi_nodo (UINT64 metaid, UINT64 fileid) |
| int | delattr (UINT64 fileid, UINT64 metaid) |
| void | init_file_now (UINT64 fileid, mode_t privileges, char *name) |
| int | prepare_for_xattr (const char *path, const char *meta, UINT64 *fileid, UINT64 *metaid) |
| void | fake_stat_for_dir (struct stat *fake) |
| int | get_stat_by_id (UINT64 id, struct stat *fake) |
| char | jump_trailing_spaces (char *string, int *index) |
| else | if (AllMetadata[st[numel].meta].type &META_TYPE_STRING||AllMetadata[st[numel].meta].type &META_TYPE_WSTRING) |
| int | hyppo_listxattr (const char *path, char *list, size_t size) |
| int | hyppo_removexattr (const char *path, const char *name) |
| int | hyppo_open (const char *path, struct fuse_file_info *desc) |
| int | hyppo_read (const char *path, char *data, size_t size, off_t offset, struct fuse_file_info *desc) |
| int | hyppo_write (const char *path, const char *data, size_t dim, off_t where, struct fuse_file_info *desc) |
| int | hyppo_unlink (const char *path) |
| int | hyppo_flush (const char *path, struct fuse_file_info *desc) |
| int | hyppo_release (const char *path, struct fuse_file_info *desc) |
| int | hyppo_fsync (const char *path, int datasync, struct fuse_file_info *desc) |
| int | hyppo_getattr (const char *path, struct stat *ret) |
| int | hyppo_mknod (const char *path, mode_t privileges, dev_t device) |
| int | hyppo_rename (const char *old, const char *new) |
| int | hyppo_chmod (const char *path, mode_t privileges) |
| int | hyppo_chown (const char *path, uid_t user, gid_t group) |
| int | hyppo_truncate (const char *path, off_t dimension) |
| int | hyppo_utime (const char *path, struct utimbuf *new_time) |
| int | hyppo_access (const char *path, int mask) |
| int | hyppo_create (const char *path, mode_t privileges, struct fuse_file_info *desc) |
| int | hyppo_ftruncate (const char *path, off_t where, struct fuse_file_info *desc) |
| int | hyppo_fgetattr (const char *path, struct stat *ret, struct fuse_file_info *desc) |
| int | hyppo_mkdir (const char *path, mode_t privileges) |
| int | hyppo_opendir (const char *path, struct fuse_file_info *desc) |
| int | hyppo_readdir (const char *path, void *data, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *desc) |
| int | hyppo_rmdir (const char *path) |
| int | hyppo_releasedir (const char *path, struct fuse_file_info *desc) |
| int | hyppo_fsyncdir (const char *path, int flags, struct fuse_file_info *desc) |
| void * | hyppo_init () |
| void | hyppo_destroy (void *useless) |
| int | hyppo_statfs (const char *path, struct statvfs *to_ret) |
| int | main (int argc, char **argv) |
Variabili | |
| HyppoSB | HyppoSuperBlock |
| StateDesc | Current |
| HyppoNodeC * | ReadingNodesCache [100] |
| FILE * | HyppoFileSystem |
| GSList * | OpenFilesStack |
| static struct fuse_operations | hyppo_ops |
| #define BLOCK_BACK | ( | ) |
Valore:
{ \
fseeko ( HyppoFileSystem, ( hyppo_off_t ) ( ftello ( HyppoFileSystem ) - sizeof ( HyppoNode ) ), SEEK_SET ); \
}
| #define FORWARD_BLOCK | ( | ) |
Valore:
{ \
fseeko ( HyppoFileSystem, ( hyppo_off_t ) ( ftello ( HyppoFileSystem ) + sizeof ( HyppoNode ) ), SEEK_SET ); \
}
| #define JUMP_NEXT_HEADER | ( | node | ) |
Valore:
{ \
if ( !IS_META_HEADER ( node ) ) { \
printf ( "Error: looking for header, node found\n" ); \
exit ( -1 ); \
} \
\
fseeko ( HyppoFileSystem, ( hyppo_off_t ) ( ftello ( HyppoFileSystem ) + ( sizeof ( HyppoNode ) * *( node->value ) ) ), SEEK_SET ); \
fseeko ( HyppoFileSystem, ( hyppo_off_t ) ( ftello ( HyppoFileSystem ) + ( sizeof ( HyppoNode ) * node->value [ FREE_BLOCKS_OFFSET ] ) ), SEEK_SET ); \
}
| #define REWRITE_NODE | ( | node | ) |
Valore:
{ \
DBG ( "REWRITE_NODE +" ); \
BLOCK_BACK (); \
fwrite ( node, sizeof ( HyppoNode ), 1, HyppoFileSystem ); \
DBG ( "REWRITE_NODE -" ); \
}
| #define UPDATE_COUNTERS_IN_HEADER | ( | meta, | |||
| valid, | |||||
| free | ) |
Valore:
{ \
DBG ( "UPDATE_COUNTERS_IN_HEADER +" ); \
HyppoNode *node; \
\
go_to_start_of_array ( meta ); \
node = get_node (); \
*( node->value ) = valid; \
node->value [ FREE_BLOCKS_OFFSET ] = free; \
DBG ( "%llu = valid = %llu / free = %llu", meta, ( unsigned long long ) *( node->value ), \
( unsigned long long ) node->value [ FREE_BLOCKS_OFFSET ] ); \
REWRITE_NODE ( node ); \
DBG ( "UPDATE_COUNTERS_IN_HEADER -" ); \
}
| #define GET_NODES_COUNT | ( | node, | |||
| valid, | |||||
| free | ) |
Valore:
{ \
if ( !IS_META_HEADER ( node ) ) { \
printf ( "Error: looking for header, node found\n" ); \
exit ( -1 ); \
} \
\
valid = ( unsigned long long ) *( node->value ); \
free = ( unsigned long long ) node->value [ FREE_BLOCKS_OFFSET ]; \
}
| #define IS_NODE_EMPTY | ( | node | ) |
Valore:
( node->prev == EMPTY_INODE_IDENTIFIER && \ node->file == EMPTY_INODE_IDENTIFIER && \ node->next == EMPTY_INODE_IDENTIFIER )
| #define IS_META_HEADER | ( | node | ) | ( node->prev == HEADER_INODE_IDENTIFIER ) |
Usata come espressione condizionale, TRUE se il nodo passato come parametro e' header di un metadato
| #define IS_META_HEADER_FOR | ( | node, | |||
| meta | ) | ( IS_META_HEADER ( node ) && ( node->file == meta ) ) |
Usata come espressione condizionale, TRUE se il nodo passato come parametro e' header del metadato esplicitato nel secondo parametro
| typedef int( *) EvaluationCallback(void *, void *, int) |
| HyppoNode* get_node | ( | ) |
Solo per uso interno.
Legge dal file d Hyppocampus il nodo presso cui si trova l'indice di scorrimento, facendo avanzare di sizeof(HyppoNode) il cursore
| int compare_char | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra char
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_ushort | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra unsigned short
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_short | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra short
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_uint | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra unsigned int
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_int | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra int
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_double | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra double
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_float | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra float
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_ulong | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra unsigned long
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_long | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra long
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_ullong | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra unsigned long long
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_llong | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra long long
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_wchar | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra wchar
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_string | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra stringhe
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| int compare_wstring | ( | void * | first, | |
| void * | second, | |||
| int | dim | |||
| ) |
Solo per uso interno.
Funzione di comparazione tra stringhe wchar
| first | Primo valore da confrontare | |
| second | Secondo valore da confrontare | |
| dim | Dimensione del primo valore |
| EvaluationCallback get_evaluation_callback | ( | UINT64 | meta | ) |
Solo per uso interno.
Poiche' per ogni metadato i valori sono conservati in un formato particolare (a volte come stringhe, a volte come interi...), questa funzione restituisce il puntatore alla funzione piu' adatta a valutare la differenza tra due valori assegnati ad un certo metadato
| meta | ID del metadato per cui ci sono valori da confrontare |
| void add_in_opened_file | ( | UINT64 | fileid, | |
| unsigned long | desc | |||
| ) |
Solo per uso interno.
Per aggiungere un file descriptor nella lista interna dei files aperti
| fileid | ID del file aperto | |
| desc | File descriptor associato al file |
| UINT64 look_into_opened_files | ( | unsigned long | desc | ) |
Solo per uso interno.
Funzione usata per rintracciare un file descriptor tra quelli aperti e tracciati
| desc | File descriptor da cercare |
| void remove_from_opened_file | ( | unsigned long | desc | ) |
Solo per uso interno.
Rimuove un file descriptor dalla lista interna
| desc | File descriptor da rimuovere |
| int go_to_start_of_array | ( | UINT64 | meta | ) |
Solo per uso interno.
Porta il cursore di spostamento nel file Hyppocampus all'inizio dell'array (ovvero: prima del relativo header) dedicato al metadato desiderato
| meta | Il metadato presso cui ci si deve spostare |
| int go_to_end_of_array | ( | UINT64 | meta | ) |
Solo per uso interno.
Porta il cursore di spostamento nel file Hyppocampus alla fine dell'array (ovvero: prima dell'ultimo nodo contenuto nell'array stesso) dedicato al metadato desiderato
| meta | Il metadato alla fine del quale ci si deve posizionare |
| UINT64 search_file_by_meta | ( | char * | data, | |
| UINT64 | meta, | |||
| int | size | |||
| ) |
Solo per uso interno.
Cerca il primo file cui corrisponde un certo metadato con un certo valore
| data | Il valore che deve assumere il valore del metadato per matchare la ricerca | |
| meta | Il metadato entro cui cercare | |
| size | Dimensione del valore in "data" |
| void add_node_here | ( | HyppoNode * | node | ) |
Solo per uso interno.
Inserisce un nodo all'interno del file di Hyppocampus presso la posizione corrente del cursore di spostamento, shiftando tutti i blocchi che lo seguono fino al primo nodo vuoto incontrato
| node | Il nodo da inserire nel file |
| UINT64 get_real_path | ( | const char * | path | ) |
Solo per uso interno.
Data una path avanzata al filesystem cerca il file corrispondente. Vengono considerati validi sia i valori numerici stampati all'interno della stringa "path", interpretati come ID da cercare, sia le stringhe, considerate come nomi di files o directory
| path | La path logica del file che si desidera |
| int check_meta | ( | UINT64 | fileid, | |
| UINT64 | metaid, | |||
| HyppoNode * | node | |||
| ) |
Solo per uso interno.
Preleva il nodo del metadato indicato associato al file esplicitato
| fileid | ID del file cui il metadato appartiene | |
| metaid | ID del metadato da cercare | |
| node | Puntatore ad un HyppoNode che verra' riempito col nodo letto |
| int reconstruct_file | ( | UINT64 | fileid, | |
| UINT64 | array[], | |||
| UINT64 | size, | |||
| UINT64 | max | |||
| ) |
Solo per uso interno.
Ricostruisce la lista di metadati associati ad un file
| fileid | ID del file di cui si vogliono reperire i metadati associati | |
| array | Array che verra' riempito con gli identificativi dei tipi di metadato riscontrati per il file desiderato | |
| size | Numero di elementi presenti in "array" | |
| max | Identificativo dell'ultimo metadato di cui si vuole avere notifica: non appena la ricerca si imbatte in un identificativo >= di "max", la ricerca si interrompe e la funzione ritorna. Se si desiderano recuperare tutti i metadati associati al file, settare questo parametro a 0 |
Tratto il primo nodo della lista in maniera particolare, in modo da non dover scrivere regole complesse per la condizione del ciclo di iterazione
| int convert_string_to_value | ( | int | type, | |
| char * | string, | |||
| void * | value | |||
| ) |
Solo per uso interno.
Converte una stringa in un valore adatto per essere conservato nel filesystem
| type | Tipo di valore ammesso per il metadato di destinazione | |
| string | Formato ASCII del valore | |
| value | Formato finale del valore |
Conversione da stringa a struttura
Conversione da stringa a enum
| int convert_value_to_string | ( | int | type, | |
| void * | value, | |||
| char * | string, | |||
| int | size | |||
| ) |
Solo per uso interno.
Converte un valore dalla sua forma originaria in una stringa. Cio' e' necessario perche' la API di interfaccia al filesystem si basa interamente su stringhe, mentre nel filesystem i valori sono conservati in base alla loro natura (int, long, char*...)
| type | Tipo di valore del metadato in esame | |
| value | Puntatore al valore originario, cosi' come estratto dal filesystem | |
| string | Stringa da riempire con la forma ASCII del valore | |
| size | Dimensione della stringa "string" |
| void add_sorted_node_special | ( | UINT64 | meta, | |
| char * | value, | |||
| int | size, | |||
| UINT64 | file, | |||
| UINT64 | prev, | |||
| UINT64 | next | |||
| ) |
Solo per uso interno.
Inserisce un nuovo metadato nella tabella complessiva, ma senza aggiornare il resto del file e i "puntatori" interni
| meta | Identificativo del nuovo metadato | |
| value | Valore allegato al metadato | |
| size | Dimensione del valore in "value" | |
| file | File cui il metadato e' associato | |
| prev | Identificativo del metadato che precede il nuovo nella lista di attributi per il file | |
| next | Identificativo del metadato che segue il nuovo nella lista di attributi per il file |
| void add_sorted_node | ( | UINT64 | meta, | |
| char * | value, | |||
| int | size, | |||
| UINT64 | file, | |||
| UINT64 | prev, | |||
| UINT64 | next, | |||
| gboolean | exists | |||
| ) |
Solo per uso interno.
Come add_sorted_node_special(), ma permette di inserire il nuovo blocco non solo fisicamente (scrivendolo sul file) ma anche logicamente, inserendolo all'interno della struttura logica di liste doppiamente linkate che descrivono i singoli files
| meta | Identificativo del nuovo metadato | |
| value | Valore allegato al metadato | |
| size | Dimensione del valore in "value" | |
| file | File cui il metadato e' associato | |
| prev | Identificativo del metadato che precede il nuovo nella lista di attributi per il file | |
| next | Identificativo del metadato che segue il nuovo nella lista di attributi per il file | |
| exists | TRUE se il nodo esiste gia' e si invoca questa funzione solo per aggiornarlo con un nuovo valore, FALSE se il nodo va inserito ex-novo |
| int setattr | ( | UINT64 | fileid, | |
| UINT64 | metaid, | |||
| const char * | value, | |||
| size_t | size, | |||
| int | flags | |||
| ) |
Solo per uso interno.
Setta un attributo esteso per un file, aggiungendolo alla struttura globale o aggiornando i dati esistenti in base al valore dell'ultimo parametro
| fileid | Identificativo del file per cui agire | |
| metaid | Identificativo del tipo di metadato da aggiungere / sostituire | |
| value | Valore assunto dal metadato per il file selezionato | |
| size | Dimensione di "value" | |
| flags | Maschera che definisce il comportamento della funzione, valgono gli stessi valori che vengono passati come ultimo parametro di hyppo_setxattr() |
| int getattr | ( | UINT64 | fileid, | |
| UINT64 | metaid, | |||
| char * | value, | |||
| size_t | size | |||
| ) |
Solo per uso interno.
Preleva un metadato dalla struttura globale
| fileid | Identificativo del file da cui prelevare il metadato | |
| metaid | Identificativo del metadato da estrarre per il file | |
| value | Area di memoria che verra' riempita col valore assunto per il metadato selezionato | |
| size | Dimensione di allocazione di "value" |
Non viene ancora contemplato il tipo META_TYPE_ENUM
| int distruggi_nodo | ( | UINT64 | metaid, | |
| UINT64 | fileid | |||
| ) |
Solo per uso interno.
Elimina un nodo dal file Hyppocampus di riferimento, sovrascrivendolo con un nodo vuoto (zero-filled).
| metaid | Identificativo del metadato da eliminare | |
| fileid | Identificativo del file da cui rimuovere il metadato |
| int delattr | ( | UINT64 | fileid, | |
| UINT64 | metaid | |||
| ) |
Solo per uso interno.
Rimuove un metadato precedentemente assegnato ad un file
| fileid | Identificativo del file da cui rimuovere il metadato | |
| metaid | Identificativo del metadato da eliminare |
| void init_file_now | ( | UINT64 | fileid, | |
| mode_t | privileges, | |||
| char * | name | |||
| ) |
Solo per uso interno.
Inizializza un nuovo file, appena creato, inizializzandone i metadati fondamentali
| fileid | ID del nuovo file appena creato. Deve essere univoco all'interno del sistema e non viene qui effettuato alcun controllo sulla sua unicita' | |
| privileges | Privilegi di accesso al file. Sono definiti a priori dalla funzione effettiva di creazione di nuovi files, dipendono dall'applicazione in userspace che effettua la richiesta | |
| name | Nome assegnato al nuovo file. Non deve essere necessariamente univoco |
| int prepare_for_xattr | ( | const char * | path, | |
| const char * | meta, | |||
| UINT64 * | fileid, | |||
| UINT64 * | metaid | |||
| ) |
Solo per uso interno.
A discapito del nome, la funzione non fa altro che convertire le rappresentazioni ASCII di un file e di un metadato nelle rappresentazioni puramente numeriche: il path del file diviene un ID, ed altrettanto la stringa che descrive un metadato
| path | Path del file di cui manipolare i metadati | |
| meta | Metadato desiderato, espresso in forma di stringa. Sono ammesse solo rappresentazioni numeriche dei metadati, se la stringa non contiene un numero la funzione torna con un errore | |
| fileid | Puntatore che verra' settato all'ID del file richiesto | |
| metaid | Puntatore che verra' settato al valore numerico binario del metadato richiesto |
| void fake_stat_for_dir | ( | struct stat * | fake | ) |
Solo per uso interno.
Funzione destinata a sparire qualora si definisca il criterio di manipolazione delle directory e delle pseudo-directory in Hyppocampus: attualmente viene usata ogniqualvolta vengono richieste le informazioni fondamentali di una cartella (o di una query SQL, che viene vista come una cartella), e fornisce un set di dati sempre uguali e settati a priori
| fake | La struttura stat da riempire con le informazioni fasulle |
| int get_stat_by_id | ( | UINT64 | id, | |
| struct stat * | fake | |||
| ) |
Solo per uso interno.
Funzione di comodo che riempie una struttura di tipo stat con i valori recuperati dal filesystem
| id | Identificativo del file di cui si vogliono raccogliere i dati fondamentali | |
| fake | Struttura che verra' riempita con i valori raccolti all'interno del filesystem |
| char jump_trailing_spaces | ( | char * | string, | |
| int * | index | |||
| ) | [inline] |
Solo per uso interno.
Funzioncina usata per saltare gli spazi non significativi all'interno della query
| string | Stringa da elaborare | |
| index | Indice da cui partire per saltare gli spazi |
| else if | ( | AllMetadata.meta].type &META_TYPE_STRING||AllMetadata.meta].type & | META_TYPE_WSTRING[st[numel][st[numel] | ) |
| int hyppo_listxattr | ( | const char * | path, | |
| char * | list, | |||
| size_t | size | |||
| ) |
Permette di prelevare la lista di metadati assegnati ad un file
| path | Path del file di cui recuperare la lista di metadati | |
| list | Stringa che verra' riempita con i nomi dei metadati assegnati al file, separati da '\0' | |
| size | Dimensione massima della stringa in "list" |
| int hyppo_removexattr | ( | const char * | path, | |
| const char * | name | |||
| ) |
Rimuove un metadato assegnato ad un file
| path | Path del file da cui rimuovere un metadato | |
| name | Nome del metadato da rimuovere |
| int hyppo_open | ( | const char * | path, | |
| struct fuse_file_info * | desc | |||
| ) |
Apre un file sul filesystem e ne restituisce il descrittore
| path | Path del file da aprire | |
| desc | File descriptor interno a FUSE |
| int hyppo_read | ( | const char * | path, | |
| char * | data, | |||
| size_t | size, | |||
| off_t | offset, | |||
| struct fuse_file_info * | desc | |||
| ) |
| path | Path del file da leggere | |
| data | Buffer da riempire con i dati letti | |
| size | Dimensione del buffer da leggere | |
| offset | Indice da cui iniziare a leggere | |
| desc | File descriptor interno a FUSE |
| int hyppo_write | ( | const char * | path, | |
| const char * | data, | |||
| size_t | dim, | |||
| off_t | where, | |||
| struct fuse_file_info * | desc | |||
| ) |
Scrive un buffer di dati in un file
| path | Path del file in cui andare a scrivere | |
| data | Buffer dei dati da scrivere nel file | |
| dim | Dimensione del buffer "data" | |
| where | Indice del punto in cui iniziare a scrivere | |
| desc | File descriptor interno a FUSE |
| int hyppo_unlink | ( | const char * | path | ) |
Rimuove un file dal filesystem
| path | Path del file da rimuovere |
| int hyppo_flush | ( | const char * | path, | |
| struct fuse_file_info * | desc | |||
| ) |
Esegue un flush su un file precedentemente aperto
| path | Path del file di cui salvare lo stato | |
| desc | File descriptor interno a FUSE |
| int hyppo_release | ( | const char * | path, | |
| struct fuse_file_info * | desc | |||
| ) |
Chiude un file precedentemente aperto, togliendo il suo file descriptor dalla lista di quelli validi
| path | Path del file da rilasciare | |
| desc | File descriptor interno a FUSE |
| int hyppo_fsync | ( | const char * | path, | |
| int | datasync, | |||
| struct fuse_file_info * | desc | |||
| ) |
| int hyppo_getattr | ( | const char * | path, | |
| struct stat * | ret | |||
| ) |
Preleva le informazioni essenziali relative ad un file
| path | Path del file di cui prelevare i dati | |
| ret | Struttura di tipo struct stat che verra' compilata con le informazioni fondamentali relative al file |
Se la path cercata e' solo "/" sono state richieste le proprieta' della root del filesystem Hyppocampus, dunque si riempie la struttura di ritorno con dati abbastanza aleatori. Altrimenti, la stringa viene trattata in modo particolare:
| int hyppo_mknod | ( | const char * | path, | |
| mode_t | privileges, | |||
| dev_t | device | |||
| ) |
| int hyppo_rename | ( | const char * | old, | |
| const char * | new | |||
| ) |
Rinomina un file
| old | Vecchio nome del file | |
| new | Nuovo nome del file |
| int hyppo_chmod | ( | const char * | path, | |
| mode_t | privileges | |||
| ) |
| path | Path del file cui cambiare la modalita' di accesso | |
| privileges | Nuova maschera dei permessi da applicare |
| int hyppo_chown | ( | const char * | path, | |
| uid_t | user, | |||
| gid_t | group | |||
| ) |
Cambia l'utente ed il gruppo proprietario di un file
| path | Path del file di cui cambiare il proprietario | |
| user | Nuovo utente proprietario | |
| group | Nuovo gruppo proprietario |
| int hyppo_truncate | ( | const char * | path, | |
| off_t | dimension | |||
| ) |
Taglia il contenuto di un file a partire dalla dimensione specificata
| path | Path del file da troncare | |
| dimension | Indice da cui iniziare a tagliare il contenuto del file |
| int hyppo_utime | ( | const char * | path, | |
| struct utimbuf * | new_time | |||
| ) |
Permette di modificare la data dell'ultimo accesso e dell'ultima modifica di un file
| path | Path del file di cui modificare la data | |
| new_time | Struttura che contiene i nuovi valori da assegnare alla data di accesso e di modifica |
| int hyppo_access | ( | const char * | path, | |
| int | mask | |||
| ) |
Verifica la modalita' di accesso di un file
| path | Path del file da verificare | |
| mask | Maschera di attributi da testare sul file. Cfr. access (2) |
| int hyppo_create | ( | const char * | path, | |
| mode_t | privileges, | |||
| struct fuse_file_info * | desc | |||
| ) |
Crea ed apre un nuovo file
| path | Path del nuovo file da creare | |
| privileges | Privilegi con cui creare il file | |
| desc | Struttura che contiene il file descriptor che si riferisce al file appena creato ed aperto |
| int hyppo_ftruncate | ( | const char * | path, | |
| off_t | where, | |||
| struct fuse_file_info * | desc | |||
| ) |
Taglia il contenuto di un file alla dimensione specificata
| path | Path del file da troncare | |
| where | Offset da cui partire a tagliare il contenuto | |
| desc | Non usato |
| int hyppo_fgetattr | ( | const char * | path, | |
| struct stat * | ret, | |||
| struct fuse_file_info * | desc | |||
| ) |
Preleva le informazioni primarie relative ad un dato file
| path | Path del file di cui prelevare le informazioni | |
| ret | Struttura di tipo struct stat che verra' compilata con le informazioni principali relative al file richiesto | |
| desc | Non usato |
| int hyppo_mkdir | ( | const char * | path, | |
| mode_t | privileges | |||
| ) |
| int hyppo_opendir | ( | const char * | path, | |
| struct fuse_file_info * | desc | |||
| ) |
| int hyppo_readdir | ( | const char * | path, | |
| void * | data, | |||
| fuse_fill_dir_t | filler, | |||
| off_t | offset, | |||
| struct fuse_file_info * | desc | |||
| ) |
| path | Path della cartella da leggere. Se viene sottoposta una query SQL, la si trova qui, esattamente come se fosse una directory come le altre | |
| data | Buffer che viene riempito con le informazioni sui files reperiti nella cartella | |
| filler | Callback di riempimento del buffer "data" | |
| offset | Indice da cui partire con la lettura dei files | |
| desc | Non usato |
Ricordarsi che "path" inizia sempre con '/'
La funzione prevede la richiesta dei files contenuti nella root del filesystem...
... la ricerca per path tradizionale (vengono restituiti tutti i files che sono stati creati richiedendo una data path)...
... e la ricerca SQL (vengono restituiti i files che matchano la query passata)
| int hyppo_rmdir | ( | const char * | path | ) |
| int hyppo_releasedir | ( | const char * | path, | |
| struct fuse_file_info * | desc | |||
| ) |
| int hyppo_fsyncdir | ( | const char * | path, | |
| int | flags, | |||
| struct fuse_file_info * | desc | |||
| ) |
| void* hyppo_init | ( | ) |
Funzione di inizializzazione del filesystem: provvede a verificare il file di appoggio e, se non esiste, lo crea. Qui viene allocato lo spazio per la cache (cfr. get_node() ) ed sono inizializzate le variabili usate per l'ottimizzazione degli spostamenti
Se vuoto, il filesystem viene inizializzato con un file nominato "README". Per ora e' vuoto, ma dovrebbe contenere una breve descrizione sulle modalita' di accesso al filesystem stesso
| void hyppo_destroy | ( | void * | useless | ) |
Funzione invocata al momento della chiusura del filesystem, libera le risorse allocate in hyppo_init()
| useless | Dichiarato solo in favore del prototipo della funzione |
| int hyppo_statfs | ( | const char * | path, | |
| struct statvfs * | to_ret | |||
| ) |
Funzione per recuperare le informazioni relative al filesystem. In realta', poiche' Hyppocampus agisce al di sopra del filesystem locale realmente installato, vengono restituite le informazioni in merito a quest'ultimo, con poche o nessuna modifica ai valori originari
| path | Path di un qualunque file che si trova nel filesystem | |
| to_ret | Puntatore ad una struttura di tipo struct statvfs che verra' compilata con i valori opportuni |
Non esiste un numero massimo di caratteri che compongono il nome di un file: nel filesystem reale tutti i files sono salvati con, come nome, il loro stesso ID, mentre il nome utente viene memorizzato solo all'interno della struttura relazionale vera e propria
| int main | ( | int | argc, | |
| char ** | argv | |||
| ) |
Funzione primaria
| argc | Numero di argomenti passati all'invocazione | |
| argv | Lista degli argomenti passati |
"Superblocco" del filesystem Hyppocampus: qui si trovano le informazioni minime per sapere in che modo usare il file di sistema del filesystem
Qui si trova il riassunto dell'attuale posizionamento all'interno del file di descrizione del filesystem: permette di non iniziare sempre dall'inizio del file ad ogni ricerca, ma di tenere traccia dei precedenti spostamenti. Potrebbe essere utile usare non un solo elemento ma un'intero stack di spostamenti per minimizzare le ricerche e i seek
| HyppoNodeC* ReadingNodesCache[100] |
Array che contiene la cache dei nodi letti dal file fisico che contiene Hyppocampus: utile per evitare qualche seek e minimizzare gli accessi a disco
| FILE* HyppoFileSystem |
File che ospita l'intera struttura relazionale del filesystem montato, in forma binaria
| GSList* OpenFilesStack |
struct fuse_operations hyppo_ops [static] |
Struttura che riassume gli handler definiti per ogni operazione richiesta al modulo
1.4.7