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

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



Листинг 21

Блокирование файлов // Файл flock\flock.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define BYTE unsigned char #define WORD unsigned int extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int LogFile(char *, BYTE, WORD);
extern "C" int LockFileSet(WORD);
extern "C" void ReleaseFileSet(void);
extern "C" void ClearFileSet(void);
void main(void) { char MajorVersion=0; char MinorVersion=0; char Revision=0; char FilePath[255]; int ccode; printf("\n*FLOCK* (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; // Добавляем файл в набор ccode = LogFile(FilePath, 0, 0);
if(!ccode) printf("Файл %s добавлен к списку\n", FilePath);
else printf("Ошибка при добавлении %02.2X\n", ccode);
} // Блокируем набор файлов ccode = LockFileSet(0);
if(!ccode) printf("Файлы заблокированы\n");
else printf("Ошибка при блокировании " "файлов %02.2X\n", ccode);
printf("Для разблокирования файлов нажмите любую клавишу\n");
getch();
// Разблокируем набор файлов ReleaseFileSet();
// Удаляем набор файлов ClearFileSet();
}

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

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








Листинг 23

Проверка возможности получения // доступа к физическим записям файла // Файл recacc\recacc.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <dos.h>
#include <sys\stat.h>
#include <share.h>
#define BYTE unsigned char #define WORD unsigned int 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 FilePath[255]; int FileHandle; char Buff[80]; long RecordStartOffset; char msg[] = "PATCH!!!"; int ccode; unsigned count; printf("\n*RECACC* (C) Frolov A., 1993\n");
// Вводим имя файла и открываем его на запись и чтение printf("\nВведите путь к файлу:");
gets(FilePath);
strupr(FilePath);
if ((FileHandle = open(FilePath, O_RDWR | O_BINARY | O_DENYNONE, SH_DENYNONE)) == -1) { printf("Не могу открыть файл\n");
} // Задаем смещение в файле, начиная с которого // в файл будет записана строка "PATCH!!!" printf("\nВведите смещение начала записи:");
gets(Buff);
RecordStartOffset = atol(Buff);
// Позиционируем на начало записи lseek(FileHandle, RecordStartOffset, 0);
// Делаем попытку изменить содержимое записи ccode = _dos_write(FileHandle, msg, strlen(msg), &count);
if(!ccode) printf("Запись обновлена\n");
else printf("Ошибка при обновлении " "записи в файле: %02.2X\n", ccode);
// Закрываем файл close(FileHandle);
}

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








Листинг 24

Блокирование логических записей // Файл loglock\loglock.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define BYTE unsigned char #define WORD unsigned int extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int LogLogicalRecord(char *, BYTE, WORD);
extern "C" int LockLogicalRecordSet(WORD);
extern "C" void ReleaseLogicalRecordSet(void);
extern "C" void ClearLogicalRecordSet(void);
void main(void) { char MajorVersion=0; char MinorVersion=0; char Revision=0; char LogicalRecordName[100]; int ccode; printf("\n*LOGLOCK* (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(LogicalRecordName);
if(LogicalRecordName[0] == '-') break; // Добавляем логическую запись в набор ccode = LogLogicalRecord(LogicalRecordName, 0, 0);
if(!ccode) printf("Логическая запись %s добавлена к списку\n", LogicalRecordName);
else printf("Ошибка при добавлении %02.2X\n", ccode);
} // Блокируем набор логических записей ccode = LockLogicalRecordSet(0);
if(!ccode) printf("Логические записи заблокированы\n");
else printf("Ошибка при блокировании " "логических записей %02.2X\n", ccode);
printf("Для разблокирования логических записей " " нажмите любую клавишу\n");
getch();
// Разблокируем набор логических записей ReleaseLogicalRecordSet();
// Удаляем набор логических записей ClearLogicalRecordSet();
}

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








Листинг 25

Работа с семафорами // Файл semsign\semsign.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define BYTE unsigned char #define WORD unsigned int extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" int OpenSemaphore(char *, int, long *, WORD *);
extern "C" int CloseSemaphore(long);
extern "C" int ExamineSemaphore(long, int *, WORD *);
extern "C" int SignalSemaphore(long);
extern "C" int WaitOnSemaphore(long, WORD);
void main(void) { char MajorVersion=0; char MinorVersion=0; char Revision=0; int ccode; long SemaphoreHandle; WORD OpenCount; int SemaphoreValue; printf("\n*SEMSIGN* (C) Frolov A., 1993\n");
// Проверяем наличие сетевой оболочки asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision);
asm pop si if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n");
return; } // Открываем семафор с именем SEMLOCK ccode = OpenSemaphore("SEMLOCK", 1, &SemaphoreHandle, &OpenCount);
if(!ccode) { printf("Семафор SEMLOCK открыт\n");
printf("Handle = %ld, OpenCount = %d\n", SemaphoreHandle, OpenCount);
} else { printf("Ошибка при открытии семафора " "SEMLOCK %02.2X\n", ccode);
return; } // Определяем текущее состояние семафора ccode = ExamineSemaphore(SemaphoreHandle, &SemaphoreValue, &OpenCount);
if(!ccode) { printf("SemaphoreValue = %d\n", SemaphoreValue);
} else printf("Ошибка при получении состояния семафора " "SEMLOCK %02.2X\n", ccode);
// Запрашиваем доступ к критическому ресурсу, // ожидаем получение доступа в течение 20 секунд printf("Запрашиваем доступ к критическому ресурсу...\n");
ccode = WaitOnSemaphore(SemaphoreHandle, 18*20);
if(!ccode) { printf("Доступ к критическому ресурсу получен\n");
} else { printf("Ресурс заблокирован, ошибка %02.2X\n", ccode);
return; } // Теперь, если мы получили доступ к ресурсу, можно выполнять с ним // необходимые действия. В нашей программе мы ничего не делаем, // просто ожидаем, пока оператор не нажмет любую клавишу printf("Нажмите любую клавишу для освобожения ресурса\n");
getch();
// Освобождаем ресурс ccode = SignalSemaphore(SemaphoreHandle);
if(!ccode) { printf("Ресурс освобожден\n");
} else printf("Ошибка при освобождении ресурса %02.2X\n", ccode);
// Закрываем семафор ccode = CloseSemaphore(SemaphoreHandle);
if(!ccode) printf("Семафор SEMLOCK закрыт\n");
else printf("Ошибка при закрытии семафора " "SEMLOCK %02.2X\n", ccode);
}

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






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