#pragma once #ifndef _API_FILE #define _API_FILE #include /* TODO: include lib di logging */ /* TODO: finire tutte le descrizioni */ // Lista dei client in attesa su una lock typedef struct struct_waiting { long fd; // client in attesa char *file; // file su cui si vuole acquisire la lock struct struct_waiting *next; // puntatore al prossimo elemento della lista } waiting_t; /** * Apri o crea un nuovo file * \param filepath: nome del file * \param flags * \param q: queue in cui inserire il file * \param fd_c: * \param logFileT: */ void openFile(char *filepath, int flags, queueT *q, long fd_c, logT *logFileT); // Leggi un file e invialo al client void readFile(char *filepath, queueT *q, long fd_c, logT *logFileT); // Invia al client $n file qualsiasi dalla queue void readNFiles(char *numStr, queueT *q, long fd_c, logT *logFileT); // Scrivi dati su un file giĆ  creato (append o overwrite) void writeFile(char *filepath, size_t size, queueT *q, long fd_c, logT *logFileT, int append); // Acquisisci lock di un file void lockFile(char *filepath, queueT *q, long fd_c, logT *logFileT, pthread_mutex_t *lock, waitingT **waiting); // Rilascia una Lock di un file void unlockFile(char *filepath, queueT *q, long fd_c, logT *logFileT, pthread_mutex_t *lock, waiting_t **waiting); // Chiudi un file void closeFile(char *filepath, queueT *q, long fd_c, logT *logFileT, pthread_mutex_t *lock, waiting_t **waiting); // Rimuovi un file void removeFile(char *filepath, queueT *q, long fd_c, logT *logFileT, pthread_mutex_t *lock, waiting_t **waiting); // Funzione ausiliaria che invia un file al client int sendFile(fileT *f, long fd_c, logT *logFileT); // Aggiunge una coppia client/file alla coda in attesa di ottenere una lock int addWaiting(waiting_t **waiting, char *file, int fd); // Ottiene il primo client in attesa su una lock di un determinato file int removeFirstWaiting(waiting_t **waiting, char *file); // Distrugge la lista d'attesa e ne libera la memoria void clearWaiting(waiting_t **waiting); #endif // _API_FILE