// ===================================================
// Листинг 19. Копирование файлов, расположенных на
//             файл-сервере
//
// Файл fcopy\fcopy.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include <sys\stat.h>

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int FileServerFileCopy(int, int, long, long, long, long*);

void main(int argc, char *argv[]) {

	char MajorVersion=0;
	char MinorVersion=0;
	char Revision=0;

	int FromHandle;
	int ToHandle;
	long BytesCopied;
	int ccode;

	printf("\n*FCOPY* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

	asm push si
	GetNetWareShellVersion(&MajorVersion,
			&MinorVersion, &Revision);
	asm pop si

	if(MajorVersion == 0) {
		printf("\nОболочка NetWare не загружена\n");
		return;
	}

// Необходимо задать путь к каталогу, удаляемые
// и добавляемые права доступа

	if(argc < 3) {
		printf("Укажите пути к копируемым файлам, "
			"\nнапример: fcopy f:\users\my.dat f:\us\my.dat");
		return;
	}

// Параметры должны быть заданы заглавными буквами

	strupr(argv[1]);
	strupr(argv[2]);

// Открываем входной файл в двоичном режиме для чтения

	if ((FromHandle = open(argv[1], O_RDONLY | O_BINARY)) == -1) {
		printf("Не могу открыть исходный файл\n");
		return;
	}

// Открываем выходной файл в двоичном режиме для
// чтения и записи, разрешаем создание файла, если
// его еще нет, разрешаем запись в файл

	if ((ToHandle = open(argv[2],
		O_CREAT | O_RDWR | O_BINARY, S_IWRITE)) == -1) {
		printf("Не могу открыть выходной файл\n");
		return;
	}

// Копируем файл, длину файла определяем при помощи
// функции filelength()

	ccode = FileServerFileCopy(FromHandle, ToHandle,
		 0, 0, filelength(FromHandle), &BytesCopied);

	if(!ccode)
		printf("Файл скопирован\n");
	else
		printf("Ошибка %02.2X\n", ccode);

// Закрываем файлы

	close(FromHandle);
	close(ToHandle);
}
