--- rpl/src/gestion_fichiers.c 2010/04/07 13:45:03 1.11 +++ rpl/src/gestion_fichiers.c 2012/01/05 10:18:59 1.38 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.14 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.5 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -77,7 +77,7 @@ creation_nom_fichier(struct_processus *s do { - sprintf(tampon, "RPL2-%lu-%lu-%lu", (unsigned long) getpid(), + sprintf(tampon, "RPL-%lu-%lu-%lu", (unsigned long) getpid(), (unsigned long) pthread_self(), ordre); if (chemin == NULL) @@ -229,7 +229,7 @@ recherche_chemin_fichiers_temporaires(st if ((nom_candidat = creation_nom_fichier(s_etat_processus, candidat)) == NULL) { - return NULL; + return(NULL); } if ((fichier = fopen(nom_candidat, "w+")) != NULL) @@ -245,7 +245,7 @@ recherche_chemin_fichiers_temporaires(st } else { - return NULL; + return(NULL); } } else @@ -259,7 +259,7 @@ recherche_chemin_fichiers_temporaires(st if ((nom_candidat = creation_nom_fichier(s_etat_processus, chemins[i])) == NULL) { - return NULL; + return(NULL); } if ((fichier = fopen(nom_candidat, "w+")) != NULL) @@ -275,7 +275,7 @@ recherche_chemin_fichiers_temporaires(st } else { - return NULL; + return(NULL); } } else @@ -348,6 +348,53 @@ caracteristiques_fichier(struct_processu l_element_courant = (*l_element_courant).suivant; } } + else if (errno == EACCES) + { + // Le répertoire n'est pas accessible en écriture. On tente + // l'ouverture du fichier. + + if ((descripteur = open(nom, O_RDONLY, S_IRUSR | S_IWUSR)) == -1) + { + // Le fichier n'existe pas. + close(descripteur); + erreur = d_absence_erreur; + } + else + { + erreur = d_absence_erreur; + (*existence) = d_vrai; + + // On chercher à savoir si le fichier est ouvert. + // S'il est ouvert, on renvoie son unité de rattachement. + + l_element_courant = (*s_etat_processus).s_fichiers; + + while(l_element_courant != NULL) + { + if (strcmp((*((struct_descripteur_fichier *) + (*l_element_courant).donnee)).nom, nom) == 0) + { + if (((*((struct_descripteur_fichier *) + (*l_element_courant).donnee)).pid == getpid()) + && (pthread_equal( + (*((struct_descripteur_fichier *) + (*l_element_courant).donnee)).tid, + pthread_self()) != 0)) + { + (*ouverture) = d_vrai; + + (*unite) = (unsigned long) + fileno((*((struct_descripteur_fichier *) + (*l_element_courant).donnee)) + .descripteur_c); + break; + } + } + + l_element_courant = (*l_element_courant).suivant; + } + } + } else { erreur = d_erreur;