#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include "projection.h" struct projection{ size_t longueur_du_fichier; int fd; void *adresse; }; static void verifier(bool c, char *s) { if (c) return; perror(s); exit(EXIT_FAILURE); } static void projeter(projection p, size_t taille) { p->longueur_du_fichier = taille; if (taille == 0) { p->adresse = NULL; return; } p->adresse= mmap(NULL, taille, PROT_READ | PROT_WRITE, MAP_SHARED, p->fd, 0 ); verifier(p->adresse != MAP_FAILED, "map"); } static void deprojeter(projection p) { if (p->adresse == NULL) return; int err = munmap(p->adresse,p->longueur_du_fichier); verifier(err == 0, "munmap") ; } projection projection_creer(char *chemin_du_fichier) { struct stat proprietes; projection p = malloc(sizeof(*p)); p->fd = open(chemin_du_fichier,O_RDWR | O_CREAT,0666); verifier(p->fd > 0, chemin_du_fichier); fstat(p->fd, &proprietes); projeter(p, proprietes.st_size); return p; } void projection_detruire(projection p) { close(p->fd); deprojeter(p); free(p); } void * projection_redimensionner(projection p, size_t longueur) { if(p->longueur_du_fichier == longueur) return p->adresse; int err=ftruncate(p->fd,longueur); verifier(err == 0, "ftruncate") ; deprojeter(p); projeter(p,longueur); return p->adresse; } void * projection_adresse(projection p) { return p->adresse; } size_t projection_dimension(projection p) { return p->longueur_du_fichier; }