/*
Fichier entetemail.c
Auteur Bernard Chardonneau
Logiciel libre, droits d'utilisation précisés en français
dans le fichier : licence-fr.txt
Traductions des droits d'utilisation dans les fichiers :
licence-de.txt , licence-en.txt , licence-es.txt ,
licence-it.txt , licence-nl.txt , licence-pt.txt ,
licence-eo.txt , licence-eo-utf.txt
Droits d'utilisation également sur la page web :
http://libremail.tuxfamily.org/voir.php?page=droits
Ce programme affiche les caractéristique de chaque
fichier mail d'un répertoire.
Par défaut, on analyse les mails du répertoire courant.
On peut aussi indiquer un autre répertoire de recherche.
*/
#define appli // pour la déclaration de variables globales à l'application
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include "messages.h"
#include "buflect.h"
#include "fmail.h"
#include "trtentete.h"
/* prototypes */
void aff_entete (char *nomfic);
/* variable globale au source
(pour éviter un passage de paramètre) */
int optm = 0; // option pour traiter les champs d'entête sur plusieurs lignes
/* programme principal */
int main (int nbarg, char *varg[])
{
DIR *repert;
struct dirent *entree;
// récupération du nom de l'exécutable
memcom (*varg);
// récupération éventuelle de l'option -m
if (--nbarg > 0)
{
// si option -m
if (strcmp (varg [1], "-m") == 0)
{
// la mémoriser
optm = 1;
// et passer au paramètre suivant
varg ++;
nbarg --;
}
}
// récupération éventuelle du nom du répertoire des mails
// ce nom ne doit pas être constitué d'un - suivi d'un seul autre caractère
if (nbarg == 1 && (varg [1][0] != '-' || varg [1][2] != '\0'))
{
// positionnement dans ce répertoire
if (chdir (varg [1]) < 0)
{
// "Répertoire %s inexistant"
aff_err_arg ("REPERT_INEXISTANT", varg [1]);
return (0);
}
// un paramètre restant de moins
nbarg --;
}
// si on a traité tous les paramètres
if (nbarg == 0)
{
// accéder au répertoire
repert = opendir (".");
// lire un nom de fichier
entree = readdir (repert);
// tant qu'il y a des noms de fichier à lire
while (entree)
{
// afficher l'entête du fichier après un controle son nom
if (strlen (entree->d_name) == 8 ||
(strlen (entree->d_name) == 10 && entree->d_name [8] == '.'))
aff_entete (entree->d_name);
// et lire le nom du fichier suivant
entree = readdir (repert);
}
}
else
// "Syntaxe : %s [-m] [répertoire]"
psyntaxe ("SYNT_ENTETEMAIL");
// pour faire plaisir à gcc qui veut une fonction main de type int
return (0);
}
/* lit l'entête d'un message et affiche certaines lignes */
void aff_entete (char *nomfic)
{
int i; // simple compteur
// ouverture du fichier mail
fmail = fopen (nomfic, "r");
// arrêt si erreur imprévue
if (fmail == 0)
{
// "Impossible d'ouvrir le fichier %s"
aff_err_arg ("IMPOS_OUVR_FICH", nomfic);
return;
}
// lire la première ligne de l'entête du message
lire_fmail ();
// lecture et mémorisation des caractéristiques du message
do
{
// affichage de la ligne précédée du nom de fichier
majlignentete ();
printf ("%s:%s", nomfic, buf_lect);
// lire la ligne suivante
lire_fmail ();
// tant que cette ligne est la suite du champ courant
while (*buf_lect == ' ' || *buf_lect == '\t')
{
// si option -m
if (optm)
{
// affichage de la ligne
majlignentete ();
printf ("%s", buf_lect);
}
// lire la ligne suivante
lire_fmail ();
}
// fin d'affichage de la ligne d'entête
putchar ('\n');
}
while (buf_lect [0] != '\0'); // lecture entête terminée si ligne vide
// libérer le fichier mail
fclose (fmail);
}