/* Duplication de 2 disques ou partitions de disques durs
   avec suivi du déroulement de la copie */


#include <stdio.h>

#define szbuf    2048
#define nlecmega  512

main (int narg, char **varg)
{
    char orig [20], dest [20];
    FILE *ficorig, *ficdest;
    long nboct, nbmega;
    unsigned char buffer [szbuf];
    int  retour;

    // Controle du nombre d'arguments
    if (narg == 3)
    {
        // récupération du nom du device source
        if (memcmp (varg [1], "/dev", 4) == 0)
            strcpy (orig, varg [1]);
        else
        {
            strcpy (orig, "/dev/");
            strcat (orig, varg [1]);
        }

        // récupération du nom du device destination
        if (memcmp (varg [2], "/dev", 4) == 0)
            strcpy (dest, varg [2]);
        else
        {
            strcpy (dest, "/dev/");
            strcat (dest, varg [2]);
        }

        // test d'existence des devices source et destination
        testfic (orig);
        testfic (dest);

        // ouverture des fichiers
        ficorig = fopen (orig, "rb");
        ficdest = fopen (dest, "wb");

        if (ficorig != NULL && ficdest != NULL)
        {
            nboct = 0;
            nbmega = 0;

            retour = fread (buffer, szbuf, 1, ficorig);

            while (retour > 0)
            {
                nboct ++;

                if (nboct & nlecmega)
                {
                    nboct = 0;
                    nbmega ++;

                    if (nbmega % 10 == 0)
                    {
                        printf ("\r%5d Mo copiés", nbmega);
                        fflush (stdout);
                    }
                }

                retour = fwrite (buffer, szbuf, 1, ficdest);

                if (retour > 0)
                    retour = fread (buffer, szbuf, 1, ficorig);
                else
                    fprintf (stderr,
    "\rDisque destination %s plus petit que celui d'origine %s\n", dest, orig);
            }

            printf ("\r%5d Mo copiés \n", nbmega);
            fflush (stdout);

            fclose (ficorig);
            fclose (ficdest);
        }
        else
            fprintf (stderr, "Problème d'accès à un fichier\n");
    }
    else
        fprintf (stderr, "Syntaxe : %s source destination\n", varg [0]);
}


testfic (char *fichier)
{
    if (access (fichier, 0) != 0)
    {
        fprintf (stderr, "Fichier %s inexistant\n", fichier);
        exit (1);
    }
}