// ===================================================
// Листинг 22. Блокирование физических записей файлов
//
// Файл physlock\physlock.cpp
//
// (C) A. Frolov, 1993
// ===================================================

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

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int LogPhysicalRecord(int, long, long, BYTE, WORD);
extern "C" int LockPhysicalRecordSet(BYTE, WORD);
extern "C" void ReleasePhysicalRecordSet(void);
extern "C" void ClearPhysicalRecordSet(void);


void main(void) {

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

	char FilePath[255];
	int  FileHandle;
	char Buff[80];
	long RecordStartOffset;
	long RecordLength;

	int ccode;

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

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

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

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

// Создаем набор записей файлов, которые будут заблокированы

	for(;;) {
		printf("\nВведите путь к файлу или '-':");
		gets(FilePath);

		strupr(FilePath);
		if(FilePath[0] == '-') break;

// Открываем файл, в котором мы будем блокировать
// физические записи

		if ((FileHandle = open(FilePath,
			  O_RDWR | O_BINARY | O_DENYNONE,
			  SH_DENYNONE)) == -1) {
			printf("Не могу открыть файл\n");
			continue;
		}

// Задаем начало и размер блокируемой области файла

		printf("\nВведите смещение начала записи:");
		gets(Buff);
		RecordStartOffset = atol(Buff);

		printf("\nВведите размер записи:");
		gets(Buff);
		RecordLength = atol(Buff);

// Добавляем запись в набор

		ccode = LogPhysicalRecord(FileHandle,
			RecordStartOffset, RecordLength, 0, 0);

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

// Блокируем набор файлов

	ccode = LockPhysicalRecordSet(0, 0);

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

	printf("Для разблокирования записей "
		 "файлов нажмите любую клавишу\n");
	getch();

// Разблокируем набор файлов

	ReleasePhysicalRecordSet();

// Удаляем набор файлов

	ClearPhysicalRecordSet();

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

	close(FileHandle);
}

