#include
#define ff _f_first
#define open _topen
#define close _tclose
#define lseek _tlseek
#define read _tread
#define write _twrite
#define create _tcreat
#define unlink _tunlink
extern int _topen( char*, int);
extern int _tclose( int );
extern long _tlseek( int, long, int);
extern int _tread( int, char*, int);
extern int _twrite( int, char*, int);
extern int _tcreat( char*, int);
extern int _f_first(char *);
extern int _tunlink(char *);
#define O_WRONLY 0x0001 /* open for writing only */
#define O_RDWR 0x0002 /* open for reading and writing */
#define O_APPEND 0x0008 /* writes done at eof */
#define O_RDONLY 0x0000 /* open for reading only */
#define O_BINARY 0x8000 /* file mode is binary (untranslated) */
#define O_TEXT 0x4000 /* file mode is text (translated) */
#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open and truncate */
#define O_EXCL 0x0400 /* open only if file doesn't already exist */
#define SH_COMPAT 0x00 /* compatibility mode */
#define SH_DENYRW 0x10 /* deny read/write mode */
#define SH_DENYWR 0x20 /* deny write mode */
#define SH_DENYRD 0x30 /* deny read mode */
#define SH_DENYNO 0x40 /* deny none mode */
#define S_IFMT 0170000 /* file type mask */
#define S_IFDIR 0040000 /* directory */
#define S_IFCHR 0020000 /* character special */
#define S_IFREG 0100000 /* regular */
#define S_IREAD 0000400 /* read permission, owner */
#define S_IWRITE 0000200 /* write permission, owner */
#define S_IEXEC 0000100 /* execute/search permission, owner */
#define BUFFSIZ 1024
CLIPPER b_fcopy()
{
int inHandle, outHandle, bytesRead, bytesWritten;
int isTarget = 0;
char buff[BUFFSIZ];
char *source = _parc(1);
char *target = _parc(2);
if( !ISCHAR(1) || !ISCHAR(2) ){
_retl(0);
return;
}
if( !ff(source) ){
_retl(0);
return;
}
if( ff(target) ){
isTarget = 1;
}
inHandle = open(source, O_BINARY | O_RDONLY | SH_DENYNO);
if( inHandle == -1 ){
_retl(0);
return;
}
if( isTarget ){
unlink(target);
outHandle = create(target, O_BINARY | S_IFREG);
}
else{
outHandle = create(target, O_BINARY | S_IFREG);
}
if( outHandle == -1 ){
close(inHandle);
_retl(0);
return;
}
while( (bytesRead = read(inHandle, buff, BUFFSIZ)) != 0 ){
if( (bytesWritten = write(outHandle, buff, bytesRead)) == -1 ){
close(inHandle);
close(outHandle);
unlink(target);
_retl(0);
return;
}
}
close(inHandle);
close(outHandle);
_retl(1);
}