#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define ENTREE_STANDARD 0
#define SORTIE_STANDARD 1
#define TAILLE 4096

void transfert(int entree, int sortie)
{
  int nb_lus, nb_ecrits;
  char tampon[TAILLE];

  if (entree == -1) perror("Fichier d'entrée introuvable");
  if (sortie == -1) perror("Ne peut pas ouvrir le fichier de sortie");

  for (;;) {
    nb_lus = read(entree, tampon, TAILLE);
    if (nb_lus <= 0)
      break;
    nb_ecrits = write(sortie, tampon, nb_lus);
    if (nb_ecrits != nb_lus)
      perror("Probleme d'ecriture");
  };
}

int main(int argc, char *argv[])
{
  int entree, sortie;

  switch (argc) {
  case 1:
    transfert(ENTREE_STANDARD, SORTIE_STANDARD);
    break;
  case 2:
    entree = open(argv[1], O_RDONLY);
    transfert(entree, SORTIE_STANDARD);
    close(entree);
    break;
  case 3:
    entree = open(argv[1], O_RDONLY);
    sortie =
      open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0666);
    transfert(entree, sortie);
    close(entree);
    close(sortie);
    break;
  default:
    perror("Usage: copie [src [dest]]");
  };
  exit(1);
}

