/*************************************************************************************************************************************/
/* */
/* 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