--- rpl/src/gestion_fichiers.c 2011/03/06 16:44:09 1.22 +++ rpl/src/gestion_fichiers.c 2020/01/10 11:15:42 1.77 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.21 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 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,14 +222,14 @@ recherche_chemin_fichiers_temporaires(st { if (chemins[i][0] == '$') { - candidat = getenv("RPL_TMP_PATH"); + candidat = getenv(chemins[i] + 1); if (candidat != NULL) { 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 @@ -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; @@ -403,7 +450,7 @@ initialisation_controle(struct_processus unsigned char *commande; - if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, + if (sqlite3_prepare_v2(sqlite, commande1, (int) strlen(commande1), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -424,14 +471,15 @@ initialisation_controle(struct_processus if (fichier_indexe == d_vrai) { - if (alsprintf(&commande, commande2, position_clef) < 0) + if (alsprintf(s_etat_processus, &commande, commande2, position_clef) + < 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; 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; @@ -488,8 +536,8 @@ initialisation_fichier_acces_indexe(stru if (binaire == d_faux) { - if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande1, (int) strlen(commande1), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -507,8 +555,8 @@ initialisation_fichier_acces_indexe(stru return(d_erreur); } - if (sqlite3_prepare_v2(sqlite, commande10, strlen(commande10), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande10, (int) strlen(commande10), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -528,8 +576,8 @@ initialisation_fichier_acces_indexe(stru } else { - if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande2, (int) strlen(commande2), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -547,8 +595,8 @@ initialisation_fichier_acces_indexe(stru return(d_erreur); } - if (sqlite3_prepare_v2(sqlite, commande20, strlen(commande20), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande20, (int) strlen(commande20), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -567,7 +615,7 @@ initialisation_fichier_acces_indexe(stru } } - if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt, + if (sqlite3_prepare_v2(sqlite, commande3, (int) strlen(commande3), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -586,7 +634,7 @@ initialisation_fichier_acces_indexe(stru return(d_erreur); } - if (sqlite3_prepare_v2(sqlite, commande4, strlen(commande4), &ppStmt, + if (sqlite3_prepare_v2(sqlite, commande4, (int) strlen(commande4), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -630,8 +678,8 @@ initialisation_fichier_acces_direct(stru if (binaire == d_faux) { - if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande1, (int) strlen(commande1), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -651,8 +699,8 @@ initialisation_fichier_acces_direct(stru } else { - if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt, - &queue) != SQLITE_OK) + if (sqlite3_prepare_v2(sqlite, commande2, (int) strlen(commande2), + &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return(d_erreur); @@ -671,7 +719,7 @@ initialisation_fichier_acces_direct(stru } } - if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt, + if (sqlite3_prepare_v2(sqlite, commande3, (int) strlen(commande3), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;