/*
    Fichier detruitmail.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 permet de détruire des mail en attente sur le
    serveur de messagerie.
    Les mails à détruire sont identifiés par leur numéro.

    Un fichier de configuration est utilisé pour se connecter à la
    boite aux lettres et pour fixer le répertoire racine du système
    de messagerie.
*/


#define appli   // pour la déclaration de variables globales à l'application

#include <stdio.h>
#include <string.h>
#include "messages.h"
#include "buflect.h"
#include "ficonf.h"
#include "pop.h"


/* prototype */
void detruitmail (int numes);


/* variable globale au source
   (pour éviter des tonnes de passages de paramètres) */


// chaine de caractères mémorisée pour éviter un appel répétitif à message ()
char mess_detr [50]; // message signalant la destruction d'un mail


/* programme principal */

int main (int nbarg, char *varg[])
{
    FILE *fconf;   // descripteur du fichier de configuration
    int  numes;    // numéro d'un mail
    int  finint;   // dernier numéro d'un intervalle
    int  nbmes;    // nombre de mails sur le serveur
    char *carg1;   // caractère de l'argument 1


    // récupération du nom de l'exécutable
    memcom (*varg);

    // se positionner sur le premier argument de detruitmail
    varg ++;

    // controle du nombre d'arguments et de l'argument 1
    if (--nbarg == 2 && ((strcmp (*varg, "-a") == 0) ||
                         ('1' <= **varg && **varg <= '9')))
    {

        // ouvrir le fichier de configuration
        fconf = ouvre_ficonf (varg [1]);

        if (fconf)
        {
            // connexion sur le compte mail du serveur pop
            if (connect_pop (fconf))
            {
                // récupération du nombre de mails
                nbmes = nbmails ();

                // si des mails peuvent être supprimés
                if (nbmes)
                {
                    // si option -a
                    if (**varg == '-')
                    {
                        // on détruit tous les mails du serveur
                        for (numes = 1; numes <= nbmes; numes++)
                            detruitmail (numes);
                    }
                    // sinon
                    else
                    {
                        // on va analyser l'argument 1 caractère par caractère
                        carg1 = *varg;

                        while (*carg1)
                        {
                            // récupérer un numéro de mail
                            numes = 0;

                            while ('0' <= *carg1 && *carg1 <= '9')
                            {
                                numes = (numes * 10) + (*carg1 & 0x0F);
                                carg1 ++;
                            }

                            // si le séparateur qui suit est un -
                            if (*carg1 == '-')
                            {
                                // se positionner sur le caractère qui suit
                                carg1 ++;

                                // récupérer le numéro du dernier
                                // mail de l'intervalle
                                finint = 0;

                                while ('0' <= *carg1 && *carg1 <= '9')
                                {
                                    finint = (finint * 10) + (*carg1 & 0x0F);
                                    carg1 ++;
                                }

                                // si numéro dernier mail trop grand
                                if (finint > nbmes)
                                {
                                    // signaler l'erreur
                                    // "Numéro de mail trop grand"
                                    affiche_err ("NUMAIL_TROP_GRAND");

                                    // et corriger l'intervalle
                                    finint = nbmes;
                                }

                                // détruire les mails de l'intervalle
                                while (numes <= finint)
                                    detruitmail (numes ++);
                            }
                            // sinon
                            else
                            {
                                // s'il existe un mail avec le numéro récupéré
                                if (0 < numes && numes <= nbmes)
                                    // détruire ce mail
                                    detruitmail (numes);

                                // sinon, afficher un message d'erreur adapté
                                else if (numes > nbmes)
                                {
                                    fprintf (stderr, "%d : ", numes);

                                    // "Numéro de mail trop grand"
                                    affiche_err ("NUMAIL_TROP_GRAND");
                                }
                                else
                                    // "Un numéro de mail ne peut être égal à 0"
                                    affiche_err ("NUMAIL_NUL");
                            }

                            // si on trouve le séparateur ,
                            if (*carg1 == ',')
                                // se positionner sur le numéro de mail suivant
                                carg1++;

                            // sinon si non fin de chaine
                            else if (*carg1)
                            {
                                // message d'erreur
                                fprintf (stderr, message ("ERR_SEP"), *carg1);

                                // on arrête l'analyse de l'argument 1
                                *carg1 = '\0';
                            }
                        }
                    }
                }

                // se déconnecter proprement du serveur pop
                deconnect_pop ();
            }

            // on n'a plus besoin du fichier de configuration
            fclose (fconf);
        }
    }
    else
        // "Syntaxe : %s [-(k|d)] [numéro_mail] fichier_configuration"
        psyntaxe ("SYNT_DETRUITMAIL");

    // pour faire plaisir à gcc qui veut une fonction main de type int
    return (0);
}


/* supprime le mail choisi du serveur de messagerie */

void detruitmail (int numail)
{
    char bufw [120];    // buffer d'envoi d'une requête


    // Destruction du mail numéro
    printf (message ("DESTRUCT_MAIL"), numail);

    // détruire le mail
    sprintf (bufw, "DELE %d", numail);
    env_pop (bufw);
    lire_pop ();
}