/*
Fichier listesimexped.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 liste les mails du serveur dont le nom de l'expéditeur
indiqué diffère d'un petit nombre de caractères d'un nom d'expéditeur
figurant dans une liste.
La liste des noms d'expéditeurs à tester est mémorisée dans un
fichier.
Un fichier de configuration est utilisé pour se connecter à la
boite aux lettres.
*/
#define appli // pour la déclaration de variables globales à l'application
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"
#include "testchamp.h"
#include "simexped.h"
#include "szchemin.h"
/* variables globales au source
(pour éviter des tonnes de passages de paramètres) */
char **listexped; // mémorise les noms d'expéditeurs à tester
int sz_listexped; // nombre d'expéditeurs mémorisés dans listexped
/* programme principal */
int main (int nbarg, char *varg[])
{
// fichier contenant la liste des chaines à tester
char fichliste [szchemin + 12];
char *car_fichliste; // pointeur sur un caractère de ce fichier
FILE *fconf; // descripteur du fichier de configuration
int numes, nbmes; // muméro du mail courant et nombre de mails
int nbdiff; // nombre de différences dans le nom d'expéditeur
int nbmaxdiff; // nombre max de différences dans le nom d'expéditeur
char bufFrom [120]; // buffer contenant l'expéditeur du mail
// récupération du nom de l'exécutable
memcom (*varg);
// se positionner sur le premier argument de listesimexped
nbarg --;
varg ++;
// si nombre de différence maximal passé en paramètre
if (nbarg == 2 && atoi (*varg) > 0)
{
// récupérer ce nombre
nbmaxdiff = atoi (*varg);
// sauter l'argument traité
nbarg --;
varg ++;
}
// sinon
else
// une seule différence par défaut
nbmaxdiff = 1;
// contrôle du nombre d'arguments restants
if (nbarg == 1)
{
// ouvrir le fichier de configuration
fconf = ouvre_ficonf (*varg);
if (fconf)
{
// connexion sur le compte mail du serveur pop
if (connect_pop (fconf))
{
// récupérer le nom du répertoire racine de la messagerie
fgets (fichliste, szchemin, fconf);
// fabriquer le chemin d'accès au fichier contenant les
// noms d'expéditeurs à tester : <racine>/simexped
car_fichliste = fichliste + strlen (fichliste);
*(car_fichliste - 1) = '/';
strcpy (car_fichliste, ficdir ("FIC_SIMEXPED"));
// charger en mémoire les noms d'expéditeurs à tester
listexped = charge_valchamp (fichliste, &sz_listexped);
// si la liste n'est pas vide
if (sz_listexped)
{
// récupération du nombre de mails
nbmes = nbmails ();
// vérification des différents mails
for (numes = 1; numes <= nbmes; numes++)
{
// recupérer l'expéditeur du mail
recup_exped (numes, bufFrom);
// compter les différences par rapport
// au nom d'expéditeur le plus proche
nbdiff = simexped (bufFrom, listexped, sz_listexped);
// s'il y a des différences, mais pas trop
if (nbdiff && nbdiff <= nbmaxdiff)
// afficher le nombre de différences et l'expéditeur
printf ("%d %s\n", nbdiff, bufFrom);
}
}
// se déconnecter proprement du serveur pop
deconnect_pop ();
}
// on n'a plus besoin du fichier de configuration
fclose (fconf);
}
}
else
// "Syntaxe : %s [nbmaxdiff] fich_configuration"
psyntaxe ("SYNT_LISTESIMEXP");
return (0);
}