/* ECP: FILEname=fig13_11.c */ /* 1*/ /* Copy From SrcFile To DestFile */ /* 2*/ /* Return Number Of Characters Copied, -1 For Errors */ /* 3*/ #include /* 4*/ #include /* 5*/ #include /* 6*/ #include /* 7*/ #include /* 8*/ #include /* 9*/ #define BufSize 8192 /*10*/ long int /*11*/ Copy( const char *DestFile, const char *SrcFile ) /*12*/ { /*13*/ long int CharsRead, CharsCounted = 0; /*14*/ int SrcDesc, DestDesc; /*15*/ char Buffer[ BufSize ]; /*16*/ const CreateFlag = O_WRONLY | O_CREAT | O_TRUNC; /*17*/ const Mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /*18*/ if( strcmp( SrcFile, DestFile ) == 0 ) /*19*/ { /*20*/ fprintf( stderr, "Can not copy to self\n" ); /*21*/ return -1L; /*22*/ } /*23*/ if( ( SrcDesc = open( SrcFile, O_RDONLY ) ) < 0 ) /*24*/ { /*25*/ perror( SrcFile ); /*26*/ return -1L; /*27*/ } /*28*/ if( ( DestDesc = open( DestFile, CreateFlag, Mode ) ) < 0 ) /*29*/ { /*30*/ perror( DestFile ); /*31*/ return -1L; /*32*/ } /*33*/ while( ( CharsRead = read( SrcDesc, Buffer, BufSize ) ) > 0 ) /*34*/ if( write( DestDesc, Buffer, CharsRead ) < CharsRead ) /*35*/ { /*36*/ perror( DestFile ); /*37*/ break; /*38*/ } /*39*/ else /*40*/ CharsCounted += CharsRead; /*41*/ close( SrcDesc ); close( DestDesc ); /*42*/ return CharsCounted; /*43*/ }