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

#define MAX 1024

int main(int argc, char* argv[]){
	int src, dest;
	int tube[2];
	int n, pid;
	char buf[MAX];

	if(argc!=3){
		perror("erreur nombre d'arguments");
		exit(1);
	}
	if (pipe(tube)<0) {
		perror ("erreur ouverture pipe");
		exit(1);
	}
	if ((pid=fork())<0){
		perror("erreur fork");
		exit(1);
	}

	if(pid==0){ //dans le fils
		if((dest=creat(argv[2],0666))<0){
			perror("erreur ouverture destination");
			exit(2);
		}

		if (close(tube[1])<0) exit(1);
		while((n=read(tube[0], buf, MAX))>0){
			if(write(dest,buf,n)<0){
				perror("erreur ecriture");
				exit(1);
			}
		}
		if (close(tube[0])<0) exit(1);
		if (close(dest)<0) exit(1);
	}
	else{ //dans le père
		if((src=open(argv[1],0))<0){
			perror("erreur ouverture source");
			exit(2);
		}

		if (close(tube[0])<0) exit(1);
		while((n=read(src, buf, MAX))>0){
			if(write(tube[1],buf,n)<0){
				perror("erreur ecriture");
				exit(1);
			}
		}
		if (close(tube[1])<0) exit(1);
		if (close(src)<0) exit(1);
		if (wait(&pid)<0) exit(1);
	}

	return 0;
}