Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

       

Программа PHYSLOCK


Для иллюстрации блокирования физических записей файла мы составили две программы - PHYSLOCK (листинг 22) и RECACC (листинг 23). Первая программа вводит с консоли имена файлов, смещения и размеры записей.

Все введенные файлы открываются, так как для добавления записей нужен индекс файлов. Затем записи блокируются функцией LockPhysicalRecordSet(), после чего программа переходит в состояние ожидания и находится в нем до тех пор, пока оператор не нажмет любую клавишу. В это время записи заблокированы. С помощью программы RECACC вы можете попытаться выполнить запись в заблокированные или свободные записи.

Когда оператор нажмет клавишу, программа PHYSLOCK разблокирует все записи и удалит набор записей.

// =================================================== // Листинг 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); }


Содержание раздела