/*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E T A T D ' U N F I C H I E R : */ /* */ /* */ /* Utilisation : */ /* */ /* Cette commande a ete introduite */ /* avec l'idee de l'utiliser dans */ /* 'v $xcg/Xsauvegardes$Z', ou serait */ /* alors utilise le "pseudo-age" comme */ /* veritable age au dela duquel les fichiers */ /* sont detruits. Ce "pseudo-age" varie de */ /* plus en plus vite avec l'age reel et la */ /* taille d'un fichier. Ainsi, un fichier */ /* a la fois vieux et gros a plus de chance */ /* d'etre detruit qu'un fichier de meme taille */ /* et plus jeune, et a fortiori qu'un petit */ /* fichier recent... */ /* */ /* On notera que ce "pseudo-age" pourrait */ /* etre utilise pour faire des '$TOUCH' des */ /* des fichiers de '$xs' afin de les vieillir */ /* artificiellement afin que '$FIN' teste donc */ /* directement le "pseudo-age". ATTENTION, cela */ /* pose malgre tout un petit probleme, au cas */ /* ou un tel '$TOUCH' est applique plusieurs */ /* fois de suite car alors un nouveau "pseudo-age" */ /* est toujours calcule a partir du "pseudo-age" */ /* precedent et non point de l'ancien age "reel" */ /* qu'avait le fichier au debut de ce processus. */ /* La solution, et donc de remplacer le '$FIN' */ /* par la generation d'un fichier '$Y' dans lequel */ /* on testera "manuellement" chacun des fichiers */ /* de '$xs' (et sans jamais faire de '$TOUCH'). */ /* */ /* */ /* Author of '$xcg/fichier_etat$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19990712154622). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_MINI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define COMPATIBILITE_20200327 \ FAUX \ /* Afin de permettre de faire l'edition du mode des fichiers dans le format anterieur au */ \ /* 20200327110036... */ #define LE_FICHIER_EST_COMPRESSE \ FAUX \ /* Le fichier est-il compresse par {$bCOMPRES,$bUNCOMPRES} ('VRAI') auquel cas son nom */ \ /* est a completer par '$pCOM' ou pas ('FAUX') ? Ceci a ete introduit le 20040115101933. */ #define EDITER_LES_MESSAGES_D_ERREUR \ EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ /* Indicateur a utiliser pour editer les messages d'erreur des fichiers. */ #define EDITER_LES_MESSAGES_D_EN_TETE \ VRAI #define EDITER_LE_NOM_DU_FICHIER \ FAUX \ /* Introduit le 20030908093709. */ #define INDIQUER_QUE_LE_FICHIER_ETAIT_COMPRESSE \ FAUX \ /* Introduit le 20040115122553. */ #define TOUT_EDITER \ FAUX \ /* Permet d'editer tout ce qui est possible (introduit le 20040119090653). */ #define EDITER_LE_NUMERO_D_INODE_DU_FICHIER \ FAUX #define EDITER_LE_MODE_DU_FICHIER \ FAUX #define EDITER_LE_MODE_DU_FICHIER_EN_DECIMAL \ VRAI #define EDITER_LE_MODE_DU_FICHIER_EN_HEXA_DECIMAL \ VRAI #define EDITER_L_IDENTIFICATEUR_D_UTILISATEUR_DU_FICHIER \ FAUX #define EDITER_L_IDENTIFICATEUR_DU_GROUPE_DU_FICHIER \ FAUX #define EDITER_LA_LONGUEUR_DU_FICHIER \ FAUX #define EDITER_LA_LONGUEUR_DU_NOM_DU_FICHIER \ FAUX #define EDITER_LA_DATE_DU_DERNIER_ACCES \ FAUX #define EDITER_LA_DATE_DE_LA_DERNIERE_MODIFICATION \ FAUX #define EDITER_LA_DATE_DU_DERNIER_CHANGEMENT_D_ETAT \ FAUX #define TESTER_LA_NON_NEGATIVITE_DE_L_AGE \ VRAI #define EDITER_L_AGE \ VRAI #define EDITER_L_AGE_EN_JOURS \ FAUX /* Indicateurs de controle des diverses editions, les donnees temporelles etant en secondes. */ #define MARGE_DE_SECURITE_POUR_L_AGE_EN_JOURS \ ZERO \ /* Constante a ajouter a l'age en jours d'un fichier afin de constituer une marge de */ \ /* securite ('v $Falias_Majdep marge='). Ceci a ete introduit le 20011031160846. */ #define EDITER_LE_PSEUDO_AGE_EN_JOURS \ FAUX #define DIVISEUR_DE_LA_LONGUEUR_DU_FICHIER_POUR_LE_CALCUL_DU_PSEUDO_AGE \ GRO5(GRO10(FLOT(MILLIARD))) /* Doit-on editer de plus un "pseudo-age" obtenu par vieillisement de l'age reel par une */ /* fonction de la taille du fichier (plus le fichier est gros, plus il vieillit vite...). */ #define SEUIL_DE_L_AGE_EN_JOURS \ INFINI #define SEUIL_DU_PSEUDO_AGE_EN_JOURS \ INFINI /* Afin d'editer un message si le fichier est trop vieux (respectivement "pseudo-vieux"). */ #define MODIFIER_LA_DATE_DU_DERNIER_ACCES_ET_LA_DATE_DE_DERNIERE_MODIFICATION \ FAUX \ /* Doit-on modifier les dates de dernier acces et de derniere modification ('VRAI') ou pas */ \ /* ('FAUX') ? Cela a ete introduit le 19991104095138. */ #define ANNEE_ARBITRAIRE \ LE_01_01_1970_A_00_00_00_ANNEE #define MOIS_ARBITRAIRE \ LE_01_01_1970_A_00_00_00_MOIS #define JOUR_ARBITRAIRE \ LE_01_01_1970_A_00_00_00_JOUR #define HEURES_ARBITRAIRES \ LE_01_01_1970_A_00_00_00_HEURES #define MINUTES_ARBITRAIRES \ LE_01_01_1970_A_00_00_00_MINUTES #define SECONDES_ARBITRAIRES \ LE_01_01_1970_A_00_00_00_SECONDES /* Date arbitraire a utiliser a la place de la date courante. */ #define MODIFIER_LE_MODE \ FAUX \ /* Doit-on modifier le mode ('VRAI') ou pas ('FAUX') ? Cela a ete introduit le */ \ /* 19991104095138. */ #define MODE_ARBITRAIRE \ ZERO \ /* Mode arbitraire a utiliser (ce mode donne un fichier "invisible"...). */ #define GENERER_LA_CLEF \ FAUX \ /* Doit-on generer la clef du fichier ('VRAI') ou pas ('FAUX') ? Cela a ete introduit le */ \ /* 20030805112607. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE \ IFET(EST_VRAI(le_fichier_est_compresse),EST_VRAI(le_fichier_a_bien_ete_decompresse)) \ /* Introduit le 20070907182407 pour ameliorer la lisibilite... */ #define EDITER_UNE_VALEUR(valeur,editer,format,message_d_en_tete) \ Bblock \ Test(IFOU(IL_FAUT(editer),IL_FAUT(tout_editer))) \ /* L'indicateur global 'tout_editer' fut introduit le 20040119090653... */ \ Bblock \ Test(IL_FAUT(editer_les_messages_d_en_tete)) \ Bblock \ CAL2(Prin1("%s=",message_d_en_tete)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL2(Prin1(Cara(chain_Aconcaten2(format,"\n")),valeur)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure d'edition conditionnelle. On notera que dans le cas de valeurs de type "date", */ \ /* ces valeurs sont des durees depuis le 19700101000000 (notees ci-apres "DUREE") et */ \ /* qu'elles peuvent etre converties en de "vraies" dates (au format de la commande 'date') */ \ /* grace a la commande : */ \ /* */ \ /* $xcg/dure01011970$X inverser=VRAI duree=DUREE */ \ /* */ \ /* ou 'DUREE' represente la date renvoyee par '$xcg/fichier_etat$X' (avec, par exemple */ \ /* l'argument "modification=VRAI" pour avoir la date de derniere modification). Enfin, */ \ /* */ \ /* $xcg/dure01011970$X inverser=VRAI duree=DUREE | \ */ \ /* $SE -f $xcg/dure01011970$vv$sed */ \ /* */ \ /* permet de mettre cette 'DUREE' au format 'GDateC'. On notera que ceci peut etre realise */ \ /* globalement et simplement a l'aide de l'alias 'DATEM'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T D E L ' E T A T D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(compatibilite_20200327,COMPATIBILITE_20200327)); /* Afin de permettre de faire l'edition du mode des fichiers dans le format anterieur au */ /* 20200327110036... */ DEFV(CHAR,INIC(POINTERc(nom_fichier),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_fichier_compresse),NOM_UNDEF)); DEFV(Logical,INIT(le_fichier_est_compresse,LE_FICHIER_EST_COMPRESSE)); /* Le fichier est-il compresse par {$bCOMPRES,$bUNCOMPRES} ('VRAI') auquel cas son nom */ /* est a completer par '$pCOM' ou pas ('FAUX') ? Ceci a ete introduit le 20040115101933. */ DEFV(Logical,INIT(le_fichier_a_bien_ete_decompresse,LUNDEF)); /* Au cas ou 'EST_VRAI(le_fichier_est_compresse)', afin de savoir si la decompression */ /* s'est bien passee... */ DEFV(Logical,INIT(editer_les_messages_d_erreur,EDITER_LES_MESSAGES_D_ERREUR)); /* Indicateur a utiliser pour editer les messages d'erreur des fichiers. */ DEFV(Logical,INIT(editer_les_messages_d_en_tete,EDITER_LES_MESSAGES_D_EN_TETE)); DEFV(Logical,INIT(editer_le_nom_du_fichier,EDITER_LE_NOM_DU_FICHIER)); /* Introduit le 20030908093709. */ DEFV(Logical,INIT(indiquer_que_le_fichier_etait_compresse,INDIQUER_QUE_LE_FICHIER_ETAIT_COMPRESSE)); /* Introduit le 20040115122553. */ DEFV(Logical,INIT(tout_editer,TOUT_EDITER)); /* Permet d'editer tout ce qui est possible (introduit le 20040119090653). */ DEFV(Logical,INIT(editer_le_numero_d_Inode_du_fichier,EDITER_LE_NUMERO_D_INODE_DU_FICHIER)); DEFV(Logical,INIT(editer_le_mode_du_fichier,EDITER_LE_MODE_DU_FICHIER)); DEFV(Logical,INIT(editer_le_mode_du_fichier_en_decimal,EDITER_LE_MODE_DU_FICHIER_EN_DECIMAL)); DEFV(Logical,INIT(editer_le_mode_du_fichier_en_hexa_decimal,EDITER_LE_MODE_DU_FICHIER_EN_HEXA_DECIMAL)); DEFV(Logical,INIT(editer_l_identificateur_d_utilisateur_du_fichier,EDITER_L_IDENTIFICATEUR_D_UTILISATEUR_DU_FICHIER)); DEFV(Logical,INIT(editer_l_identificateur_du_groupe_du_fichier,EDITER_L_IDENTIFICATEUR_DU_GROUPE_DU_FICHIER)); DEFV(Logical,INIT(editer_la_longueur_du_fichier,EDITER_LA_LONGUEUR_DU_FICHIER)); DEFV(Logical,INIT(editer_la_longueur_du_nom_du_fichier,EDITER_LA_LONGUEUR_DU_NOM_DU_FICHIER)); DEFV(Logical,INIT(editer_la_date_du_dernier_acces,EDITER_LA_DATE_DU_DERNIER_ACCES)); DEFV(Logical,INIT(editer_la_date_de_la_derniere_modification,EDITER_LA_DATE_DE_LA_DERNIERE_MODIFICATION)); DEFV(Logical,INIT(editer_la_date_du_dernier_changement_d_etat,EDITER_LA_DATE_DU_DERNIER_CHANGEMENT_D_ETAT)); DEFV(Logical,INIT(tester_la_non_negativite_de_l_age,TESTER_LA_NON_NEGATIVITE_DE_L_AGE)); DEFV(Logical,INIT(editer_l_age,EDITER_L_AGE)); DEFV(Logical,INIT(editer_l_age_en_jours,EDITER_L_AGE_EN_JOURS)); /* Indicateurs de controle des diverses editions, les donnees temporelles etant en secondes. */ /* On notera que "age" signifie en fait "duree ecoulee depuis la derniere modification"... */ /* */ /* L'introduction de l'edition delective du "mode" suivant la base a ete introduite le */ /* 20030625091418. */ DEFV(Int,INIT(marge_de_securite_pour_l_age_en_jours,MARGE_DE_SECURITE_POUR_L_AGE_EN_JOURS)); /* Constante a ajouter a l'age en jours d'un fichier afin de constituer une marge de */ /* securite ('v $Falias_Majdep marge='). Ceci a ete introduit le 20011031160846. */ DEFV(Logical,INIT(editer_le_pseudo_age_en_jours,EDITER_LE_PSEUDO_AGE_EN_JOURS)); DEFV(Float,INIT(diviseur_de_la_longueur_du_fichier_pour_le_calcul_du_pseudo_age ,DIVISEUR_DE_LA_LONGUEUR_DU_FICHIER_POUR_LE_CALCUL_DU_PSEUDO_AGE ) ); /* Doit-on editer de plus un "pseudo-age" obtenu par vieillisement de l'age reel par une */ /* fonction de la taille du fichier (plus le fichier est gros, plus il vieillit vite...). */ /* Ceci peut etre etudie grace au programme 'v $xtc/pseudo_ag.01$c'. */ DEFV(Int,INIT(seuil_de_l_age_en_jours,SEUIL_DE_L_AGE_EN_JOURS)); DEFV(Int,INIT(seuil_du_pseudo_age_en_jours,SEUIL_DU_PSEUDO_AGE_EN_JOURS)); /* Afin d'editer un message si le fichier est trop vieux (respectivement "pseudo-vieux"). */ DEFV(Logical,INIT(modifier_la_date_du_dernier_acces_et_date_de_la_derniere_modification ,MODIFIER_LA_DATE_DU_DERNIER_ACCES_ET_LA_DATE_DE_DERNIERE_MODIFICATION ) ); /* Doit-on modifier les dates de dernier acces et de derniere modification ('VRAI') ou pas */ /* ('FAUX'). Cela a ete introduit le 19991104095138. */ DEFV(Int,INIT(annee_arbitraire,ANNEE_ARBITRAIRE)); DEFV(Int,INIT(mois_arbitraire,MOIS_ARBITRAIRE)); DEFV(Int,INIT(jour_arbitraire,JOUR_ARBITRAIRE)); DEFV(Int,INIT(heures_arbitraires,HEURES_ARBITRAIRES)); DEFV(Int,INIT(minutes_arbitraires,MINUTES_ARBITRAIRES)); DEFV(Int,INIT(secondes_arbitraires,SECONDES_ARBITRAIRES)); /* Date arbitraire a utiliser a la place de la date courante. */ DEFV(Logical,INIT(modifier_le_mode,MODIFIER_LE_MODE)); /* Doit-on modifier le mode ('VRAI') ou pas ('FAUX') ? Cela a ete introduit le */ /* 19991104095138. */ DEFV(Positive,INIT(mode_arbitraire,MODE_ARBITRAIRE)); /* Mode arbitraire a utiliser (ce mode donne un fichier "invisible"...). */ DEFV(Logical,INIT(generer_la_clef,GENERER_LA_CLEF)); /* Doit-on generer la clef du fichier ('VRAI') ou pas ('FAUX') ? Cela a ete introduit le */ /* 20030805112607. */ DEFV(Positive,INIT(numero_d_Inode____________________de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(mode______________________________de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(identificateur_d_utilisateur______de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(identificateur_de_groupe__________de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(date_du_dernier_acces_____________de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(date_de_la_derniere_modification__de_l_eventuel_fichier_compresse_decompresse,UNDEF)); DEFV(Positive,INIT(date_du_dernier_changement_d_etat_de_l_eventuel_fichier_compresse_decompresse,UNDEF)); /* Introduit le 20041007093320, ces informations concernent l'eventuel fichier compresse */ /* que l'on decompresse ; ce sont evidemment ces informations qu'il faut editer et non pas */ /* celles du fichier decompresse (on trouverait alors evidemment la date courante...). */ /* */ /* La sauvegarde du mode a ete introduite le 20070907164635 car elle manquait gravement */ /* ('v $Falias_catalf 20070307134958'), ainsi que le numero d'I-node... */ /* */ /* La sauvegarde des identificateurs d'utilisateur et de groupe ont ete introduites */ /* le 20070907183135... */ /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("compatibilite_20200327=",compatibilite_20200327); GET_ARGUMENT_C("fichier=""f=""F=",nom_fichier); GET_ARGUMENT_L("fichier_inexistant=""inexistant=""finex=",Ftest_fichier_____accepter_un_fichier_inexistant); GET_ARGUMENT_N("fichier_existant=""existant=""fex=",Ftest_fichier_____accepter_un_fichier_inexistant); /* Parametre introduit le 20250102084227... */ GET_ARGUMENT_L("ouvrir=""open=",Ftest_fichier_____ouvrir_le_fichier); /* Le parametre 'Ftest_fichier_____ouvrir_le_fichier' fut introduit le 20060520094158... */ GET_ARGUMENT_L("decompresser_compresser=""compresser=""compresse=""COMPRES=",le_fichier_est_compresse); GET_ARGUMENT_N("decompresse=",le_fichier_est_compresse); GET_ARGUMENT_L("erreurs=",editer_les_messages_d_erreur); GET_ARGUMENT_L("messages=""message=""en_tete=",editer_les_messages_d_en_tete); GET_ARGUMENT_L("nom=",editer_le_nom_du_fichier); GET_ARGUMENT_L("nom_compresse=""nc=",indiquer_que_le_fichier_etait_compresse); GET_ARGUMENT_L("tout=""all=",tout_editer); GET_ARGUMENT_L("numero_d_Inode=""Inode=",editer_le_numero_d_Inode_du_fichier); GET_ARGUMENT_L("mode=",editer_le_mode_du_fichier); GET_ARGUMENT_L("mode10=""m10=",editer_le_mode_du_fichier_en_decimal); GET_ARGUMENT_L("mode16=""m16=",editer_le_mode_du_fichier_en_hexa_decimal); GET_ARGUMENT_L("utilisateur=""UID=",editer_l_identificateur_d_utilisateur_du_fichier); GET_ARGUMENT_L("groupe=""GID=",editer_l_identificateur_du_groupe_du_fichier); GET_ARGUMENT_L("taille=""longueur_du_fichier=""longueur=""lf=",editer_la_longueur_du_fichier); GET_ARGUMENT_L("longueur_du_nom=""ln=",editer_la_longueur_du_nom_du_fichier); GET_ARGUMENT_L("date_du_dernier_acces=""acces=",editer_la_date_du_dernier_acces); GET_ARGUMENT_L("modification=""modif=""date_de_la_derniere_modification=" ,editer_la_date_de_la_derniere_modification ); GET_ARGUMENT_L("date_du_dernier_changement_d_etat=""changement=""change=" ,editer_la_date_du_dernier_changement_d_etat ); GET_ARGUMENT_L("tester_age=""tester=",tester_la_non_negativite_de_l_age); GET_ARGUMENT_L("duree_derniere_modification=""age=",editer_l_age); GET_ARGUMENT_L("jours=""duree_derniere_modification_en_jours=""age_en_jours=",editer_l_age_en_jours); GET_ARGUMENT_I("marge=",marge_de_securite_pour_l_age_en_jours); GET_ARGUMENT_L("pseudo_age=",editer_le_pseudo_age_en_jours); GET_ARGUMENT_F("diviseur=",diviseur_de_la_longueur_du_fichier_pour_le_calcul_du_pseudo_age); GET_ARGUMENT_I("seuil_age=",seuil_de_l_age_en_jours); GET_ARGUMENT_I("seuil_pseudo_age=",seuil_du_pseudo_age_en_jours); GET_ARGUMENT_L("modifier_date=""Dmodifier=" ,modifier_la_date_du_dernier_acces_et_date_de_la_derniere_modification ); GET_ARGUMENT_I("annee=""Annee=""A=",annee_arbitraire); GET_ARGUMENT_I("mois=""Mois=""M=",mois_arbitraire); GET_ARGUMENT_I("jour=""Jour=""J=",jour_arbitraire); GET_ARGUMENT_I("heures=""Heures=""H=",heures_arbitraires); GET_ARGUMENT_I("minutes=""m=""Minutes=",minutes_arbitraires); GET_ARGUMENT_I("Secondes=""S=",secondes_arbitraires); GET_ARGUMENT_L("modifier_mode=""Mmodifier=",modifier_le_mode); GET_ARGUMENT_I("nouveau_mode=",mode_arbitraire); GET_ARGUMENT_L("generer_clef=""clef=",generer_la_clef); GET_ARGUMENT_I("seuil_clef=" ,Ftest_fichier_____longueur_maximale_du_fichier_pour_generer_une_clef_du_fichier ); ) ); Test(EST_VRAI(le_fichier_est_compresse)) Bblock EGAL(nom_fichier_compresse,chain_Aconcaten2(nom_fichier,Gvar("pCOM"))); /* Introduit le 20040901133953... */ EGAL(le_fichier_a_bien_ete_decompresse,FAUX); /* A priori, afin de ne pas faire le '$bCOMPRES' a la fin... */ Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier_compresse ,editer_les_messages_d_erreur ) ) ) ) Bblock EGAL(numero_d_Inode____________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____numero_d_Inode ); EGAL(mode______________________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____mode ); EGAL(identificateur_d_utilisateur______de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____identificateur_d_utilisateur ); EGAL(identificateur_de_groupe__________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____identificateur_de_groupe ); EGAL(date_du_dernier_acces_____________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_du_dernier_acces ); EGAL(date_de_la_derniere_modification__de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_de_la_derniere_modification ); EGAL(date_du_dernier_changement_d_etat_de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_du_dernier_changement_d_etat ); /* Introduit le 20041007093320, ces informations concernent l'eventuel fichier compresse */ /* que l'on decompresse ; ce sont evidemment ces informations qu'il faut editer et non pas */ /* celles du fichier decompresse (on trouverait alors evidemment la date courante...). */ /* */ /* La sauvegarde du mode a ete introduite le 20070907164635 car elle manquait gravement */ /* ('v $Falias_catalf 20070307134958'). */ Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier ,editer_les_messages_d_erreur ) ) ) ) Bblock PRINT_ERREUR("le fichier decompresse existe deja"); CAL1(Prer1("il s'agit du fichier decompresse de nom '%s'.\n",nom_fichier)); Eblock ATes Bblock EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten5(Gvar("bUNCOMPRES") ," --stdout " ,nom_fichier_compresse ," > " ,nom_fichier ) ); /* Decompression du fichier de nom '$nom_fichier$pCOM' (introduit le 20040115101933). On */ /* notera que cette operation conserve tous les attributs (mode, date,...) du fichier... */ /* */ /* ATTENTION : la date du fichier reste donc inchangee. Malheureusement, il n'en est pas */ /* de meme avec la date du directory contenant ce fichier qui, elle, est mise a jour avec */ /* la date courante ; cela a donc des consequences sur le comportement de 'v $Fgenere MKDIR' */ /* qui risque de generer donc des '$MKDIR' qui a priori n'ont pas de raison d'etre. Cela a */ /* ete observe aux environs du 20040119132529 lors d'un 'trouvgu' destine a '$CMAP28'... */ /* */ /* Le 20040903101804 a ete introduit l'option "--stdout" qui permet de preserver le fichier */ /* compresse et ainsi d'eviter des pertes d'informations lors de la suite d'operations */ /* {$bUNCOMPRES,$bCOMPRES}, en particulier au cas ou l'espace disque serait "tangent"... */ Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier ,editer_les_messages_d_erreur ) ) ) ) /* Ce test a ete ajoute le 20040901124505 afin de prendre en compte le cas ou le */ /* '$bUNCOMPRES' s'est mal passe (manque d'espace disque par exemple, comme cela s'est */ /* quelques temps avant sur '$LACT12'). Dans ce cas, le fichier '$pCOM' n'est pas detruit... */ Bblock EGAL(le_fichier_a_bien_ete_decompresse,VRAI); /* Afin de faire le '$bCOMPRES' a la fin... */ Eblock ATes Bblock PRINT_ERREUR("le fichier compresse n'a pu etre decompresse (manque d'espace disque,...)"); CAL1(Prer1("il s'agit du fichier compresse de nom '%s'.\n",nom_fichier_compresse)); Eblock ETes Eblock ETes Eblock ATes Bblock PRINT_ERREUR("le fichier compresse (a decompresser) n'existe pas"); CAL1(Prer1("il s'agit du fichier compresse de nom '%s'.\n",nom_fichier_compresse)); Eblock ETes Eblock ATes Bblock Eblock ETes Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier ,editer_les_messages_d_erreur ) ) ) ) /* Ce test a ete ajoute le 20000113091549 afin d'eviter que des messages de validation par */ /* 'CONVERSION_D_UNE_DATE_EN_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(...)' ne */ /* soient emis ci-apres. La non existence du fichier n'est pas signalee ici car, en effet, */ /* un test similaire sera fait de nouveau un peu plus loin... */ Bblock Test(EST_VALIDE(Ftest_fichier_____informations_utiles)) /* Ce test a ete ajoute le 20000113091549 afin d'eviter que des messages de validation par */ /* 'CONVERSION_D_UNE_DATE_EN_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(...)' ne */ /* soient emis ci-apres. La non existence du fichier n'est pas signalee ici car, en effet, */ /* un test similaire sera fait de nouveau un peu plus loin... */ Bblock Test(IL_FAUT(modifier_la_date_du_dernier_acces_et_date_de_la_derniere_modification)) Bblock DEFV(Positive,INIT(Secondes,UNDEF)); /* Duree en secondes ecoulee depuis le 19700101000000 jusqu'a la date arbitraire. */ CONVERSION_D_UNE_DATE_EN_UNE_DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes ,annee_arbitraire ,mois_arbitraire ,jour_arbitraire ,heures_arbitraires ,minutes_arbitraires ,secondes_arbitraires ); /* Calcul de la duree en {secondes} ecoulee entre le 19700101000000 et la date arbitraire. */ EGAL(Ftest_fichier_____modifier_date_du_dernier_acces_et_date_de_la_derniere_modification,VRAI); EGAL(Ftest_fichier_____nouvelle_date_du_dernier_acces,Secondes); EGAL(Ftest_fichier_____nouvelle_date_de_la_derniere_modification,Secondes); /* Ainsi, lors de l'appel suivant a 'Ftest_fichier(...)' les dates de dernier acces et de */ /* derniere modification seront mises a jour avec la date arbitraire... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(modifier_le_mode)) Bblock EGAL(Ftest_fichier_____modifier_mode,VRAI); EGAL(Ftest_fichier_____nouveau_mode,mode_arbitraire); /* Ainsi, lors de l'appel suivant a 'Ftest_fichier(...)' le mode sera mis a jour... */ Eblock ATes Bblock EGAL(Ftest_fichier_____modifier_mode,FAUX); /* Ajoute le 20030805120013, on n'est jamais assez prudent... */ Eblock ETes Test(IFOU(IL_FAUT(generer_la_clef),IL_FAUT(tout_editer))) /* L'indicateur global 'tout_editer' fut introduit le 20040119090653... */ Bblock EGAL(Ftest_fichier_____generer_une_clef_du_fichier,VRAI); /* Ainsi, lors de l'appel suivant a 'Ftest_fichier(...)' la clef sera generee... */ Eblock ATes Bblock EGAL(Ftest_fichier_____generer_une_clef_du_fichier,FAUX); /* Ajoute le 20030805120013, on n'est jamais assez prudent... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier ,editer_les_messages_d_erreur ) ) ) ) Bblock Test(EST_VALIDE(Ftest_fichier_____informations_utiles)) Bblock Test(IFET(IL_NE_FAUT_PAS(modifier_la_date_du_dernier_acces_et_date_de_la_derniere_modification) ,IL_NE_FAUT_PAS(modifier_le_mode) ) ) Bblock DEFV(Int,INIT(age_du_fichier_en_secondes,UNDEF)); /* Le 20030628192211, la variable 'age_du_fichier_en_secondes' est passee de 'Positive' */ /* a 'Int' pour permettre le test 'IZLT(...)' qui va suivre... */ DEFV(Positive,INIT(age_du_fichier_en_jours,UNDEF)); DEFV(Positive,INIT(pseudo_age_du_fichier_en_jours,UNDEF)); DEFV(Positive,INIT(Secondes,UNDEF)); DEFV(Positive,INIT(MicroSecondes,UNDEF)); DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes); /* Calcul de la duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000. */ EGAL(age_du_fichier_en_secondes ,SOUS(Secondes ,COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,date_de_la_derniere_modification__de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_de_la_derniere_modification ) ) ); Test(IL_FAUT(tester_la_non_negativite_de_l_age)) Bblock Test(IZLT(age_du_fichier_en_secondes)) /* Ce test a ete introduit le 20030628192211 apres avoir rencontre un probleme lors d'un */ /* 'majdep' de '$LACT14' vers '$LACT15', '$LACT14' etant en retard de plusieurs minutes */ /* par rapport a '$LACT15' (le fichier 'majdep' s'est alors retrouve vide...). */ Bblock PRINT_ERREUR("l'age en secondes du fichier est negatif, il est donc ne dans le futur de cette MACHINE"); PRINT_ERREUR("il y a peut-etre un probleme de synchronisation des horloges quelque part"); CAL1(Prer1("il s'agit du fichier de nom '%s'.\n",nom_fichier)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes EGAL(age_du_fichier_en_jours ,DIVI(age_du_fichier_en_secondes,MUL3(HEURES_PAR_JOUR,MINUTES_PAR_HEURE,SECONDES_PAR_MINUTE)) ); /* Age du fichier en secondes, puis en jours... */ EGAL(pseudo_age_du_fichier_en_jours ,INTE(MUL2(AXPB(DIVI(NEUT(Ftest_fichier_____longueur_du_fichier) ,diviseur_de_la_longueur_du_fichier_pour_le_calcul_du_pseudo_age ) ,EXP2(FLOT(age_du_fichier_en_jours)) ,FU ) ,FLOT(age_du_fichier_en_jours) ) ) ); /* "Pseudo-age" du fichier, c'est-a-dire age augmente en fonction de l'age reel et de la */ /* taille : un gros fichier age parait encore plus age... */ /* */ /* Le 20060520122341, passage de 'FLOT(...)' a 'NEUT(...)' a cause du probleme */ /* 'v $xcg/fichier_etat$K 20060519191756'... */ EDITER_UNE_VALEUR(chain_Aconcaten2(nom_fichier ,COND(IFET(EST_VRAI(le_fichier_est_compresse) ,IL_FAUT(indiquer_que_le_fichier_etait_compresse) ) ,chain_Aconcaten3("(",Gvar("pCOM"),")") ,ccCHAR(C_VIDE) ) ) ,editer_le_nom_du_fichier ,"%s" ,"nom" ); /* Le postfixe '$pCOM' a ete introduit le 20040115120327... */ EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,numero_d_Inode____________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____numero_d_Inode ) ,editer_le_numero_d_Inode_du_fichier ,"%d" ,"Inode" ); Test(IL_FAUT(compatibilite_20200327)) Bblock EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,mode______________________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____mode ) ,IFET(IL_FAUT(editer_le_mode_du_fichier),IL_FAUT(editer_le_mode_du_fichier_en_decimal)) ,"%d" ,"mode(base10)" ); EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,mode______________________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____mode ) ,IFET(IL_FAUT(editer_le_mode_du_fichier),IL_FAUT(editer_le_mode_du_fichier_en_hexa_decimal)) ,"0x%08x" ,"mode(base16)" ); Eblock ATes Bblock EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,mode______________________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____mode ) ,IFET(IL_FAUT(editer_le_mode_du_fichier),IL_FAUT(editer_le_mode_du_fichier_en_decimal)) ,"%d" ,"ModeBase10" ); EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,mode______________________________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____mode ) ,IFET(IL_FAUT(editer_le_mode_du_fichier),IL_FAUT(editer_le_mode_du_fichier_en_hexa_decimal)) ,"0x%08x" ,"ModeBase16" ); Eblock ETes /* ATTENTION, la signification des differents bits est dans 'v /usr/include/sys/stat.h MODE' */ /* et qu'en ce qui concerne le mode, au sens 'chmod', les valeurs donnees dans ce fichier */ /* sont on octal et non en hexa-decimal. Ainsi, par exemple, un fichier en mode 'ro/EXEC' */ /* (ce qui donne par 'll' le mode '-r-x------'), donnera ici la valeur '0x8140', ce qui */ /* correspond aux bits : */ /* */ /* S_IFREG 0x8000 */ /* S_IREAD 00400 */ /* S_IEXEC 00100 */ /* */ /* surprenant... */ /* */ /* Le 19991104095138, j'ai mis en place l'edition du mode en base 10 et en base 16 afin */ /* de simplifier l'utilisation de 'IL_FAUT(modifier_le_mode)'. L'edition de "0x" devant */ /* la valeur hexa-decimale est compatible avec le traitement qui est fait dans le fichier */ /* 'v $xig/fonct$vv$FON SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE'. */ /* */ /* Le 20030625091418, j'ai introduit le choix entre les bases 10 et 16... */ /* */ /* Le 20030908100606, j'ai supprime les espaces dans "mode (base 10)" et "mode (base 16)" */ /* afin de faciliter des traitements automatises (l'espace etant alors un limiteur...). */ /* */ /* Le 20200327110036, "mode(base10)" et ""mode(base16)" ont vu disparaitre les deux */ /* parentheses afin d'eviter le message : */ /* */ /* set: Variable name must begin with a letter. */ /* */ /* lors de la definition de '$ReFeReNcE' dans l'alias 'v $Fmachines alias.....reference', */ /* suite a l'introduction de 'v $Falias_Prefer EtAt_DiStAnT_FoRcE'... */ EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,identificateur_d_utilisateur______de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____identificateur_d_utilisateur ) ,editer_l_identificateur_d_utilisateur_du_fichier ,"%d" ,"UID" ); EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,identificateur_de_groupe__________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____identificateur_de_groupe ) ,editer_l_identificateur_du_groupe_du_fichier ,"%d" ,"GID" ); EDITER_UNE_VALEUR(Ftest_fichier_____longueur_du_fichier ,editer_la_longueur_du_fichier ,"%.0f" ,"longueur" ); /* Le 20060520122341, passage de "%d" a "%.0f" a cause du probleme */ /* 'v $xcg/fichier_etat$K 20060519191756'... */ EDITER_UNE_VALEUR(chain_Xtaille(nom_fichier) ,editer_la_longueur_du_nom_du_fichier ,"%d" ,"longueur_nom" ); /* ATTENTION : jusqu'au 20040115120327, il y avait ici "nom" par erreur... */ EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,date_du_dernier_acces_____________de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_du_dernier_acces ) ,editer_la_date_du_dernier_acces ,"%d" ,"acces" ); EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,date_de_la_derniere_modification__de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_de_la_derniere_modification ) ,editer_la_date_de_la_derniere_modification ,"%d" ,"modification" ); EDITER_UNE_VALEUR(COND(LE_FICHIER_ETAIT_COMPRESSE_ET_A_ETE_DECOMPRESSE ,date_du_dernier_changement_d_etat_de_l_eventuel_fichier_compresse_decompresse ,Ftest_fichier_____date_du_dernier_changement_d_etat ) ,editer_la_date_du_dernier_changement_d_etat ,"%d" ,"changement" ); EDITER_UNE_VALEUR(COND(IL_FAUT(editer_l_age_en_jours) ,ADD2(age_du_fichier_en_jours,marge_de_securite_pour_l_age_en_jours) ,age_du_fichier_en_secondes ) ,editer_l_age ,"%d" ,"age" ); EDITER_UNE_VALEUR(pseudo_age_du_fichier_en_jours ,editer_le_pseudo_age_en_jours ,"%d" ,"pseudo_age" ); Test(IFGE(age_du_fichier_en_jours,seuil_de_l_age_en_jours)) Bblock CAL3(Prme3("Le fichier '%s' est trop vieux (%d>=%d)\n" ,nom_fichier ,age_du_fichier_en_jours ,seuil_de_l_age_en_jours ) ); /* Le 20040402130709 le 'Prin3(...)' a ete remplace par un 'Prer3(...)' plus coherent et */ /* par un 'Prme3(...)' encore plus logique le 20040402140845... */ Eblock ATes Bblock Eblock ETes Test(IFGE(pseudo_age_du_fichier_en_jours,seuil_du_pseudo_age_en_jours)) Bblock CAL3(Prme3("Le fichier '%s' est trop pseudo-vieux (%d>=%d)\n" ,nom_fichier ,pseudo_age_du_fichier_en_jours ,seuil_du_pseudo_age_en_jours ) ); /* Le 20040402130709 le 'Prin3(...)' a ete remplace par un 'Prer3(...)' plus coherent et */ /* par un 'Prme3(...)' encore plus logique le 20040402140845... */ Eblock ATes Bblock Eblock ETes EDITER_UNE_VALEUR(Ftest_fichier_____clef_du_fichier ,generer_la_clef ,"%u" ,"clef" ); /* La clef a ete introduite le 20030805112607... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ERREUR("les informations du fichier recupere sont invalides"); Eblock ETes Eblock ATes Bblock gTest__CODE_ERREUR__ERREUR07(BLOC(Bblock PRINT_ATTENTION("la fin de flot a ete rencontree"); Eblock ) ,BLOC(Bblock PRINT_ERREUR("le fichier demande est inaccessible"); CAL1(Prer1("il s'agit du fichier de nom '%s'.\n\n",nom_fichier)); CAL1(Prer0("Les raisons possibles sont :\n\n")); CAL1(Prer0("1-Il n'existe pas.\n")); CAL1(Prer0("2-Son acces est interdit (voir ses droits et son proprietaire).\n")); Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier)) Bblock CAL1(Prer0("3-Il est trop volumineux.\n\n")); Eblock ATes Bblock Eblock ETes /* Le "\n" en queue de message a ete introduit le 20030827141902 afin d'ameliorer la */ /* lisibilite de '$Z's qui utiliseraient cette commande sur de nombreux fichiers, certains */ /* pouvant ne pas exister... */ /* */ /* Le 20060519191756, a cause du fichier '$Dsauvegardes_LACT15/disque.hda5.20060519104500', */ /* j'ai decouvert qu'un fichier trop gros ne pouvait etre ouvert (sur '$LACT15'...). Cela */ /* a conduit a modification 'v $xig/fonct$vv$FON 20060520092111' et du 20060520094158 ici... */ Eblock ) ); Eblock ETes Test(EST_VRAI(le_fichier_est_compresse)) Bblock Test(EST_VRAI(le_fichier_a_bien_ete_decompresse)) Bblock CALS(Fdelete_fichier(nom_fichier,editer_les_messages_d_erreur)); /* Destruction du fichier decompresse (introduite le 20040903101804), le fichier compresse */ /* lui, etant conserve... */ /* */ /* ATTENTION : la date du fichier reste donc inchangee. Malheureusement, il n'en est pas */ /* de meme avec la date du directory contenant ce fichier qui, elle, est mise a jour avec */ /* la date courante ; cela a donc des consequences sur le comportement de 'v $Fgenere MKDIR' */ /* qui risque de generer donc des '$MKDIR' qui a priori n'ont pas de raison d'etre. Cela a */ Eblock ATes Bblock Eblock ETes Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_fichier_compresse ,editer_les_messages_d_erreur ) ) ) ) Bblock Eblock ATes Bblock PRINT_ERREUR("le fichier compresse n'existe plus (ou n'existait pas avant...)"); CAL1(Prer1("il s'agit du fichier compresse de nom '%s'.\n",nom_fichier_compresse)); Eblock ETes Eblock ATes Bblock Eblock ETes RETU_Commande; Eblock ECommande