--- rpl/src/gestion_fichiers.c 2011/09/26 15:57:10 1.35 +++ rpl/src/gestion_fichiers.c 2013/03/21 12:07:38 1.51 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.4 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -77,8 +77,8 @@ creation_nom_fichier(struct_processus *s do { - sprintf(tampon, "RPL-%lu-%lu-%lu", (unsigned long) getpid(), - (unsigned long) pthread_self(), ordre); + sprintf(tampon, "RPL-%llu-%llu-%lu", (unsigned long long) getpid(), + (unsigned long long) pthread_self(), ordre); if (chemin == NULL) { @@ -222,7 +222,7 @@ recherche_chemin_fichiers_temporaires(st { if (chemins[i][0] == '$') { - candidat = getenv("RPL_TMP_PATH"); + candidat = getenv(chemins[i] + 1); if (candidat != NULL) { @@ -287,7 +287,7 @@ recherche_chemin_fichiers_temporaires(st i++; } - return chemin; + return(chemin); } @@ -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; @@ -430,8 +477,8 @@ initialisation_controle(struct_processus return(d_erreur); } - if (sqlite3_prepare_v2(sqlite, commande, strlen(commande), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande, (int) strlen(commande), + &ppStmt, &queue) != SQLITE_OK) { free(commande); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;