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

#define TAM_BUFFER 1000

int main(int argc, char *argv[]){
  int descArquivoOrigem, descArquivoDestino, nBytesLidos, nBytesGravados;
  char Buffer[TAM_BUFFER];

  if(argc!=3){
  	printf("São necessário 3 parâmetros: cpy arqOrigem arqDestino\n");
	exit(1);
  }
  if((descArquivoOrigem=open(argv[1],O_RDONLY))<0){ //se tudo correu bem o descritor será maior que zero, se -1 deu erro
      printf("Erro na abertura do arquivo origem %s\n", argv[1]);
      fprintf(stderr, "Erro: %s\n", strerror(errno));
      exit(1);
  }
  //else printf("Abertura Origem ok..\n");

  descArquivoDestino=open(argv[2],O_WRONLY);//tenta abrir, se existe abre
  if (descArquivoDestino > 0){ //SUGESTAO:Criar um menu perguntando se deseja sobrepor o existente
     printf("Arquivo destino já existente\n");
     close(descArquivoDestino);
     exit(1);     
  }	  
  else{

      if((descArquivoDestino=open(argv[2],O_CREAT | O_WRONLY, 0660))<0){ // 660 - rw- rw- ---
         printf("Erro na abertura do arquivo destino %s\n", argv[2]);
         close(descArquivoOrigem);
         fprintf(stderr, "Erro: %s\n", strerror(errno));
         exit(1);
      }
      //else printf("Abertura Destino ok..\n");

  }//else
  while((nBytesLidos=read(descArquivoOrigem, Buffer, TAM_BUFFER))>0){
      nBytesGravados=write(descArquivoDestino, Buffer, nBytesLidos);
      //printf("Bytes lidos: %d, Bytes gravados: %d\n",nBytesLidos,nBytesGravados);
      if(nBytesLidos!=nBytesGravados){
	printf("Erro na gravação do arquivo %s\n",argv[2]);      
	fprintf(stderr, "Erro: %s\n", strerror(errno));
	close(descArquivoDestino);
	close(descArquivoOrigem);
	exit(1);
      }
  } //while
  printf("Copia ocorrida com sucesso...\n");
  close(descArquivoDestino); 
  close(descArquivoOrigem);
  return 0;
}

