#include #include #include #include #include #include #define MY_BUFFER_SIZE 1000 ssize_t myRead(int fd,char * buf,size_t count) { ssize_t nb; do { nb=read(fd,buf,count); } while((nb==-1)&& ((errno==EINTR)|| (errno==EAGAIN))); return(nb); } ssize_t myWrite(int fd,const char * buf,size_t count) { ssize_t nb; size_t remaining=count; const char * ptr=buf; do { nb=write(fd,ptr,remaining); if(nb>0) { remaining-=nb; ptr+=nb; } } while(remaining&&(nb==-1)&& ((errno==EINTR)|| (errno==EAGAIN))); return(nb==-1 ? -1 : (ssize_t)(count-remaining)); } int main(int argc,char ** argv) { int input, output, stop; char buffer[MY_BUFFER_SIZE]; if(argc<=2) { fprintf(stderr,"usage: %s input output\n",argv[0]); return(1); } input=open(argv[1],O_RDONLY); if(input==-1) { fprintf(stderr,"Can't open input file %s\n",argv[1]); return(1); } output=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644); if(output==-1) { close(input); fprintf(stderr,"Can't open output file %s\n",argv[2]); return(1); } stop=0; do { ssize_t nbR=myRead(input,buffer,MY_BUFFER_SIZE); switch(nbR) { case -1: fprintf(stderr,"Error while reading\n"); stop=1; break; case 0: /* end of file */ stop=1; break; default: { ssize_t nbW=myWrite(output,buffer,nbR); if(nbW==-1) { fprintf(stderr,"Error while writing\n"); stop=1; } } } } while(!stop); close(input); close(output); return(0); }